微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用AES对称加密和解密C#中的一些数据?

如何解决如何使用AES对称加密和解密C#中的一些数据?

我正在尝试使用 AES 加密和解密一些数据。但我只得到乱码的输出。我做错了什么?

static void test()
{
    byte[] myFileBytes; // Will contain encrypted data. First the IV,then the ciphertext.
    var myPassword = "helloworld";
    var dataToEncrypt = "this is a test";

    // STEP 1: Encrypt some data:

    byte[] key;

    using (var sha256 = SHA256.Create())
        key = sha256.ComputeHash(Encoding.UTF8.GetBytes(myPassword));

    using (var myFileStream = new MemoryStream())
    using (var aes = System.Security.Cryptography.Aes.Create())
    {
        aes.Key = key;
        myFileStream.Write(aes.IV); // Use the default created by AES,which is presumably non-pseudo random

        using (var cryptoStream = new CryptoStream(myFileStream,aes.CreateEncryptor(),CryptoStreamMode.Write))
        {
            cryptoStream.Write(Encoding.UTF8.GetBytes(dataToEncrypt));
            cryptoStream.Flush();

            myFileBytes = myFileStream.ToArray(); // We are done!

        } // disposing CryptoStream disposes the underlying MemoryStream
    }

    // STEP 2: Decrypt it to verify that it works

    using (var aes = System.Security.Cryptography.Aes.Create())
    {
        using (var myFileStream = new MemoryStream(myFileBytes))
        {
            var iv = new byte[aes.IV.Length];

            myFileStream.Read(iv,iv.Length);

            using (var cryptoStream = new CryptoStream(myFileStream,aes.CreateEncryptor(key,iv),CryptoStreamMode.Read))
            using (var copyStream = new MemoryStream())
            {
                cryptoStream.copyTo(copyStream);

                var decrypted = Encoding.UTF8.GetString(copyStream.ToArray());

                Debug.Assert(dataToEncrypt == decrypted); // Fails!
            }
        }
    }
}

解决方法

我会看一下 example in the documentation 并与您的代码进行比较。

特别是在解密时您使用的是 aes.CreateEncryptor(key,iv)。应该是 aes.CreateDecryptor(key,iv)

文档中的示例在调用 CreateEncryptor 时也输入了键和 IV,但我不确定是否需要这样做。

您可能不应该使用 sha256 从密码生成密钥。正确的方法是 key derivation algorithm。例如Rfc2898DeriveBytes

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。