亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號