2013-02-27 66 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

相關問題