字符串到字节[]数组,反之亦然

本文关键字:反之亦然 数组 到字节 字符串 | 更新日期: 2023-09-27 18:01:16

我正在实现自己的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)用相应的字符串(要加密的字符串或要解密的字符串)填充字节数组。我做错了什么?

字符串到字节[]数组,反之亦然

您从Encrypt得到的二进制文件不是表示文本数据,所以您不应该使用Encoding。用Convert.ToBase64String代替,用Convert.FromBase64String代替。参见.

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

加密:

  • 开头:"12"
  • 使用Encoding(最好是Encoding.UTF8)来获得byte[]来加密
  • 使用Encrypt和未加密的byte[]来获得加密的byte[]
  • 使用Convert.ToBase64String表示为字符串如果你需要
  • 以加密字符串
  • 结尾

解密:

  • 以加密字符串
  • 开头
  • 使用Convert.FromBase64String获取加密的byte[]
  • 使用Decrypt和加密的byte[]来获得未加密的byte[]
  • 使用相同的 Encoding来获取字符串
  • end with string: "12"

如何设置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。