当前位置: 首页 > 知识库问答 >
问题:

AES-256 CBC加密在Ruby/PHP中成功,但使用CryptoJS解密失败

孟浩然
2023-03-14
<?php
openssl_encrypt(
  'Hello!', 'aes-256-cbc', '1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF', 0, '1234567890ABCDEF1234567890ABCDEF'
); // => 'BAd5fmmMTvRE4Ohvf3GpCw=='
ruby_cipher = SymmetricEncryption::Cipher.new(key: "1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF", iv: "1234567890ABCDEF1234567890ABCDEF", cipher_name: 'aes-256-cbc')
ruby_cipher.encrypt("Hello!") # => "BAd5fmmMTvRE4Ohvf3GpCw=="

在我的jsfiddle中查看我失败的尝试或在这里查看:

var key            = CryptoJS.enc.Hex.parse("1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF");
var iv             = CryptoJS.enc.Hex.parse"1234567890ABCDEF1234567890ABCDEF");

var ruby_encrypted = "BAd5fmmMTvRE4Ohvf3GpCw==";                            // Output from the Ruby encryption
var js_encrypted   = CryptoJS.AES.encrypt("Hello!", key, { iv: iv });       // Test to confirm that CryptoJS can decrypt its own encrypted

var ruby_decrypted = CryptoJS.AES.decrypt(ruby_encrypted, key, { iv: iv }); // Object { words: Array[4], sigBytes: -129 }
var js_decrypted   = CryptoJS.AES.decrypt(js_encrypted, key, { iv: iv });   // Object { words: Array[4], sigBytes: 6 }

console.log(ruby_decrypted.toString(CryptoJS.enc.Utf8));                    //
console.log(js_decrypted.toString(CryptoJS.enc.Utf8));                      // Hello!

知道为什么解密失败了吗?

共有1个答案

那正初
2023-03-14

PHP和Ruby将密钥和IV作为二进制字符串。他们不会假设它是十六进制编码的,这意味着只有64个字符的前32个字符将被使用。OpenSSL静默地只使用它所需要的字节数,并且不会抛出错误(在这种情况下它应该抛出错误)。

您可能希望在CryptoJS中使用这样的内容:

var key    = CryptoJS.enc.Utf8.parse("1234567890ABCDEF1234567890ABCDEF");
var iv     = CryptoJS.enc.Utf8.parse("1234567890ABCDEF");

所以,虽然这个密钥中有256位,但安全性实际上只有128位,因为每个字符在十六进制编码的字符串中只有4位。

 类似资料:
  • 我之所以问这个问题,是因为两天来我读了很多关于crypto AES加密的帖子,就在我以为我得到了它的时候,我意识到我根本没有得到它。 这个帖子是最接近我的问题,我有完全相同的问题,但它没有得到回答: CryptoJS AES加密与JAVA AES解密值不匹配 我得到的是已经加密的字符串(我得到的代码只是为了看看他们是怎么做的),所以修改加密方式不是一个选项。这就是为什么所有类似的问题对我来说都不是

  • 注意:这只是为个人使用和学习,我不是试图滚动我自己的加密为公众使用。 我需要AES256加密一个字符串,但是我当前的尝试在十六进制解码时最终得到了一个类似server side的字符串。当十六进制解码时,它应该是一个有效的utf8 base64字符串,然后可以将其解码为原始字符串。这与这里提供的解决方案类似,但是salt并不是实际问题(尽管答案被接受),并且我无法在使用之前通过十六进制解码iv来抑

  • 客户端: 服务器端:

  • 我有一个问题解密文本,它是在Go lang加密,使用CryptoJS。 下面是Go代码:https://play.golang.org/p/xcbl48t_in 这里是JS代码:http://jsfidle.net/ltkxm64n/ 这两种方法都能很好地加密和解密,但是当我将base64密文从GO复制到JS(或者反过来)时,它就不起作用了。我还注意到js输出的第一部分与Go输出相同,但在js输出

  • 在用于aes加密和解密的python脚本中 但是相同的iv、消息和密钥在python和js中产生不同的加密消息, JavaScript与python解密兼容的问题是什么? 两者都使用了aes.mode_cbc,并且假设两者都使用了Pkcs7填充。硬编码iv现在是随机生成的

  • 我正在尝试使用Javascript和CryptoJS复制Java应用程序中使用的加密。我不太确定应该如何复制SecretKeySpec,因为CryptoJS似乎需要一个字符串作为密钥。 下面是我需要在JS中复制的Java加密代码: 到目前为止,我的JS代码: 此外,密码的最终输出是一个加密的字节数组。CryptoJS的最终输出似乎是一个带有密文的对象。有没有办法以字节数组的形式获取输出? 我现在唯