【发布时间】:2020-10-27 06:01:30
【问题描述】:
我正在尝试使用 AES 256 加密/解密二进制文件。 当我加密它时,显然字节没有问题。 但是,当我解密加密的二进制文件时,它会返回一个包含大量字节 = 0x3F (0011 1111) 的新二进制文件。我认为这些字节是 > 127 值,因为正确解密的其他字节是
我认为存在符号问题,但我使用的是接受 0 到 255 值的字节类型。 其他可能性是编码问题。
我的解密函数:
static public byte[] AESDecrypt(byte[] ct, byte[] key, byte[] IV)
{
byte[] ret = new byte[ct.Length];
Aes AES = Aes.Create();
ICryptoTransform Decryptor = AES.CreateDecryptor(key, IV);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, Decryptor, CryptoStreamMode.Write))
cs.Write(ct, 0, ct.Length);
ret = ms.ToArray();
}
return ret;
}
cs.Write() 已经为每个大于 127 的字节返回一个 int 值 = 0x3F。
函数调用:
byte[] pt = { 128, (byte)'t', (byte)'e', (byte)'s', (byte)'t' };
byte[] ct = AESEncrypt(pt, AESStorageKey, AESStorageIV);
byte[] pt2 = AESDecrypt(ct, AESStorageKey, AESStorageIV);
txtPassword.Text = pt[0].ToString() + " " + ct[0].ToString() + " " + pt2[0].ToString();
TextBox 中的输出为:“128 183 63” 请注意,63 是 0x3F 值(0011 1111),但正确返回的应该是 128。
好的,在您对 StreamReader/StreamWriter 和二进制处理的帮助下,我发现了错误。那是在 Encrypt 函数中,因为我使用 StreamWriter 来处理二进制数据。现在我已经修好了!谢谢大家!
加密函数:
static public byte[] AESEncrypt(byte[] pt, byte[] key, byte[] IV)
{
byte[] ret;
AesManaged AES = new AesManaged();
ICryptoTransform Encryptor = AES.CreateEncryptor(key, IV);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, Encryptor, CryptoStreamMode.Write))
cs.Write(pt, 0, pt.Length); //The correct binary handling
// Here was the error before:
//using (StreamWriter sw = new StreamWriter(cs))
// sw.Write(Encoding.ASCII.GetString(pt));
ret = ms.ToArray();
}
return ret;
}
【问题讨论】:
-
如果您将字节 in 传递给此方法,并检索此方法的字节 out,您为什么要搞乱 字符串?从您的编码和解码路径中删除任何字符串类型的代码,这样会更快乐。
-
我正在尝试加密/解密二进制文件... 那么不应使用
StreamReader,它只会损坏您的数据。
标签: c# encryption cryptography aes unsigned