Rijndael 加密/解密

本文关键字:解密 加密 Rijndael | 更新日期: 2023-09-27 17:57:00

我有以下用于加密和解密的代码。问题是,在解密时,除了解密的文本之外,我在文本后面还有一些"aaaaa"。为什么?需要一些帮助。感谢!

public static byte[] Encrypt(byte[] PlainTextBytes, string key , string InitialVector)
        {
            try
            {
                System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
               Byte[] KeyBytes = encoding.GetBytes(key);
                byte[] InitialVectorBytes = encoding.GetBytes(InitialVector); 
                RijndaelManaged SymmetricKey = new RijndaelManaged();
                ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes);
                MemoryStream MemStream = new MemoryStream();
                CryptoStream CryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write);
                CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length);
                CryptoStream.FlushFinalBlock();
                byte[] CipherTextBytes = MemStream.ToArray();
               return CipherTextBytes;
/

/decrytion

public static string Decrypt(byte[] PlainTextBytes1, string key, string InitialVector)
    {
        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
        Byte[] KeyBytes = encoding.GetBytes(key);
        RijndaelManaged SymmetricKey = new RijndaelManaged();
        byte[] InitialVectorBytes = Encoding.UTF8.GetBytes(InitialVector);
        ICryptoTransform Decryptor = SymmetricKey.CreateDecryptor(KeyBytes, InitialVectorBytes);
        MemoryStream MemStream1 = new MemoryStream(PlainTextBytes1);
        CryptoStream CryptoStream = new CryptoStream(MemStream1, Decryptor, CryptoStreamMode.Read);
        Byte[] pltxt = new byte[PlainTextBytes1.Length];
        CryptoStream.Read(pltxt, 0, pltxt.Length);
         ASCIIEncoding textConverter = new ASCIIEncoding();
         round = textConverter.GetString(pltxt);
          return round;
    }

我错在哪里?

Rijndael 加密/解密

在解密函数中,您有:

Byte[] pltxt = new byte[PlainTextBytes1.Length];

这是错误的,因为密码文本比纯文本长,因为它被填充以获得块大小的倍数。

 CryptoStream.Read(pltxt, 0, pltxt.Length);

Read返回实际返回的字节数。它不保证它会返回您请求的字节数。


然后还有许多其他缺陷/不良风格的东西:

  1. 传递给Decrypt的参数被称为PlainTextBytes1它应该被称为密码文本。
  2. 从字符串创建密钥/初始化字节的方式。ASCII 编码在这里是一个糟糕的选择。ASCII 不能表示任何字节字符串。也许您想十六进制 en/解码一个两倍于密钥大小的字符串?
  3. ASCII
  4. en/解码明文仅适用于 ASCII 字符,并且会以静默方式损坏所有其他字符。为什么不使用 UTF-8 来代替?
  5. .net 命名约定说你应该对参数使用小写名称