猿问

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

对于下面的RSA加密代码,每次对同一条消息进行加密时,结果都会不同。我发现这是由于根据doc使它更安全rand.Reader的功能。但是每次进行 RSA 加密时,我都希望相同的消息得到相同的结果。如何使用 Golang 做到这一点?有一个类似的问题,但似乎答案与如何实现这一目标无关。谢谢!rsa.EncryptOAEP


package main


import (

    "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 链代码(区块链智能合约)时,我想要确定性加密结果。谢谢大家的警告。那么我想我应该关注如何在链代码中启用这些加密算法。相关问题供后来者参考是否有帮助:)


波斯汪
浏览 158回答 1
1回答

一只萌萌小番薯

正如您所读到的,这种方法破坏了算法的非常重要的安全特性,并且绝不能用于保护任何类型的实时系统。但是,对于某些类型的测试和开发,它可能很有用。我会假设这就是你的意思。关键是它的熵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。不要那样做。
随时随地看视频慕课网APP

相关分类

Go
我要回答