對于下面的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 鏈碼(區塊鏈智能合約)時,我想要確定性加密結果。謝謝大家的警告。然后我應該專注于如何在鏈碼中啟用這些加密演算法。如果有幫助,請為后來者提供相關資訊:)
uj5u.com熱心網友回復:
正如您所讀到的,這種方法破壞了演算法非常重要的安全特性,并且絕不能用于保護任何型別的實時系統。但是,對于某些型別的測驗和開發,它可能很有用。我會假設這就是你的意思。
關鍵是它的熵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。不要那樣做。
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/465249.html
