我正在实现自己的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)用相应的字符串填充字节数组(要加密的字符串或要解密的字符串)。 我做错了什么?
答案 0 :(得分:4)
您从Encrypt
获得的二进制文件不表示文本数据,因此您不应使用Encoding
。请改用Convert.ToBase64String
和Convert.FromBase64String
来反转它。 See also
在解码步骤中,您需要反转顺序;所以:如果你正在进行字符串输入,你将需要:
加密:
"12"
Encoding
(最好Encoding.UTF8
)获取加密byte[]
Encrypt
与未加密的byte[]
一起使用以获取加密的byte[]
Convert.ToBase64String
将其表示为字符串解密:
Convert.FromBase64String
获取加密的byte[]
Decrypt
加密byte[]
来获取未加密的byte[]
Encoding
来获取字符串"12"
答案 1 :(得分:0)
您在哪里设置EncryptBufferInput
和DecryptBufferInput
?我认为你的Encrypt
和Decrypt
方法都采用字符串,所以我试试这个:
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。