[英]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.