2011-10-04 187 views
1

我正在使用AES加密并解密字符串。但我的输出如下所示:AES字符串加密/解密字符间隔出来

Original text >> HI WORLD 
Decrypted text >> H I W O R L D 

我已经尝试了很多代码,但是我没有找到问题。

问题在哪里?

class Program 
{ 
    public static void Main(string[] args) 
    { 
     byte[] aesKey = Cryptography.GenerateAes128Key(); 
     Console.WriteLine("AES key >> " + aesKey.Length); 
     string originalText = "HI WORLD"; 
     byte[] myMess = ASCIIEncoding.Unicode.GetBytes(originalText); 
     Console.WriteLine("Original text >> " + ASCIIEncoding.Unicode.GetString(myMess)); 
     byte[] myEcnryptedMess = Cryptography.Encrypt(myMess, aesKey); 
     Console.WriteLine("Encrypted text >> " + ASCIIEncoding.Unicode.GetString(myEcnryptedMess)); 
     Console.WriteLine("Decrypted text >> " + Cryptography.Decrypt(myEcnryptedMess, aesKey)); 
     Console.WriteLine("Press any key to continue . . . "); 
     Console.ReadKey(true); 
    } 

    public static byte[] Encrypt(byte[] plainTextBytes, byte[] Key) 
    { 
     byte[] iv = new byte[Key.Length]; 
     Aes myAes = Aes.Create(); 
     ICryptoTransform encryptor = myAes.CreateEncryptor(Key, iv); 
     MemoryStream memoryStream = new MemoryStream(); 
     CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write); 
     cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); 
     cryptoStream.FlushFinalBlock(); 
     byte[] cipherTextBytes = memoryStream.ToArray(); 
     // Close both streams. 
     memoryStream.Close(); 
     cryptoStream.Close(); 
     return cipherTextBytes; 
    } 

    public static string Decrypt(byte[] cipherTextBytes, byte[] Key) 
    { 
     byte[] iv = new byte[Key.Length]; 
     Aes myAes = Aes.Create(); 
     ICryptoTransform decryptor = myAes.CreateDecryptor(Key, iv); 
     MemoryStream memoryStream = new MemoryStream(cipherTextBytes); 
     CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read); 
     byte[] plainTextBytes = new byte[cipherTextBytes.Length]; 
     // Start decrypting. 
     int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); 
     // Close both streams. 
     memoryStream.Close(); 
     cryptoStream.Close(); 
     // Convert decrypted data into a string. 
     // Let us assume that the original plaintext string was UTF8-encoded. 
     string plainText = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); 
     // Return decrypted string. 
     return plainText; 
    } 
} 
+0

自己做呢? –

+0

您不应该仅仅因为您已经自己解决了问题而只是删除正确提问的问题。你在这里不仅是为了获得帮助,这应该是一个信息来源,即使对于来到这里也有相同(或类似)问题的其他人。 – Mormegil

回答

3

您正在使用不同的编码来GetBytes会和GetString:

ASCIIEncoding.Unicode.GetBytes(originalText); 

然后

Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount) 

尝试使用同一个两个操作。

Kris

1

你正在弄乱你的字符串编码。基本上,废话是ASCIIEncoding.Unicode。 (实际上,它与Encoding.Unicode一样,但是以误导的方式编写。)

您想使用哪种编码? UTF-16,UTF-8或ASCII码?根据选择,使用Encoding.Unicode,Encoding.UTF8或,并坚持下去。我会假定UTF-8是最好的选择,因此,使用此:

// ... 
string originalText = "HI WORLD"; 
byte[] myMess = Encoding.UTF8.GetBytes(originalText); 
Console.WriteLine("Original text >> " + Encoding.UTF8.GetString(myMess)); 
byte[] myEcnryptedMess = Cryptography.Encrypt(myMess, aesKey); 
Console.WriteLine("Encrypted text >> " + Encoding.UTF8.GetString(myEcnryptedMess)); 
Console.WriteLine("Decrypted text >> " + Cryptography.Decrypt(myEcnryptedMess, aesKey));