Encryption 为什么crypto/rsa库中的Go函数EncryptOAEP需要随机io.Reader?

Encryption 为什么crypto/rsa库中的Go函数EncryptOAEP需要随机io.Reader?,encryption,tcp,go,cryptography,rsa,Encryption,Tcp,Go,Cryptography,Rsa,我正在编写一个文件服务器,它在客户端加密数据,通过TCP发送数据,并使用非对称RSA-OAEP加密在服务器端解密数据。我一直在尝试使用两个主要函数,每个函数使用以下参数: 每个都需要一个随机io.Reader,并使用crypto/rand提供的rand.Reader。但是,每当我在客户端使用rand.Reader对消息进行加密时,该消息在服务器端永远不会正确解密,服务器端有一个单独的rand.Reader实例 随机io.Reader的用途是什么 如何确保服务器正确传输和解密加密邮件?我是否还需要

我正在编写一个文件服务器,它在客户端加密数据,通过TCP发送数据,并使用非对称RSA-OAEP加密在服务器端解密数据。我一直在尝试使用两个主要函数,每个函数使用以下参数:

每个都需要一个
随机io.Reader
,并使用crypto/rand提供的
rand.Reader
。但是,每当我在客户端使用
rand.Reader
对消息进行加密时,该消息在服务器端永远不会正确解密,服务器端有一个单独的
rand.Reader
实例

  • 随机io.Reader
    的用途是什么
  • 如何确保服务器正确传输和解密加密邮件?我是否还需要将有关客户端使用的
    rand.Reader
    的一些信息传输到服务器,以便正确解密消息
  • 作为一个基础,我设法创建了一个小型的端到端解密程序。 从您提供的信息很难判断错误在哪里,但我希望阅读此程序您可以自己找到错误。可能您不需要在DecryptOAEP中提供读取器

    作为一个基础,我设法创建了一个小型的端到端解密程序。 从您提供的信息很难判断错误在哪里,但我希望阅读此程序您可以自己找到错误。可能您不需要在DecryptOAEP中提供读取器


    需要随机性源的加密功能非常明显,OAEP被定义为随机填充(否则加密相同的明文将始终导致相同的密文,泄漏信息)。解密过程中的随机性仅用于对定时攻击的遮蔽/保护,并且对结果没有任何影响。在不同的注释中,考虑使用TLS而不是建立自己的协议。有很多细节可能出错,包括服务器身份验证、转发保密、重播攻击、填充预言符等等。您可以发布更多的代码吗?我怀疑真正的错误完全是另一回事。也许是编码相关的东西,或者将TCP作为一个消息序列而不是流来处理,这是两个常见的错误。若要自行调试,请转储从
    EncryptOAEP
    中获取的原始字节以及传递给
    DecryptOAEP
    的原始字节,以查看它们的长度或内容是否不同。需要随机性源的加密函数非常明显,OAEP被定义为随机填充(否则,加密相同的明文将始终导致相同的密文,泄漏信息)解密过程中的随机性仅用于对定时攻击的盲/保护,对结果不产生影响。在不同的注释中,考虑使用TLS而不是建立自己的协议。有很多细节出错,包括服务器认证、向前保密、重放攻击、填充谕言…………关于你的代码?我怀疑实际的错误完全是另一回事。也许是编码相关的错误,或者把TCP当作一个消息序列而不是流,举两个常见的错误。要自己调试它,请转储从
    EncryptOAEP
    中获得的原始字节,以及传递给
    DecryptOAEP
    的原始字节,以查看y的长度或内容不同。根据文档,您不需要向
    DecryptOAEP
    提供
    random
    ,但您应该这样做以防止侧通道攻击。根据文档,您不需要向
    DecryptOAEP
    提供
    random
    ,但您应该这样做以防止侧通道攻击。
    EncryptOAEP(hash hash.Hash, random io.Reader, pub *PublicKey, msg []byte, label []byte) (out []byte, err error)
    DecryptOAEP(hash hash.Hash, random io.Reader, priv *PrivateKey, ciphertext []byte, label []byte) (msg []byte, err error)
    
    package main
    
    import (
        "bytes"
        "crypto/rsa"
        "crypto/sha1"
        "log"
        "math/big"
    )
    
    func main() {
        sha1 := sha1.New()
        n := new(big.Int)
        d := new(big.Int)
    
        rsa_modulus := "a8b3b284af8eb50b387034a860f146c4919f318763cd6c5598c8ae4811a1e0abc4c7e0b082d693a5e7fced675cf4668512772c0cbc64a742c6c630f533c8cc72f62ae833c40bf25842e984bb78bdbf97c0107d55bdb662f5c4e0fab9845cb5148ef7392dd3aaff93ae1e6b667bb3d4247616d4f5ba10d4cfd226de88d39f16fb"
        rsa_d := "53339cfdb79fc8466a655c7316aca85c55fd8f6dd898fdaf119517ef4f52e8fd8e258df93fee180fa0e4ab29693cd83b152a553d4ac4d1812b8b9fa5af0e7f55fe7304df41570926f3311f15c4d65a732c483116ee3d3d2d0af3549ad9bf7cbfb78ad884f84d5beb04724dc7369b31def37d0cf539e9cfcdd3de653729ead5d1"
    
        n.SetString(rsa_modulus, 16)
        d.SetString(rsa_d, 16)
        public := rsa.PublicKey{n, 65537}
        d.SetString(rsa_d, 16)
        private := new(rsa.PrivateKey)
        private.PublicKey = public
        private.D = d
    
        seed := []byte{0x18, 0xb7, 0x76, 0xea, 0x21, 0x06, 0x9d, 0x69,
            0x77, 0x6a, 0x33, 0xe9, 0x6b, 0xad, 0x48, 0xe1, 0xdd,
            0xa0, 0xa5, 0xef,
        }
        randomSource := bytes.NewReader(seed)
    
        in := []byte("Hello World")
    
        encrypted, err := rsa.EncryptOAEP(sha1, randomSource, &public, in, nil)
        if err != nil {
            log.Println("error: %s", err)
        }
    
        plain, err := rsa.DecryptOAEP(sha1, nil, private, encrypted, nil)
        if err != nil {
            log.Println("error: %s", err)
        }
    
        log.Println(string(plain))
    }