Rijndael 加密/解密
本文关键字:解密 加密 Rijndael | 更新日期: 2023-09-27 17:57:00
我有以下用于加密和解密的代码。问题是,在解密时,除了解密的文本之外,我在文本后面还有一些"aaaaa"。为什么?需要一些帮助。感谢!
public static byte[] Encrypt(byte[] PlainTextBytes, string key , string InitialVector)
{
try
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
Byte[] KeyBytes = encoding.GetBytes(key);
byte[] InitialVectorBytes = encoding.GetBytes(InitialVector);
RijndaelManaged SymmetricKey = new RijndaelManaged();
ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes);
MemoryStream MemStream = new MemoryStream();
CryptoStream CryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write);
CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length);
CryptoStream.FlushFinalBlock();
byte[] CipherTextBytes = MemStream.ToArray();
return CipherTextBytes;
//decrytion
public static string Decrypt(byte[] PlainTextBytes1, string key, string InitialVector)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
Byte[] KeyBytes = encoding.GetBytes(key);
RijndaelManaged SymmetricKey = new RijndaelManaged();
byte[] InitialVectorBytes = Encoding.UTF8.GetBytes(InitialVector);
ICryptoTransform Decryptor = SymmetricKey.CreateDecryptor(KeyBytes, InitialVectorBytes);
MemoryStream MemStream1 = new MemoryStream(PlainTextBytes1);
CryptoStream CryptoStream = new CryptoStream(MemStream1, Decryptor, CryptoStreamMode.Read);
Byte[] pltxt = new byte[PlainTextBytes1.Length];
CryptoStream.Read(pltxt, 0, pltxt.Length);
ASCIIEncoding textConverter = new ASCIIEncoding();
round = textConverter.GetString(pltxt);
return round;
}
我错在哪里?
在解密函数中,您有:
Byte[] pltxt = new byte[PlainTextBytes1.Length];
这是错误的,因为密码文本比纯文本长,因为它被填充以获得块大小的倍数。
CryptoStream.Read(pltxt, 0, pltxt.Length);
Read
返回实际返回的字节数。它不保证它会返回您请求的字节数。
然后还有许多其他缺陷/不良风格的东西:
- 传递给
Decrypt
的参数被称为PlainTextBytes1
它应该被称为密码文本。 - 从字符串创建密钥/初始化字节的方式。ASCII 编码在这里是一个糟糕的选择。ASCII 不能表示任何字节字符串。也许您想十六进制 en/解码一个两倍于密钥大小的字符串? ASCII
- en/解码明文仅适用于 ASCII 字符,并且会以静默方式损坏所有其他字符。为什么不使用 UTF-8 来代替?
- .net 命名约定说你应该对参数使用小写名称