为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 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 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信