我想使用eith Rijndael或Aes和下面的代码来加密/解密字符串。Rijndael填充或长度无效
public class Crypto
{
private const string defaultVector = "asdfg123456789";
private const CipherMode cipherMode = CipherMode.CBC;
//Have tried PaddingMode.ISO10126, PaddingMode.None, and PaddingMode.PKCS7
private const PaddingMode paddingMode = PaddingMode.ISO10126;
private const int iterations = 2;
private static Rijndael GetCrypto(string passphrase)
{
var crypt = Rijndael.Create();
crypt.Mode = cipherMode;
crypt.Padding = paddingMode;
crypt.BlockSize = 256;
crypt.KeySize = 256;
crypt.Key =
new Rfc2898DeriveBytes(passphrase, Encoding.Unicode.GetBytes(defaultVector), iterations).GetBytes(32);
crypt.IV = new Rfc2898DeriveBytes(passphrase, Encoding.Unicode.GetBytes(defaultVector), iterations).GetBytes(32);
return crypt;
}
public static string Encrypt(string plainText, string passphrase)
{
byte[] clearData = Encoding.Unicode.GetBytes(plainText);
byte[] encryptedData;
var crypt = GetCrypto(passphrase);
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, crypt.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearData, 0, clearData.Length);
//cs.FlushFinalBlock(); //Have tried this active and commented with no change.
}
encryptedData = ms.ToArray();
}
//Changed per Xint0's answer.
return Convert.ToBase64String(encryptedData);
}
public static string Decrypt(string cipherText, string passphrase)
{
//Changed per Xint0's answer.
byte[] encryptedData = Convert.FromBase64String(cipherText);
byte[] clearData;
var crypt = GetCrypto(passphrase);
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, crypt.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(encryptedData, 0, encryptedData.Length);
//I have tried adding a cs.FlushFinalBlock(); here as well.
}
clearData = ms.ToArray();
}
return Encoding.Unicode.GetString(clearData);
}
}
//编辑:我已经改变了统一调用按照以下XINT0的回答Convert.ToBase64String。
在解密方法中的cs.Write,我得到错误,“填充无效,无法删除。”
我曾尝试将填充设置为PaddingMode.None,但我得到“要加密的数据长度无效”。在加密方法中的cs.Write上。
我看过这些,他们所说的没有什么似乎可以工作。
Padding is invalid and cannot be removed
Padding is invalid and cannot be removed?
栈跟踪显示System.Security.CryptographicException从RijndaelManagedTransform.DecryptData(字节[] INPUTBUFFER,的Int32 inputOffset,的Int32 inputCount,字节[] & OutputBuffer中,的Int32 outputOffset,PaddingMode未来paddingMode,Boolean fLast)。
我曾尝试加入cs.Close()和cs.FlushFinalBlock()的每一个排列。堆栈跟踪显示来自CryptoStream调用的System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte [] inputBuffer,Int32 inputOffset,Int32 inputCount,Byte []&outputBuffer,Int32 outputOffset,PaddingMode paddingMode,Boolean fLast)的错误。 FlushFinalBlock()。当CryptoStream被关闭/处置时FlushFinalBlock也被调用。所以我在这里亏本。 – PMontgomery 2012-03-06 15:24:45
@PMontgomery你用'System.Convert.ToBase64String(encryptedData)'替换'Encoding.Unicode.GetString(encryptedBytes)'?这是你最大的问题。 – Xint0 2012-03-06 17:45:07
是的,我已经做了这些修改并编辑了原始问题以反映。它没有改变错误。 – PMontgomery 2012-03-06 19:41:03