2013-02-27 92 views
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)来填充字节数组和相应的字符串(要加密的字符串或要解密的字符串)。 我在做什么错?

+0

什么是'EncryptBufferInput'和'DecryptBufferInput'的类型? “加密”和“解密”的签名是什么? 'DecryptBufferInput'的值来自哪里?请提供更多信息。你的代码似乎有一些缺陷,但我们不能猜出任何东西,除非你告诉我们你是如何做的。 – 2013-02-27 09:34:27

回答

4

您从Encrypt得到的二进制确实是不是代表文本数据,所以您不应该使用Encoding。改为使用Convert.ToBase64String,然后使用Convert.FromBase64String将其反转。 See also

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

加密:

  • 开始用绳子:"12"
  • 使用Encoding(最好Encoding.UTF8)获得byte[]加密
  • 使用Encrypt与未加密的byte[]得到加密byte[]
  • 使用Convert.ToBase64String表示作为一个字符串如果你需要
  • 结束与加密的字符串

解密:

  • 开始使用加密的字符串
  • 使用Convert.FromBase64String获得与加密byte[]加密byte[]
  • 使用Decrypt得到未加密byte[]
  • us Ë相同Encoding得到串
  • 结束与字符串:"12"
+0

感谢您的详细解决方案!我马上试试它! – coffeeak 2013-02-27 09:39:32

+0

它正在解密到正确的值。谢谢@Marc Gravell – coffeeak 2013-02-27 09:45:50

+0

@ user1109363 http://tiny.cc/io有更多关于何时使用'Encoding'和何时使用base-n的信息 – 2013-02-27 09:49:13

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。

+2

使用ASCII将加密的二进制转换为字符串简直是错误的:这完全是向后使用编码;这里的二进制*不代表文本数据* – 2013-02-27 09:37:41

+0

你是对的 - 我错过了。当然,之前应该将其转换为BASE64。我会修好我的样品。 – 2013-02-27 09:45:26

相关问题