给定密钥加密和解密字符串

encrypt and decrypt string given key

我继承了下面的代码。不幸的是,hello_world的解密值不是:

hello world

但是(就我而言):

&�|ktR���ڼ��S����%��< ���8�

有什么想法吗?看起来每次结果都不一样,从代码中可以看出这一点。我可以更改它以便我可以发送一次加密的数据然后在将来再次解密吗?谢谢!

代码:

using System;
using System.IO;
using System.Security.Cryptography;

namespace crypt
{
    class Program
    {
        static void Main(string[] args)
        {
            var key = @"abcdefghijklmnopqrstuvw==";

            using (var aesAlg = Aes.Create())
            {
                aesAlg.Mode = CipherMode.CBC;
                aesAlg.Padding = PaddingMode.PKCS7;
                aesAlg.Key = Convert.FromBase64String(key);
                aesAlg.GenerateIV();
                var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                var enc_hello_world = EncryptProperty(encryptor, "hello world");

                var hello_world = DecryptProperty(encryptor, enc_hello_world);
            }

        }
        private static string EncryptProperty(ICryptoTransform encryptor, string valueToEncrypt)
        {
            byte[] encrypted;
            using (var msEncrypt = new MemoryStream())
            {
                using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (var swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(valueToEncrypt);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
            return Convert.ToBase64String(encrypted);
        }

        private static string DecryptProperty(ICryptoTransform decryptor, string valueToDecrypt)
        {
            string decrypted;

            using (var msDecrypt = new MemoryStream(Convert.FromBase64String(valueToDecrypt)))
            {
                using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (var srDecrypt = new StreamReader(csDecrypt))
                    {
                        decrypted = srDecrypt.ReadToEnd();
                    }
                }
            }
            return decrypted;
        }
    }
}

A​​ES-CBC 需要两个变量来编码和解码数据:密钥和 IV(初始化向量)。初始化向量可以明文形式发送,并且不会降低加密的安全性。

aesAlg.GenerateIV();

这是创建 IV 的地方,您需要存储它(我通过将它添加到结果数据中来实现)然后访问它并在解密时设置 IV。

您也可以使用空 IV,但这会使攻击者更容易暴露您的密钥,因此不推荐这样做。

这是一个很好的 C# 中 AES 示例:https://gist.github.com/mark-adams/87aa34da3a5ed48ed0c7(它似乎使用了我提到的方法)。