C# 使用Crypto JS和C的AES加密“解密-避免”;填充无效,无法删除。”;

C# 使用Crypto JS和C的AES加密“解密-避免”;填充无效,无法删除。”;,c#,javascript,encryption,cryptography,C#,Javascript,Encryption,Cryptography,我正忙于创建一个Javascript应用程序,该应用程序与我们客户现有的C#服务集成 其中一个要求是发送AES加密的数据,然后解密并在服务器上使用 但是,我无法发送“有效”数据,服务器总是以“填充无效且无法删除”作为响应 以下是他们的C#Encrypt and Decrypt实现(这是无法更改的,因为他们有不同的子系统依赖于此: public static string Encrypt(string input, string password) { byte[] utf

我正忙于创建一个Javascript应用程序,该应用程序与我们客户现有的C#服务集成

其中一个要求是发送AES加密的数据,然后解密并在服务器上使用

但是,我无法发送“有效”数据,服务器总是以“填充无效且无法删除”作为响应

以下是他们的C#Encrypt and Decrypt实现(这是无法更改的,因为他们有不同的子系统依赖于此:

public static string Encrypt(string input, string password)
    {
        byte[] utfData = Encoding.UTF8.GetBytes(input);
        byte[] saltBytes = Encoding.UTF8.GetBytes(password);
        string encryptedString = string.Empty;
        using (var aes = new AesManaged())
        {
            var rfc = new Rfc2898DeriveBytes(password, saltBytes);

            aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;
            aes.KeySize = aes.LegalKeySizes[0].MaxSize;
            aes.Key = rfc.GetBytes(aes.KeySize/8);
            aes.IV = rfc.GetBytes(aes.BlockSize/8);

            using (ICryptoTransform encryptTransform = aes.CreateEncryptor())
            {
                using (var encryptedStream = new MemoryStream())
                {
                    using (var encryptor =
                        new CryptoStream(encryptedStream, encryptTransform, CryptoStreamMode.Write))
                    {
                        encryptor.Write(utfData, 0, utfData.Length);
                        encryptor.Flush();
                        encryptor.Close();

                        byte[] encryptBytes = encryptedStream.ToArray();
                        encryptedString = Convert.ToBase64String(encryptBytes);
                    }
                }
            }
        }
        return encryptedString;
    }


public static string Decrypt(string input, string password)
    {
        byte[] encryptedBytes = Convert.FromBase64String(input);
        byte[] saltBytes = Encoding.UTF8.GetBytes(password);
        string decryptedString = string.Empty;
        using (var aes = new AesManaged())
        {
            var rfc = new Rfc2898DeriveBytes(password, saltBytes);
            aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;
            aes.KeySize = aes.LegalKeySizes[0].MaxSize;
            aes.Key = rfc.GetBytes(aes.KeySize/8);
            aes.IV = rfc.GetBytes(aes.BlockSize/8);

            using (ICryptoTransform decryptTransform = aes.CreateDecryptor())
            {
                using (var decryptedStream = new MemoryStream())
                {
                    var decryptor =
                        new CryptoStream(decryptedStream, decryptTransform, CryptoStreamMode.Write);
                    decryptor.Write(encryptedBytes, 0, encryptedBytes.Length);
                    decryptor.Flush();
                    decryptor.Close();

                    byte[] decryptBytes = decryptedStream.ToArray();
                    decryptedString =
                        Encoding.UTF8.GetString(decryptBytes, 0, decryptBytes.Length);
                }
            }
        }

        return decryptedString;
    }
我正在使用CryptoJS3.1.2.eg

var encrypted = CryptoJS.AES.encrypt(input, password).toString();

我如何编写与他们的“Encrypt()”等价的代码使用CryptoJS

CryptoJS文档严重缺乏深度,因此不尝试就很难知道会发生什么。很明显,将密码用作salt不是处理salt的安全或标准方法。因此,您必须自己调用PBKDF2函数,创建密钥和IV。您还需要创建pCryptoJS中的BKDF2使用SHA-1而不是SHA-256。SHA-256似乎是CryptoJS中的默认值(同样未记录)


要做到这一点,唯一的方法是单步执行代码,并比较每个代码(二进制)PBKDF2和AES函数的值。请转换为十六进制以进行良好的比较。

CryptoJS文档严重缺乏深度,因此不尝试就很难知道会发生什么。很明显,将密码用作salt并不是处理salt的安全或标准方法。因此,您必须调用tPBKDF2可以自己运行,创建一个密钥,然后自己进行IV。您还需要使用SHA-1而不是SHA-256在CryptoJS中创建PBKDF2。SHA-256似乎是CryptoJS中的默认值(同样未记录)


要做到这一点,唯一的方法是单步执行代码,并比较每个代码(二进制)PBKDF2和AES函数的值。请转换为十六进制以进行良好的比较。

CryptoJS文档严重缺乏深度,因此不尝试就很难知道会发生什么。很明显,将密码用作salt并不是处理salt的安全或标准方法。因此,您必须调用tPBKDF2可以自己运行,创建一个密钥,然后自己进行IV。您还需要使用SHA-1而不是SHA-256在CryptoJS中创建PBKDF2。SHA-256似乎是CryptoJS中的默认值(同样未记录)


要做到这一点,唯一的方法是单步执行代码,并比较每个代码(二进制)PBKDF2和AES函数的值。请转换为十六进制以进行良好的比较。

CryptoJS文档严重缺乏深度,因此不尝试就很难知道会发生什么。很明显,将密码用作salt并不是处理salt的安全或标准方法。因此,您必须调用tPBKDF2可以自己运行,创建一个密钥,然后自己进行IV。您还需要使用SHA-1而不是SHA-256在CryptoJS中创建PBKDF2。SHA-256似乎是CryptoJS中的默认值(同样未记录)


要做到这一点,唯一的方法是单步执行代码,并比较每个代码(二进制)PBKDF2和AES函数的值。请转换为十六进制以进行比较。

有趣的事实:此系统易受攻击。此攻击完全破坏加密。窃听者可以在不知道密钥的情况下解密所有密文。有趣的事实:此系统易受攻击。此攻击完全消除了t加密。窃听者可以在不知道密钥的情况下解密所有密文。有趣的事实:此系统易受攻击。此攻击完全破坏了加密。窃听者可以在不知道密钥的情况下解密所有密文。有趣的事实:此系统易受攻击。此攻击完全破坏了encr窃听者可以在不知道密钥的情况下解密所有密文。