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

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{�


有人可以帮助我并告诉我上面的代码中缺少什么。先感谢您!


慕勒3428872
浏览 210回答 1
1回答

郎朗坤

两个代码中都有几个缺陷会阻止执行。但是,由于两者都在您的系统上运行,因此这些似乎是复制/粘贴错误:钥匙太短了。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]。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go