我试图通过json将加密数据发送到客户端并使用cryptojs在客户端解密
我的ROR代码
def getkey
aes = OpenSSL::Cipher::Cipher.new('AES-128-CBC')
aes.encrypt
key = aes.random_key
session[:key] = key
render :json => {:mkey => Base64.encode64(key).gsub(/\n/, '')}
end
def getdata
js = "SOME DATA"
aes = OpenSSL::Cipher::Cipher.new('AES-128-CBC')
aes.encrypt
aes.key = session[:key]
encrypted = aes.update(js) + aes.final
encrypted = Base64.encode64(encrypted).gsub(/\n/, '')
render :json => {:data => encrypted}
end
我的Javascript代码
var key = btoa(BASE64_ENCODED_KEY);
$http({method: 'GET', url: '/appi/getdata/', params: {SOME_PARAMS}})
.success(function(data, status, headers, config) {
var dat = btoa(data.data);
var decrypted = CryptoJS.AES.decrypt(dat, key);
console.log(decrypted.toString(CryptoJS.enc.Utf8));
});
获取javascript错误“错误:格式错误的UTF-8数据。”在chrome
以下是上述查询的简化jsfiddle的网址
答案 0 :(得分:3)
感谢owlstead,我已经在过去的几天里想出来了。
我在crypto-js线程中提出了这个问题,问题是我没有在crypto-js解密中指定IV,如在Ruby中,如果你没有指定任何IV,它会将\ 0添加为IV。
以下是工作代码
var encrypted = {};
encrypted.ciphertext = CryptoJS.enc.Base64.parse(data.data);
var decrypted = CryptoJS.AES.decrypt(encrypted, CryptoJS.enc.Base64.parse(BASE64_ENCODED_KEY),
{ iv: CryptoJS.enc.Hex.parse('00000000000000000000000000000000') });;
console.log(decrypted.toString(CryptoJS.enc.Utf8));
这对我有用,这个解决方案昨天由Jeff.Mott.OR(目前的密码导演)提供给我
答案 1 :(得分:0)
如果回复包含换行符,例如"\r\n"
,则可以使用:
s = s.replace(/[\r\n]/g, '');
删除它们。