ASP.net rijndael decrypt-要解密的数据长度
到目前为止,我发现的很多东西都有点模糊或。。。不具体,所以我希望得到一个答案 我有两个小方法-看起来很简单的方法ASP.net rijndael decrypt-要解密的数据长度,asp.net,encryption,rijndaelmanaged,rijndael,Asp.net,Encryption,Rijndaelmanaged,Rijndael,到目前为止,我发现的很多东西都有点模糊或。。。不具体,所以我希望得到一个答案 我有两个小方法-看起来很简单的方法 private const string initVector = "1234567890123456"; private const string SaltValue = "ThisIsMySaltValue"; private const int KeySize = 256; public static string Encrypt(string
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只执行返回编码.UTF8.GetBytes(toByte);我的测试字符串很简单——“SomethingToEncrypt”。我已经陷入了一个白兔洞,认为这可能是问题所在(Convert.ToBase64String和Convert.FromBase64String),但这似乎没有任何区别。至于错误
测试用例
'测试。加密。加密单元测试。仅测试输出'
失败:
System.Security.Cryptography.CryptographyException异常
:要解密的数据的长度为
无效的在
System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(字节[])
inputBuffer,Int32 inputOffset,Int32
输入计数)
我有FlushFinalBlock()在里面,我想这样就可以了,但是……不,也没什么区别。有什么想法吗?尝试什么?加密时,您首先将
数据
写入流
,然后用加密流
包装流
,然后再次写入数据
,这次是加密。为什么?解密失败,因为它遇到的第一件事是未加密的数据
在base64编码之前打印密文的值以验证这一点。你应该看到明文后面跟着一堆乱七八糟的东西,这就是密文
另外,您正在使用初始化向量作为密码。它们肯定不是同一件事,这样使用它会损害安全性。我看不出这将如何像jeriley建议的那样工作,因为在解密函数中,您会这样做
var encrypted=textToDecrypt.ToByteArray();
这里textToDecrypt是一个base64字符串。您首先必须将base64转换回普通字节,然后使用这些字节进行解密 您的代码中潜伏着一个间歇性错误 决不能将任何System.Text.Encoding类用于密文。您将遇到间歇性错误。您应该使用Base64编码和System.Convert类方法
Convert.tobase64字符串(字节[]字节)
Convert.FromBase64String(字符串数据)
另外一个注意事项是,在进行加密时,需要使用FlushFinalBlock()
,否则无法正确填充
有关更多信息,请参阅安全专家肖恩·范宁女士的帖子,网址为,我在某个时候看到过——文本后面的菱形问号。让我看看我能不能回到那个位置。关于静脉注射——是的,我知道,我只是想先让它起作用。我现在有一个用于测试的私有密码值,看起来像。。。private const string password=“Youtelling MethatathreeounceBirdCancarryaoNeboundCoach?”;:-)是的,猛拉那一行——stream.Write(data,0,data.Length);它是有效的。现在把有趣的东西连接起来。