繁体   English   中英

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

[英]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;
        }
    }
}

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

aesAlg.GenerateIV();

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM