【问题标题】:slowAES not working with CBC/PKCS7 - alternatives?slowAES 不适用于 CBC/PKCS7 - 替代方案?
【发布时间】:2011-05-14 10:44:40
【问题描述】:

基本上,如何在 CBC/PKCS7 中使用 javascript 进行加密,以便在 php 或 .NET 中解密?

我尝试过 slowAES,但加密的输出文本似乎不正确。

我比较了 slowAES 和 .NET 加密,给定相同的字节数组输入(key、iv 和消息),slowAES 返回不同的字节数组输出。

我还将结果与 .NET 和 php 的 mcrypt 进行了比较,它们产生了相同的输出。

我已经尝试过此修复 link text,但没有成功。

那么,假设是一个缓慢的 AES 问题,是否有可行的替代方案,或者有人知道如何解决它?

哦,如果我只使用慢速AES,我可以加密和解密:x


更新示例:

javascript 加密:

var bytesToEncrypt = cryptoHelpers.convertStringToByteArray("2|2010-11-23+10:04:53|0");
// [50, 124, 50, 48, 49, 48, 45, 49, 49, 45, 50, 51, 43, 49, 48, 58, 48, 52, 58, 53, 51, 124, 48]

var key = cryptoHelpers.base64.decode("de1310982b646af063e7314e8ddd4787");
//[117, 237, 119, 215, 79, 124, 217, 190, 184, 233, 167, 244, 235, 119, 187, 223, 94, 30, 241, 215, 93, 227, 191, 59]

var iv = cryptoHelpers.base64.decode("v/VCTAlV5+kexBFN16WY5A==");
//[191, 245, 66, 76, 9, 85, 231, 233, 30, 196, 17, 77, 215, 165, 152, 228]

var result = slowAES.encrypt(bytesToEncrypt, 
slowAES.modeOfOperation.CBC,
key,
slowAES.aes.keySize.SIZE_128,
iv);

return result['cipher'];
//[114, 176, 211, 189, 47, 133, 36, 115, 173, 19, 122, 45, 30, 212, 189, 54, 149, 167, 92, 127, 198, 13, 121, 102, 70, 172, 119, 194, 249, 98, 107, 236]

.NET/Silverlight 加密:

    class AES
    {
        AesManaged aes;

        public AES(string base64key, string base64IV) 
            : this(Convert.FromBase64String(base64key),Convert.FromBase64String(base64IV)) 
        {}

        public AES(byte[] key, byte[] iv)
        {
            // CBC/128/PKCS7
            aes = new AesManaged();
            aes.Key = key;
            aes.IV = iv;
        }
        public string Encrypt(string strInptData)
        {
            byte[] utfdata = UTF8Encoding.UTF8.GetBytes(strInptData);

            PrintByteArray(utfdata);
// [50, 124, 50, 48, 49, 48, 45, 49, 49, 45, 50, 51, 43, 49, 48, 58, 48, 52, 58, 53, 51, 124, 48]

            PrintByteArray(aes.Key);
// [117, 237, 119, 215, 79, 124, 217, 190, 184, 233, 167, 244, 235, 119, 187, 223, 94, 30, 241, 215, 93, 227, 191, 59]

            PrintByteArray(aes.IV);
// [191, 245, 66, 76, 9, 85, 231, 233, 30, 196, 17, 77, 215, 165, 152, 228]

            // Create a decrytor to perform the stream transform.
            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

            // Create the streams used for encryption.
            MemoryStream msEncrypt = new MemoryStream();
            CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);

            csEncrypt.Write(utfdata, 0, utfdata.Length);
            csEncrypt.Flush();
            csEncrypt.Close();

            // Showing our encrypted content
            byte[] encryptBytes = msEncrypt.ToArray();

            PrintByteArray(encryptBytes);
// [89, 116, 38, 217, 71, 199, 73, 174, 55, 139, 158, 231, 22, 238, 252, 245, 147, 206, 176, 157, 1, 141, 88, 178, 160, 112, 135, 182, 13, 200, 53, 121]

            return HttpUtility.UrlEncode(Convert.ToBase64String(encryptBytes));
        }
    }

string base64key = "de1310982b646af063e7314e8ddd4787";
string base64iv = "v/VCTAlV5+kexBFN16WY5A==";

aes = new AES(base64key, base64iv);

auth_token = aes.Encrypt("2|2010-11-23+10:04:53|0");

正如您所见,.NET 和 javascript 产生不同的字节数组,因此甚至不是 base64/url-encode/decode 的东西..

【问题讨论】:

  • 那么如何将密钥传递给 JavaScript 呢?我希望那是在 https。

标签: javascript encryption aes


【解决方案1】:

您的密钥是 24 字节(192 位)长,但您声称它只有 16 字节(128 位)长:

var result = slowAES.encrypt(bytesToEncrypt, 
slowAES.modeOfOperation.CBC,
key,
slowAES.aes.keySize.SIZE_128, // <- Here is your problem
iv);

通过将SIZE_128 更改为SIZE_192,它应该可以工作。我编写了一个 Java 程序,它发出的输出与您的 JavaScript 示例产生的输出相同。

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多