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]中修復。
- 1 回答
- 0 關注
- 245 瀏覽
添加回答
舉報