簡體   English   中英

AES字符串加密/解密字符間隔開

[英]AES string encryption/decryption characters are spaced out

我正在使用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;
    }
}

您正在使用不同的編碼來GetBytes和GetString:

ASCIIEncoding.Unicode.GetBytes(originalText);

接着

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

嘗試對兩個操作使用相同的操作。

短劍的一種

你正在搞亂你的字符串編碼。 ASCIIEncoding.Unicode基本上是無稽之談。 (實際上,它與Encoding.Unicode相同,但以誤導的方式編寫。)

您想使用哪種編碼? UTF-16,UTF-8還是ASCII? 根據選擇,使用Encoding.UnicodeEncoding.UTF8Encoding.ASCII ,並堅持下去。 我認為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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM