【发布时间】:2015-08-29 22:29:04
【问题描述】:
我在这里基于 MSDN 示例创建了一个简单的 AES 加密/解密服务:https://msdn.microsoft.com/en-us/library/system.security.cryptography.aes(v=vs.110).aspx
这是我的代码,带有一个调用函数和一个用于测试的硬编码键:
public class AesEncryptionService
{
private const int InitializationVectorLength = 16;
private static readonly byte[] Key = Convert.FromBase64String("W+jcxfBJm37AAZujiktg4qCdy3k8D+vIrj4exFxFpIY=");
public byte[] Encrypt(byte[] input)
{
using (var aes = Aes.Create())
{
aes.Key = Key;
Console.WriteLine("Key: " + Convert.ToBase64String(aes.Key));
Console.WriteLine("IV: " + Convert.ToBase64String(aes.IV));
Console.WriteLine("Input: " + Convert.ToBase64String(input));
using (var outputStream = new MemoryStream())
{
using (var encryptor = aes.CreateEncryptor())
using (var cryptoStream = new CryptoStream(outputStream, encryptor, CryptoStreamMode.Write))
using (var streamWriter = new StreamWriter(cryptoStream))
{
streamWriter.Write(input);
}
var output = outputStream.ToArray();
Console.WriteLine("Output: " + Convert.ToBase64String(output));
var encrypted = aes.IV.Concat(output).ToArray();
return encrypted;
}
}
}
public byte[] Decrypt(byte[] input)
{
var initializationVector = input.Take(InitializationVectorLength).ToArray();
input = input.Skip(InitializationVectorLength).ToArray();
using (var aes = Aes.Create())
{
aes.Key = Key;
aes.IV = initializationVector;
Console.WriteLine("Key: " + Convert.ToBase64String(aes.Key));
Console.WriteLine("IV: " + Convert.ToBase64String(aes.IV));
Console.WriteLine("Input: " + Convert.ToBase64String(input));
using (var outputStream = new MemoryStream())
{
using (var decryptor = aes.CreateDecryptor())
using (var inputStream = new MemoryStream(input))
using (var cryptoStream = new CryptoStream(inputStream, decryptor, CryptoStreamMode.Read))
{
cryptoStream.CopyTo(outputStream);
}
var output = outputStream.ToArray();
Console.WriteLine("Output: " + Convert.ToBase64String(output));
return output;
}
}
}
}
class Program
{
static void Main(string[] args)
{
var encryptionService = new AesEncryptionService();
var input = Guid.NewGuid().ToByteArray();
Console.WriteLine("Encrypting...");
var encrypted = encryptionService.Encrypt(input);
Console.WriteLine();
Console.WriteLine("Decrypting...");
var decrypted = encryptionService.Decrypt(encrypted);
Console.WriteLine();
Console.WriteLine("Input: " + Convert.ToBase64String(input));
Console.WriteLine("Output: " + Convert.ToBase64String(decrypted));
}
}
这是我得到的输出示例:
Encrypting...
Key: W+jcxfBJm37AAZujiktg4qCdy3k8D+vIrj4exFxFpIY=
IV: 7tb1BwOOcCdH/h1wdUmrtw==
Input: UsyLMdqbuUC5cVW/+p6vWA==
Output: 4KAhNOwNiNpmPxjvvx38cA==
Decrypting...
Key: W+jcxfBJm37AAZujiktg4qCdy3k8D+vIrj4exFxFpIY=
IV: 7tb1BwOOcCdH/h1wdUmrtw==
Input: 4KAhNOwNiNpmPxjvvx38cA==
Output: U3lzdGVtLkJ5dGVbXQ==
Input: UsyLMdqbuUC5cVW/+p6vWA==
Output: U3lzdGVtLkJ5dGVbXQ==
如您所见,解密后的输出与输入不匹配。我一定在某处的代码中犯了错误,但我似乎无法发现它......有人可以帮忙吗?
【问题讨论】:
-
我不确定,但在我看来,您将 IV 置于加密阶段的末尾,然后将 IV 置于解密阶段的开头。我从未使用过 .Take 方法,所以我不确定。会是这样吗?
-
不,我将 IV 放在加密阶段的最前面。您可以在示例输出中看到 IV 匹配。
标签: c# .net encryption cryptography aes