使用AES,Crypto.js和.NET的Websockets聊天消息加密

时间:2015-01-21 12:13:23

标签: javascript .net asp.net-mvc encryption cryptography

所以,我已经使用Websockets开发了用户聊天,服务器上有ASP.MVC。

我想加密从websockets发送和接收的所有邮件(使用 AES )。为此,我尝试在发送之前加密用户消息(使用Crypto.js )并在服务器上对其进行解密(使用 Security.Cryptography .net )。

问题是客户端上的加密消息与服务器上的加密消息不同(客户端和用户的消息,密钥和初始化向量相同)。

这是做websockets消息加密的好方法吗?你会推荐我什么其他解决方案?

CryptoJS:

 var encrypted = CryptoJS.AES.encrypt("Message", communicationKey, { iv : communicationIV}, { mode: CryptoJS.mode.CFB });

.NET Cryptography:

 byte[] encryptedMessage = EncryptStringToBytes_Aes(decryptedMessage, keyToDecrypt, ivToDecrypt);
 return Convert.ToBase64String(encryptedMessage);

Crypto.js加密字符串是:

U2FsdGVkX18wnoGfYzHo2Ms/6CKsRC+cE1fj8ylSPlI=

.NET的Security.Cryptography是:

kLApirWt1VcVu3tTuAizgA==

我在两侧使用相同的键和初始化矢量。可能是什么问题?

1 个答案:

答案 0 :(得分:3)

我假设您要使用CFB模式,因为您在JavaScript代码中引用了此模式,EncryptStringToBytes_Aes已经这样做了。

将模式放入第一个配置对象。没有第二个:

var encrypted = CryptoJS.AES.encrypt("Message", communicationKey, {
    iv : communicationIV,
    mode: CryptoJS.mode.CFB
});

此外,CryptoJS使用OpenSSLFormatter格式化输出。如果您使用基于密码的加密,它包含一个盐,但似乎您没有。如果您想确保只交换密文,请将其编码为CryptoJS.enc.Base64.stringify(encrypted.ciphertext)到Base64中,而不是使用encrypted.toString()

如果你正在使用aes汇总,请不要忘记在你的页面中加入mode-cfb.js,因为那里只包含CBC。