C # с Crypto-JS возвращает разные результаты - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь зашифровать в JS, а также сделать то же самое в C #, используя класс AesManaged C # и библиотеку Crypto-JS JS.Предполагается, что он использует AES-256.

Результаты оказались очень разными и потратили часы, пытаясь выяснить, что может быть не так, я также смотрел на подобные вопросы, но без удачивсе в выяснении, в чем заключается конкретная проблема моего кода ...

Есть идеи, что может быть не так с кодом?

Код JS ниже:

    // Function to encrypt
function encrypt(text) {
    var iv = CryptoJS.enc.Utf8.parse(encryption_key);
    var cipherText = CryptoJS.AES.encrypt(text, encryption_key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    }).toString();

    return cipherText;
}

// Function to decrypt
function decrypt(cipherText) {
    var iv = CryptoJS.enc.Utf8.parse(encryption_key);
    var bytes = CryptoJS.AES.decrypt(cipherText, encryption_key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    var originalText = bytes.toString(CryptoJS.enc.Utf8);

    return originalText;
}

C #Код ниже:

public static string EncryptData(string text)
    {
        // Create a new instance of the AesManaged
        // class.  This generates a new key and initialization 
        // vector (IV).
        using (AesManaged myAes = new AesManaged())
        {
            myAes.BlockSize = 128;
            myAes.Key = Encoding.UTF8.GetBytes(ENCRYPTION_KEY);
            myAes.IV = Encoding.UTF8.GetBytes(ENCRYPTION_KEY);
            myAes.Mode = CipherMode.CBC;
            myAes.Padding = PaddingMode.PKCS7;

            // Encrypt the string to an array of bytes.
            byte[] encrypted = EncryptStringToBytes_Aes(text, myAes);

            return Convert.ToBase64String(encrypted, 0, encrypted.Length);
        }
    }

    private static byte[] EncryptStringToBytes_Aes(string plainText, AesManaged aesManaged)
    {
        byte[] encrypted;

        // Create an encryptor to perform the stream transform.
        ICryptoTransform encryptor = aesManaged.CreateEncryptor(aesManaged.Key, aesManaged.IV);

        // Create the streams used for encryption.
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    //Write all data to the stream.
                    swEncrypt.Write(plainText);
                }
                encrypted = msEncrypt.ToArray();
            }
        }

        // Return the encrypted bytes from the memory stream.
        return encrypted;
    }

    private static string DecryptStringFromBytes_Aes(byte[] cipherText, AesManaged aesManaged)
    {
        // Declare the string used to hold
        // the decrypted text.
        string plaintext = null;

        // Create a decryptor to perform the stream transformaesManaged
        ICryptoTransform decryptor = aesManaged.CreateDecryptor(aesManaged.Key, aesManaged.IV);

        // Create the streams used for decryption.
        using (MemoryStream msDecrypt = new MemoryStream(cipherText))
        {
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                {
                    // Read the decrypted bytes from the decrypting stream
                    // and place them in a string.
                    plaintext = srDecrypt.ReadToEnd();
                }
            }
        }

        return plaintext;
    }
...