登录
首页 >  Golang >  Go问答

Golang 中的确定性 RSA 加密 - 如何实现多次加密产生一致结果

来源:stackoverflow

时间:2024-03-08 21:15:27 213浏览 收藏

本篇文章向大家介绍《Golang 中的确定性 RSA 加密 - 如何实现多次加密产生一致结果》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

对于下面的rsa加密代码,每次对同一条消息进行加密时,结果都会不同。我发现这是由于 rsa.encryptoaep 函数中的 rand.reader 根据文档使其更加安全。但每次进行 rsa 加密时,我都希望同一条消息得到相同的结果。如何使用 golang 来做到这一点?有一个类似的问题,但似乎答案不是关于如何实现这一目标。谢谢!

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


正确答案


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

关键是 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。不要这样做。

Playground

今天关于《Golang 中的确定性 RSA 加密 - 如何实现多次加密产生一致结果》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>