为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中的确定性 RSA 加密 - 如何在多次加密下为给定消息获得相同的结果

Golang 中的确定性 RSA 加密 - 如何在多次加密下为给定消息获得相同的结果

Go
波斯汪 2022-12-05 17:19:43
对于下面的RSA加密代码,每次对同一条消息进行加密时,结果都会不同。我发现这是由于根据doc使它更安全rand.Reader的功能。但是每次进行 RSA 加密时,我都希望相同的消息得到相同的结果。如何使用 Golang 做到这一点?有一个类似的问题,但似乎答案与如何实现这一目标无关。谢谢!rsa.EncryptOAEPpackage mainimport (    "crypto"    "crypto/rand"    "crypto/rsa"    "crypto/sha256"    "fmt")func main() {    privateKey, err := rsa.GenerateKey(rand.Reader, 1024)    if err != nil {        panic(err)    }    publicKey := privateKey.PublicKey      message := "super secret message"    encryptedBytes, err := rsa.EncryptOAEP(        sha256.New(),        rand.Reader,        &publicKey,        []byte(message),        nil)    if err != nil {        panic(err)    }    fmt.Println("encrypted bytes: ", encryptedBytes)   }更新:我想做确定性 RSA,因为在使用需要确定性输出的 Hyperledger Fabric 链代码(区块链智能合约)时,我想要确定性加密结果。谢谢大家的警告。那么我想我应该关注如何在链代码中启用这些加密算法。相关问题供后来者参考是否有帮助:)
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

正如您所读到的,这种方法破坏了算法的非常重要的安全特性,并且绝不能用于保护任何类型的实时系统。但是,对于某些类型的测试和开发,它可能很有用。我会假设这就是你的意思。


关键是它的熵rsa.EncryptOAEP接受任意io.Reader值。它不要求这是一个rand.Reader. 如果您不关心系统的安全性,可以随心所欲。例如,您可以构建一个永远只返回零的“零读取器”:


type zeroReader struct{}

func (z zeroReader) Read(p []byte) (n int, err error) {

    for i, _ := range p {

        p[i] = 0

    }

    n = len(p)

    return

}

这样,您就可以传递zeroReader{}熵:


// !!! The security of this call is completely broken !!!

// !!! It must never be used on live data             !!!

encryptedBytes, err := rsa.EncryptOAEP(

    sha256.New(),

    zeroReader{}, // !!! I am intentionally breaking the security here !!!

    &publicKey,

    []byte(message),

    nil)

如果您确实打算将它用于任何类型的实时数据,那么您必须重新设计您的系统以不需要它。就像您链接的问题一样,人们经常尝试这样做是因为他们误解了 RSA。不要那样做。


查看完整回答
反对 回复 2022-12-05
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信