【问题标题】:Websockets chat message encryption with AES, Crypto.js and .NET使用 AES、Crypto.js 和 .NET 的 Websockets 聊天消息加密
【发布时间】:2015-01-21 12:13:23
【问题描述】:

所以,我使用 Websockets 开发了一个用户聊天,在服务器上使用 ASP.MVC。

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

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

这是进行 websockets 消息加密的好方法吗?您还会推荐我哪些其他解决方案?

CryptoJS:

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

.NET 密码学:

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

Crypto.js 加密字符串是:

U2FsdGVkX18wnoGfYzHo2Ms/6CKsRC+cE1fj8ylSPlI=

.NET 的 Security.Cryptography 是:

kLApirWt1VcVu3tTuAizgA==

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

【问题讨论】:

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


    【解决方案1】:

    我假设您想使用 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 rollup,请不要忘记在您的页面中包含 mode-cfb.js,因为其中仅包含 CBC。

    【讨论】:

    • 我试过了。我收到“无法读取未定义的属性‘createEncryptor’”错误。 :|
    • 这可能是因为 CFB 最初并未包含在 aes 汇总中。您必须自己包含js
    • 我非常接近最终答案。现在,atob(encrypted.ciphertext)) 之后的输出是q·øëm8ßÝÞÑݹç¯{yÝ}Ó¦Üo7。字符数与.NET给出的相同,只是编码不同。
    • 这就是我说你需要编码的原因。我会明确地包含它。
    猜你喜欢
    • 2016-10-27
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多