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);
}
}
}