AES256 encription没有RijndaelManaged in .Net core 1.1

问题描述 投票:0回答:1

我想在.net核心1.1中进行AES256加密。 RijndaelManaged不支持.net核心1.1。所以我在这里使用AES aes = new AES.create()

这部分代码为加密创建随机私钥

public string GenaratePassPharse()
    {
        RandomNumberGenerator rngCryptoServiceProvider = RandomNumberGenerator.Create();
        byte[] randomBytes = new byte[KEY_SIZE];
        rngCryptoServiceProvider.GetBytes(randomBytes);
        string plainPassPharse = Convert.ToBase64String(randomBytes);

        return plainPassPharse;
    }

这里是AES()加密方法。我想要做的是传递我生成的密钥(从上面的方法返回)而不是aesAlg.Key作为加密密钥。

 static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
    {
        // Check arguments.
        if (plainText == null || plainText.Length <= 0)
            throw new ArgumentNullException("plainText");
        if (Key == null || Key.Length <= 0)
            throw new ArgumentNullException("Key");
        if (IV == null || IV.Length <= 0)
            throw new ArgumentNullException("IV");
        byte[] encrypted;

        // Create an Aes object
        // with the specified key and IV.
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;
            aesAlg.BlockSize = 128;
            aesAlg.KeySize = 128;



            // Create an encryptor to perform the stream transform.
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.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;

    }

还有其他使用AES256加密算法的方法吗?

c# cryptography aes .net-core-1.1
1个回答
1
投票

完整的代码应该是:

public static byte[] EncryptStringToBytes_Aes(string plainText, byte[] key, byte[] iv = null)
{
    // Check arguments.
    if (plainText == null)
    {
        throw new ArgumentNullException("plainText");
    }

    if (key == null || key.Length == 0)
    {
        throw new ArgumentNullException("Key");
    }

    // Create an Aes object
    // with the specified key and IV.
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;

        if (iv == null)
        {
            iv = new byte[aes.BlockSize / 8];

            using (RandomNumberGenerator rngCryptoServiceProvider = RandomNumberGenerator.Create())
            {
                rngCryptoServiceProvider.GetBytes(iv);
            }
        }

        // Note that we are setting IV, Mode, Padding
        aes.IV = iv;
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.PKCS7;

        // Create an encryptor to perform the stream transform.
        using (ICryptoTransform encryptor = aes.CreateEncryptor())
        using (MemoryStream ms = new MemoryStream())
        using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
        {
            // Prepend the IV
            cs.Write(iv, 0, iv.Length);

            // Here we are setting the Encoding
            using (StreamWriter sw = new StreamWriter(cs, Encoding.UTF8))
            {
                // Write all data to the stream.
                sw.Write(plainText);
            }

            byte[] encrypted = ms.ToArray();
            return encrypted;
        }
    }
}

public static string DecryptBytesToString_Aes(byte[] encrypted, byte[] key)
{
    // Check arguments.
    if (encrypted == null || encrypted.Length == 0)
    {
        throw new ArgumentNullException("plainText");
    }

    if (key == null || key.Length == 0)
    {
        throw new ArgumentNullException("Key");
    }

    // Create an Aes object
    // with the specified key and IV.
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;

        using (MemoryStream ms = new MemoryStream(encrypted))
        {
            // Read the prepended IV
            var iv = new byte[aes.BlockSize / 8];
            ms.Read(iv, 0, iv.Length);

            // Note that we are setting IV, Mode, Padding
            aes.IV = iv;
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;

            // Create an encryptor to perform the stream transform.
            using (ICryptoTransform decrytor = aes.CreateDecryptor())
            using (CryptoStream cs = new CryptoStream(ms, decrytor, CryptoStreamMode.Read))
            // Here we are setting the Encoding
            using (StreamReader sr = new StreamReader(cs, Encoding.UTF8))
            {
                // Read all data from the stream.
                string plainText = sr.ReadToEnd();
                return plainText;
            }
        }
    }
}

public static byte[] GenerateAesKey(int bits)
{
    using (RandomNumberGenerator rngCryptoServiceProvider = RandomNumberGenerator.Create())
    {
        byte[] key = new byte[bits / 8];
        rngCryptoServiceProvider.GetBytes(key);
        return key;
    }
}

public static void Main()
{
    var key = GenerateAesKey(256);
    var encrypted = EncryptStringToBytes_Aes("Hello", key);
    var decrypted = DecryptBytesToString_Aes(encrypted, key);
}

此代码在加密流中预先添加随机IV,并从加密流中恢复它以解密流。

当您谈到加密时,设置可以设置的所有内容非常重要。一定不能打开任何问题。必须编码加密ModePaddingEncoding明文。一切!

© www.soinside.com 2019 - 2024. All rights reserved.