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

时间:2013-02-27 09:26:06

标签: c# encryption cryptography aes

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

2 个答案:

答案 0 :(得分:4)

您从Encrypt获得的二进制文件表示文本数据,因此您不应使用Encoding。请改用Convert.ToBase64StringConvert.FromBase64String来反转它。 See also

在解码步骤中,您需要反转顺序;所以:如果你正在进行字符串输入,你将需要:

加密:

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

解密:

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

答案 1 :(得分: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。