[英]Decrypt AES-generated hex from aes-js(Javascript) to pycryptodome(Python)
[英]How to decrypt a ciphertext in Go which is encrypted in vuejs using aes-js package
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{
有人可以幫助我並告訴我我在上面的代碼中遺漏了什么。 先感謝您!
這兩個代碼中都有一些缺陷阻止了執行。 但是,由於兩者都在您的系統上運行,因此這些似乎是復制/粘貼錯誤:
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)
即,如果使用的明文還沒有這個長度,則該錯誤需要顯式填充,盡管流密碼實際上不需要填充。
在這些問題的背景下,您可能想要使用不同的模式或不同的庫。
除了:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.