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

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

如何在 Go 中解密使用 aes-js 包在 vuejs 中加密的密文

如何在 Go 中解密使用 aes-js 包在 vuejs 中加密的密文

Go
慕勒3428872 2022-04-26 14:35:44
Vuejs 中的代碼 -var message = "Hello World"var keyBytes = aesjs.utils.utf8.toBytes("akey123")var iv = CryptoJS.lib.WordArray.random(8).toString()var ivBytes =  aesjs.utils.utf8.toBytes(iv)var messageBytes = aesjs.utils.utf8.toBytes(message);var aesCfb = new aesjs.ModeOfOperation.cfb(keyBytes, ivBytes);var encryptedBytes = aesCfb.encrypt(messageBytes);var encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes);我發送給 GO 的數據 -{"iv": iv, "cipher": encryptedHex}GO中的代碼func DecryptCipher(iv, cipher string) {    key := []byte("akey123")    iv := []byte(iv)    cipherText, _ := hex.DecodeString(cipher)    block, err := aes.NewCipher(key)    if err != nil {        log.Println(err)    }    cfb := cipher.NewCFBDecrypter(block, iv)    cfb.XORKeyStream(cipherText, cipherText)    fmt.Println("data", string(cipherText))}預期輸出:“Hello World”實際輸出:@?Sa 1???Ig{?有人可以幫助我并告訴我上面的代碼中缺少什么。先感謝您!
查看完整描述

1 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

兩個代碼中都有幾個缺陷會阻止執行。但是,由于兩者都在您的系統上運行,因此這些似乎是復制/粘貼錯誤:

  • 鑰匙太短了。AES 要求密鑰大小為 16、24 或 32 字節。

  • Go 代碼中存在關于iv和的命名沖突cipher

在這些修復之后,程序被執行,但解密失敗。問題是由不同的 CFB 變體引起的:在 aes-js-code 中使用 CFB8,在 Go-code 中使用 CFB128。這里的數字表示移位寄存器[1]中移位的位數。

Go支持 CFB128,至少無需進行更深入的修改[2] [3]。

aes-js 默認使用 CFB8。但是,也可以使用 cfb 構造函數的第三個參數顯式定義 CFB 變體。使用[4]可以更改 CFB128 :

var segmentSize = 16;
var aesCfb = new aesjs.ModeOfOperation.cfb(keyBytes, ivBytes, segmentSize);

請注意,該值必須以字節為單位指定,即 1 對應 CFB8,16 對應 CFB128。

CFB是一種流密碼,因此可以對任意長度的明文進行加密而無需填充,并且密文的長度等于明文的長度[5]。不幸的是,aes-js [6]中似乎存在一個錯誤,它要求明文的長度是段大小的整數倍,即在 CFB128 的情況下為 16 個字節。否則,將顯示以下錯誤消息:

invalid plaintext size (must be segmentSize bytes)

即,如果使用的明文還沒有這個長度,則該錯誤需要顯式填充,盡管流密碼實際上不需要填充。

在這些問題的背景下,您可能想要使用不同的模式或不同的庫。

除了:

  • IV 不是問題的原因:在當前示例中,CryptoJS.lib.WordArray.random(8)使用WordArray隨機 8 個字節創建并編碼為長度為 16 個字節的十六進制字符串,使用toString(). 這個十六進制字符串是 Utf8 編碼的,因此在兩個代碼中是相同的。盡管如此,評論中關于IV的評論當然是正確的。

  • aes-js 錯誤可能與過時的 Python 庫PyCrypto中的相同錯誤有關,后者已在后續PyCryptodome [7]中修復。

  • [8]中討論了 CFB 模式,第二個答案側重于不同的 CFB 變體[9]。


查看完整回答
反對 回復 2022-04-26
  • 1 回答
  • 0 關注
  • 245 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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