【发布时间】:2017-01-13 19:49:21
【问题描述】:
所以,我有 ruby 的加密和解密方法,它们可以很好地工作 ruby。我按照this question (How to decrypt message with CryptoJS AES. I have a working Ruby example) 的回答,但它返回一个空字符串。
Ruby 代码
def load_vars
@key = "2e35f242a46d67eeb74aabc37d5e5d05"
@algorithm = "aes-128-cbc"
end
def encryption(data)
begin
key = @key
aes = OpenSSL::Cipher.new(@algorithm)
aes.encrypt()
aes.key = key
iv_value = aes.random_iv
aes.iv = iv_value
crypt = aes.update(data) + aes.final()
crypt_string = (Base64.encode64(iv_value + crypt))
return crypt_string
end
end
def decryption(data)
begin
key = @key
aes = OpenSSL::Cipher.new(@algorithm)
iv_value = Base64.decode64(data)[0...16]
data_value = Base64.decode64(data)[16..-1]
aes.decrypt
aes.key = @key
aes.iv = iv_value
results = aes.update(data_value) + aes.final
return results
end
end
HTML JSFIDDLE
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
<script>
data = "wlkAKa4ps+Xizx4VIdUSp43yfQvOmt9FNlVTQ1ANsCU=\n"; // The data received from the ruby encryption method
key = "2e35f242a46d67eeb74aabc37d5e5d05";
// Decode the base64 data so we can separate iv and crypt text.
var rawData = atob(data);
var iv = rawData.substring(0,16);
var crypttext = rawData.substring(16);
// Decrypt...
var plaintextArray = CryptoJS.AES.decrypt(
{ ciphertext: CryptoJS.enc.Latin1.parse(crypttext) },
CryptoJS.enc.Hex.parse(key),
{ iv: CryptoJS.enc.Latin1.parse(iv) }
);
console.log(CryptoJS.enc.Latin1.stringify(plaintextArray));
</script>
【问题讨论】:
-
您的 javascript 代码是正确的,因为它适用于链接的
data值,因此问题出在 Ruby 代码中。我认为问题出在key参数中。加密时,您直接传递十六进制,但您应该提供解码后的值。你可以试试aes.key = key.scan(/../).collect{ |x| x.hex }.pack('c*')(从你的链接中提取)。恐怕我不能更具体,因为我不知道 Ruby -
能否提供生成加密数据的原始(明文)数据:
data = "wlkAKa4ps+Xizx4VIdUSp43yfQvOmt9FNlVTQ1ANsCU=\n";?有了原始数据,我们可以实现生成它的加密方法,然后从那里调试。 -
@SuthanBala,您是否尝试过使用我提供的将 HEX 密钥转换为字节的代码?
-
@pedrofb 是的,我做到了,没有运气。
-
请按照我的建议,包括原始文本和使用十六进制密钥转换的加密数据
标签: javascript ruby-on-rails cryptography aes cryptojs