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

标签 encryption tcp go cryptography rsa

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

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)

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

  1. random io.Reader 的用途是什么?
  2. 如何确保服务器正确传输和解密加密消息?我是否还需要将客户端使用的 rand.Reader 的一些信息传输到服务器,以便正确解密消息?

最佳答案

使用rsa_test.go作为基础,我设法创建了一个小型的端到端解密程序。 从你提供的信息很难判断错误出在哪里,但我希望阅读这个程序你可以自己找到错误。也许您不需要在 DecryptOAEP 中提供 Reader。

http://play.golang.org/p/7VVCHJOB7R

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))
}

关于encryption - 为什么 crypto/rsa 库中的 Go 函数 EncryptOAEP 需要随机 io.Reader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24311575/

相关文章:

azure - SQL Azure 始终加密列 - 加密时如何更改列的大小?

java - AES 加密 badPadding

java - 使用 Amazon KMS 上传带有服务器端加密的 S3 对象时出错

go - 字段上未定义的验证函数 "xxx"

go - 在 Go 中使用 fork 包导入

encryption - 我的 PyCrypto 实现对于我的目的来说安全吗?

c - 套接字 TCP 2 路连接

qt - 如何使用QTcpSocket进行小数据包的高频发送?

linux - BASH - 如何在需要时通过 TCP 端口访问日志文件?

linux - Go 代码构建错误,标准包中的非标准导入 "fmt",导入周期不允许