Javascript 使用CryptoJS加密,使用Ruby/AES解密
这个问题几乎把我逼疯了 我正在尝试对将通过AJAX发送到RoR应用程序的数据进行加密 我已经成功地用Ruby加密了一个字符串,用JavaScript解密了它,但现在我无法做相反的事情 以下是我的JS:Javascript 使用CryptoJS加密,使用Ruby/AES解密,javascript,ruby-on-rails,ruby,encryption,cryptojs,Javascript,Ruby On Rails,Ruby,Encryption,Cryptojs,这个问题几乎把我逼疯了 我正在尝试对将通过AJAX发送到RoR应用程序的数据进行加密 我已经成功地用Ruby加密了一个字符串,用JavaScript解密了它,但现在我无法做相反的事情 以下是我的JS: function decrypt(data, key) { var index = data.indexOf('!$'); var iv = data.substr(0, index); var crypttext = data.substr(index + 2);
function decrypt(data, key) {
var index = data.indexOf('!$');
var iv = data.substr(0, index);
var crypttext = data.substr(index + 2);
encrypted = {}
encrypted.ciphertext = CryptoJS.enc.Base64.parse(crypttext);
var decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: CryptoJS.enc.Base64.parse(iv) });
return decrypted.toString(CryptoJS.enc.Utf8);
}
function encrypt( data, key ) {
enc = CryptoJS.AES.encrypt( data, key );
enc_str = CryptoJS.enc.Base64.stringify(enc.iv) + "!$" + CryptoJS.enc.Base64.stringify(enc.ciphertext);
return enc_str;
}
// ...
var key = 'ABCDEF123ABCDEF123ABCDEF123ABCDEF123ABCDEF123';//CryptoJS.SHA256( 'ABCDEF123' ).toString();
var key2 = 'ABCDEF123ABCDEF123ABCDEF123ABCDEF123ABCDEF123_42'; //CryptoJS.SHA256( 'ABCDEF123_42' ).toString();
code = "123 456"
uuid = "0000000000000000000000000000"
var enc_code = encrypt( code, key );
var enc_uuid = encrypt( uuid, key2 );
我将iv和密文分开,因为我在JS中解密时遇到了一些问题
这是ruby代码
def decrypt(string, key)
salt = nil
if string.include? '$$:'
sp = string.split '$$:'
string = sp[0]
salt = sp[1].to_i(16).to_s
end
parts = string.split '!$'
@initialization_vector = Base64.decode64(parts[0])
aes_decrypt(key, Base64.decode64(parts[1]), salt)
end
def aes(key,string)
cipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
cipher.encrypt
cipher.key = key #Digest::SHA256.digest(key)
cipher.iv = @initialization_vector = cipher.random_iv# + '#'
cipher_text = cipher.update(string)
cipher_text << cipher.final
return cipher_text
end
def aes_decrypt(key, encrypted, salt = nil)
p encrypted
cipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
cipher.decrypt
cipher.padding = 0 # I Spent a couple of hours with an exception from Cipher, all I had to do was add this line!!
cipher.key = key #Digest::SHA256.digest(key)
cipher.iv = encrypted.slice!(0, 16)
unless salt.nil?
# cipher.pkcs5_keyivgen key, salt
end
d = cipher.update(encrypted)
d << cipher.final
end
我的谷歌fu让我失望了,我已经尝试了我发现的大多数东西
有什么想法吗?您使用的库使用的是更高层次的OpenSSL。更高层支持基于密码的加密。默认情况下,CryptoJS代码似乎使用OpenSSL中专有的基于密码的密钥派生函数。然而,Ruby代码在默认情况下做得更少;它将简单地使用您输入的密钥作为密钥,您需要自己进行密钥派生
因此,如果只想使用密钥(应该是随机二进制数据,而不是文本),那么应该在CryptoJS中使用。另一方面,如果您想使用密码(因此是salt值),则应该使用。在这种情况下,您可能还需要解析OpenSSL加密的BLOB。首先为什么要使用salt?@owlstead默认情况下它是打开的(看起来就是这样!)。从AES.encrypt获得的对象包含一个salt值(请参见:),我猜这就是它使用的salt(否则它为什么会存在?)。我找不到如何关掉它!
CryptoJS.AES.decrypt( enc, key, { iv: enc.iv, salt: enc.salt } ).toString() // In encrypt()
// => 31323320343536
// => 30303030303030303030303030303030303030303030303030303030
decrypt( enc_code, key ).toString(); // After encrypt
// => [EMPTY]