Mono.Security.Cryptography RijndaelManaged类问题使用CFB-8模式

Mono.Security.Cryptography RijndaelManaged类问题使用CFB-8模式,mono,monodevelop,Mono,Monodevelop,我写这封信是为了报告密码问题。使用System.Security.Cryptography中的RijndaelManaged类发生问题。使用RijndaelManaged和CFB-8(FeedbackSize=8)模式而不填充(PaddingMode.None)对我来说很重要。这样的设置配置使加密的数据大小等于解密的数据大小 不幸的是,Mono(针对MVS2010 IDE v2.0.8152的Mono编译器)编译的代码在数据加密时引发异常,消息为: [Unhandled Exception: S

我写这封信是为了报告密码问题。使用
System.Security.Cryptography
中的
RijndaelManaged
类发生问题。使用
RijndaelManaged
CFB-8
(FeedbackSize=8)模式而不填充(
PaddingMode.None
)对我来说很重要。这样的设置配置使加密的数据大小等于解密的数据大小

不幸的是,Mono(针对MVS2010 IDE v2.0.8152的Mono编译器)编译的代码在数据加密时引发异常,消息为:

[Unhandled Exception: System.Security.Cryptography.CryptographicException: invalid block length at Mono.Security.Cryptography.SymmetricTransform.FinalEncrypt]. 
我在Windows XP和Windows 7下使用.NET framework 4.0进行了测试,使用的是本机Visual Studio 2010编译器。我发现本机Microsoft.NET编译器不会抛出任何异常,代码示例运行良好

下面我粘贴了两个示例(复制代码),一个用于引发异常的Mono,另一个用于本机C#编译器。在本例中,没有异常。此外,我还粘贴了在线编译器的链接以测试代码

为什么Mono编译器会引发此异常?


单代码示例(用于测试的在线编译器)


本机C#代码示例(用于测试的在线编译器)


该错误已修复。这些源代码可以从MonoGit存储库中获取

母版:e094d3dc0cf186f1de32d5340d847dc18aeca0e2


mono-2-10:98e4842eb19dfd60000ada19e9bfb265fad7c84b

您知道修复的bug ID是什么吗?
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

namespace Dela.Mono.Examples
{
   public class HelloWorld
   {
      public static void Main(string[] args)
      {
         string plainText = "This will be encrypted.";
            string plainText2 = "";

            RijndaelManaged aesAlg = new RijndaelManaged();

            aesAlg.BlockSize = 128;
            aesAlg.KeySize = 256;
            aesAlg.Mode = CipherMode.CFB;
            aesAlg.FeedbackSize = 8;
            aesAlg.Padding = PaddingMode.None;

            aesAlg.GenerateKey();
            aesAlg.GenerateIV();

            ICryptoTransform encryptor = aesAlg.CreateEncryptor();

            MemoryStream msEncrypt = new MemoryStream();
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) {
                    swEncrypt.Write(plainText);
                }
            }

            Console.WriteLine(msEncrypt.ToArray().Length); 
            Console.WriteLine(System.Text.Encoding.UTF8.GetString(msEncrypt.ToArray()));

            byte[] customArray = msEncrypt.ToArray();

            ICryptoTransform decryptor = aesAlg.CreateDecryptor();

            MemoryStream msDecrypt = new MemoryStream(customArray);
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) {
                using (StreamReader swDecrypt = new StreamReader(csDecrypt)) {
                    plainText2 = swDecrypt.ReadToEnd();
                }
            }

            Console.WriteLine(plainText2.Length); 
            Console.WriteLine(plainText2);


      }
   } 
}
// Rextester.Program.Main is the entry point for your code. Don't change it.

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string plainText = "This will be encrypted.";
            string plainText2 = "";

            RijndaelManaged aesAlg = new RijndaelManaged();

            aesAlg.BlockSize = 128;
            aesAlg.KeySize = 256;
            aesAlg.Mode = CipherMode.CFB;
            aesAlg.FeedbackSize = 8;
            aesAlg.Padding = PaddingMode.None;

            aesAlg.GenerateKey();
            aesAlg.GenerateIV();

            ICryptoTransform encryptor = aesAlg.CreateEncryptor();

            MemoryStream msEncrypt = new MemoryStream();
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) {
                    swEncrypt.Write(plainText);
                }
            }

            Console.WriteLine(msEncrypt.ToArray().Length); 
            Console.WriteLine(System.Text.Encoding.UTF8.GetString(msEncrypt.ToArray()));

            byte[] customArray = msEncrypt.ToArray();

            ICryptoTransform decryptor = aesAlg.CreateDecryptor();

            MemoryStream msDecrypt = new MemoryStream(customArray);
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) {
                using (StreamReader swDecrypt = new StreamReader(csDecrypt)) {
                    plainText2 = swDecrypt.ReadToEnd();
                }
            }

            Console.WriteLine(plainText2.Length); 
            Console.WriteLine(plainText2);
        }
    }
}