我想使用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