【问题标题】:How to decrypt AesCryptoServiceProvider using JavaScript?如何使用 JavaScript 解密 AesCryptoServiceProvider?
【发布时间】:2012-12-15 05:43:49
【问题描述】:

我正在使用MSDN 中的EncryptStringToBytes_Aes 方法使用自定义密码加密一些数据,如下所示:

string original = "some data to encrypt";
byte[] encrypted;

using (AesManaged aes = new AesManaged())
{
    // Prepare new Key and IV.
    string passphrase = "somepassphrase";
    byte[] saltArray = Encoding.ASCII.GetBytes("somesalt"); 
    Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(passphrase, saltArray);
    aes.Key = rfcKey.GetBytes(aes.KeySize / 8);
    aes.IV = rfcKey.GetBytes(aes.BlockSize / 8);

    // Encrypt the string to an array of bytes. 
    encrypted = EncryptStringToBytes_Aes(original, aes.Key, aes.IV);

    // Decrypt the bytes to a string. 
    string roundtrip = DecryptStringFromBytes_Aes(encrypted, aes.Key, aes.IV);

    return Convert.ToBase64String(encrypted);
}

它可以工作(DecryptStringFromBytes_Aes 返回原始字符串)。

我的问题是,如果我在客户端也有相同的密码,如何使用 JavaScript 解密 encrypted?我尝试使用CryptoJS 对其进行解密,但没有成功。数据在网络服务中被加密,我尝试将其作为字节数组、字符串传递给 JS,尝试使用各种编码对其进行编码,但无论我做什么,我都无法获得原始字符串。我在这里做错了什么,我该如何完成这项工作?它甚至可以这样吗? saltArray 编码甚至自定义密码的使用是否会导致我的问题?

这是我的 JS 尝试之一(使用 base64 编码):

var decoded = CryptoJS.enc.Base64.parse(encrypted);
var decrypted = CryptoJS.AES.decrypt(decoded, "somepassphrase");

(编辑:我打算稍后实现随机盐,一旦我得到了其他所有东西,因为这样更容易跟踪发生了什么)

【问题讨论】:

  • 您总是使用相同的 IV,从而误用了 CBC。 IV 应该是一个随机字节序列,并且不应该被重复使用。
  • @SLaks - 使用随机盐每次都会给我不同的静脉注射,这就是你想要的,对吧?我的意思是稍后实施随机盐,一旦其他一切正常。
  • 正确。您需要将 IV 与每条消息一起传输。 (IV 不需要保密)
  • 这个样本很糟糕,因为它重用了 IV。这不会完全破坏 CBC 模式的安全性吗?

标签: c# javascript .net encryption cryptojs


【解决方案1】:

尝试使用斯坦福 Javascript 加密库。 链接:http://crypto.stanford.edu/sjcl/

【讨论】:

  • 斯坦福 Javascript 加密库仅使用 CCM 和 OCB Block 模式,AesManaged 均不支持。
猜你喜欢
  • 2013-02-02
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 2015-01-28
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
相关资源
最近更新 更多