2 回答

TA贡献1818条经验 获得超3个赞
Go 代码生成一个随机 IV,并在 CBC 模式下使用 AES-256 执行加密,并带有 PKCS7 填充。IV 与密文 连接,结果是 Base64 编码。密钥是通过 Utf8 编码从给定字符串生成的。IV|ciphertext
请注意,Go 代码
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
panic(err)
}
使用随机值初始化 IV。因此,IV的输出应该在之后。由于它是在发布代码中打印的,因此显示零IV,但与使用的IV不对应。
顺便说一句,对于解密,显式输出不是必需的,因为如前所述,代码连接IV和密文。
在加密JS代码中,使用零IV,可能是因为Go代码中的输出不正确。相反,IV和密文必须分开。
此外,密钥作为字符串传递。这是不正确的,因为 CryptoJS 将字符串解释为密码并执行基于密码的密钥派生。相反,密钥必须作为 .
由于密钥是 Go 代码中 Utf8 编码的,因此必须应用 Utf8 编码器(另请参阅其他答案)。WordArray
CBC 和 PKCS7 填充是默认值,可以指定,但不需要指定。
以下加密 JS 代码中的密文是使用 Go 代码生成的:
// Separate IV and ciphertext
var data = CryptoJS.enc.Base64.parse("WL7oDghTeEbjZ6QPeb/TGuDGijktQ4PZS7+wd0Ayu8Y="); // from Go code
var iv = CryptoJS.lib.WordArray.create(data.words.slice(0, 4)); // first 4 words = 16 bytes
var ct = CryptoJS.lib.WordArray.create(data.words.slice(4)); // rest
// Decrypt
var decrypted = CryptoJS.AES.decrypt(
{ciphertext: ct}, // alternatively as Base64 encoded string
CryptoJS.enc.Utf8.parse("28cEVB4BUE7GKNwjuRhN3szK5E3!&q*y"), // Utf8 encode key string
{iv:iv}
);
console.log("Decrypted: ", decrypted.toString(CryptoJS.enc.Utf8)); // Decrypted: Test
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
并将密文正确解密为 。Test

TA贡献1853条经验 获得超6个赞
试试这个,确保你使用相同的密钥进行加密和解密
//The get method is use for decrypt the value.
get(keys, value){
var key = CryptoJS.enc.Utf8.parse(keys);
var iv = CryptoJS.enc.Utf8.parse(keys);
var decrypted = CryptoJS.AES.decrypt(value, key, {
keySize: 128 / 8,
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
- 2 回答
- 0 关注
- 87 浏览
添加回答
举报