[英]AES string encryption/decryption characters are spaced out
I'm encrypting and then decrypting a string using AES. 我正在使用AES加密然后解密字符串。 But my output looks like this: 但我的输出看起来像这样:
Original text >> HI WORLD
Decrypted text >> H I W O R L D
I have tried a lot of code but I have not found the problem. 我尝试了很多代码,但我没有发现问题。
Where is the problem here? 这里的问题在哪里?
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;
}
}
You are using different Encoding to GetBytes and GetString: 您正在使用不同的编码来GetBytes和GetString:
ASCIIEncoding.Unicode.GetBytes(originalText);
and then 接着
Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount)
Try to use same one for both operations. 尝试对两个操作使用相同的操作。
Kris 短剑的一种
You are making a mess with your string encodings. 你正在搞乱你的字符串编码。 ASCIIEncoding.Unicode
is, basically, nonsense. ASCIIEncoding.Unicode
基本上是无稽之谈。 (Actually, it is just the same as Encoding.Unicode
, but written in a misleading way.) (实际上,它与Encoding.Unicode
相同,但以误导的方式编写。)
Which encoding do you want to use? 您想使用哪种编码? UTF-16, UTF-8, or ASCII? UTF-16,UTF-8还是ASCII? According to the choice, use either Encoding.Unicode
, Encoding.UTF8
, or Encoding.ASCII
, and stick to it. 根据选择,使用Encoding.Unicode
, Encoding.UTF8
或Encoding.ASCII
,并坚持下去。 I would presume UTF-8 is the best choice, therefore, use this: 我认为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.