【发布时间】:2010-12-13 02:06:35
【问题描述】:
到目前为止,我发现的很多项目都有些模糊或......不具体,所以我希望得到答案。
我有两个小方法 - 看起来很简单的方法......
private const string initVector = "1234567890123456";
private const string SaltValue = "ThisIsMySaltValue";
private const int KeySize = 256;
public static string Encrypt(string textToEncrypt)
{
var rijndael = new RijndaelManaged {KeySize = KeySize};
var salt = SaltValue.ToByteArray();
var vector = initVector.ToByteArray();
var rfcBytes = new Rfc2898DeriveBytes(vector, salt, 2);
var key = rfcBytes.GetBytes(rijndael.KeySize/8);
ICryptoTransform encrypt = rijndael.CreateEncryptor(key, vector);
var stream = new MemoryStream();
var data = Encoding.ASCII.GetBytes(textToEncrypt);
stream.Write(data, 0, data.Length);
var cryptoStream = new CryptoStream(stream, encrypt, CryptoStreamMode.Write);
cryptoStream.Write(data, 0, data.Length);
cryptoStream.FlushFinalBlock();
cryptoStream.Close();
return Convert.ToBase64String(stream.ToArray());
}
public static string Decrypt(string textToDecrypt)
{
var vector = initVector.ToByteArray();
var salt = SaltValue.ToByteArray();
var encrypted = textToDecrypt.ToByteArray();
var rijndael = new RijndaelManaged {KeySize = KeySize};
var rfcBytes = new Rfc2898DeriveBytes(vector, salt, 2);
var key = rfcBytes.GetBytes(rijndael.KeySize/8);
var decrypt = rijndael.CreateDecryptor(key, vector);
var stream = new MemoryStream(encrypted);
var cryptoStream = new CryptoStream(stream, decrypt, CryptoStreamMode.Read);
byte[] plainBytes = new byte[textToDecrypt.Length];
var decryptedLength = cryptoStream.Read(plainBytes, 0, plainBytes.Length);
var plainText = Encoding.UTF8.GetString(plainBytes, 0, decryptedLength);
return plainText;
}
单元测试看起来像这样......
[Test]
public void JustTestingThisOut()
{
var encryptMe = "SomethingToEncrypt";
string result = encryptMe.ConvertToEncrypted();
result.ShouldNotEqual(encryptMe);
string backToReadAble = result.ConvertToDecrpted();
backToReadAble.ShouldEqual(encryptMe);
}
ToByteArray 只是返回 Encoding.UTF8.GetBytes(toByte);我的测试字符串很简单——“SomethingToEncrypt”。我已经陷入寻找this 的兔子洞,认为这可能是问题(Convert.ToBase64String 和 Convert.FromBase64String),似乎没有任何区别。至于报错……
测试用例 'Tests.Encryption.EncryptionUnitTests.JustTestingThisOut' 失败的: System.Security.Cryptography.CryptographicException :要解密的数据长度为 无效的。在 System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(字节[] 输入缓冲区,Int32 输入偏移量,Int32 输入计数)
我有 FlushFinalBlock() 在那里,我认为这样做,但......不,也没有什么区别。有任何想法吗?要尝试什么?
【问题讨论】:
标签: asp.net encryption rijndaelmanaged rijndael