1

我正在实现自己的 AES 代码,但在解密过程中遇到了一些问题。

byte[] output;
output = Encrypt(EncryptBufferInput);//encrypt "12",output[] is 300532188151293E4ACA3BA529B821C1
str.Append(Encoding.ASCII.GetString(output) );

output = Decrypt(DecryptBufferInput);//in hex, DecryptBufferInput should be "300532188151293E4ACA3BA529B821C1"
str.Append(Encoding.ASCII.GetString(output));//does not decrypt back to "12"

所以,如果我尝试加密“12”,它会给我一个十六进制形式的“300532188151293E4ACA3BA529B821C1”值。当我尝试将其解密回“12”时,它给了我一个错误的值,因为 DecryptBufferInput 不是“300532188151293E4ACA3BA529B821C1”而是其他一些值......只有前几个值是相同的。EncryptBufferInput 和 DecryptBufferInput 都是 byte[] 数组,我使用 Encoding.ASCII.GetBytes(string) 用相应的字符串(要加密的字符串或要解密的字符串)填充字节数组。我究竟做错了什么??

4

2 回答 2

4

您从中获得的二进制文件Encrypt不代表文本数据,因此您不应使用Encoding. 改为使用Convert.ToBase64StringConvert.FromBase64String反转它。另请参阅

在解码步骤中,需要颠倒顺序;所以:如果你正在接受字符串输入,你将需要:

加密:

  • 以字符串开头:"12"
  • 使用Encoding(preferably Encoding.UTF8) 获取 abyte[]进行加密
  • Encrypt与未加密一起使用byte[]以获取加密byte[]
  • Convert.ToBase64String如果需要,可以将其表示为字符串
  • 以加密字符串结尾

解密:

  • 以加密字符串开头
  • 用于Convert.FromBase64String获取加密byte[]
  • Decrypt与加密一起使用byte[]以获取未加密的byte[]
  • 使用相同 Encoding的获取字符串
  • 以字符串结尾:"12"
于 2013-02-27T09:30:24.367 回答
0

你在哪里设置EncryptBufferInputDecryptBufferInput?我认为你的EncryptDecrypt方法都带字符串,所以我会试试这个:

byte[] output = Encrypt(EncryptBufferInput);
string encryptedOutput = Convert.ToBas64String(output);
str.Append(encryptedOutput);

byte[] decrypted = Decrypt(Convert.FromBase64String(encryptedOutput));
string decryptedOutput = Encoding.ASCII.GetString(decrypted);
str.Append(decryptedOutput);

如果他们采取byte[]

byte[] output = Encrypt(EncryptBufferInput);
string encryptedOutput = Convert.ToBase64String(output);
str.Append(encryptedOutput);

byte[] decrypted = Decrypt(output);
string decryptedOutput = Encoding.ASCII.GetString(decrypted);
str.Append(decryptedOutput);

请注意:ASCII 和泰语、德语、俄语、希腊语(以及许多其他语言)不能很好地结合使用——使用 Unicode 或至少 UTF8。

于 2013-02-27T09:30:16.507 回答