首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CFB-8模式的Mono.Security.Cryptography RijndaelManaged类问题

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

Stack Overflow用户
提问于 2012-09-14 21:42:52
回答 1查看 1.7K关注 0票数 2

我写信是为了报道密码学的问题。这个问题发生在使用来自RijndaelManagedSystem.Security.Cryptography类。对于我来说,在没有填充( RijndaelManagedPaddingMode.None)的情况下使用CFB-8 (FeedbackSize = 8)模式是很重要的。这样的设置配置使加密的数据大小与解密的数据大小相等。

不幸的是,Mono ( v2.0.8152)编译后的代码在使用消息进行数据加密时抛出异常:

代码语言:javascript
复制
[Unhandled Exception: System.Security.Cryptography.CryptographicException: invalid block length at Mono.Security.Cryptography.SymmetricTransform.FinalEncrypt]. 

我使用本机Visual 2010编译器在Windows和Windows7下使用.NET框架4.0进行了测试。我发现本机.NET编译器不会抛出任何异常,并且代码示例运行良好。

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

为什么Mono会抛出这个异常?

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

代码语言:javascript
复制
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);


      }
   } 
}

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

代码语言:javascript
复制
// 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);
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-19 09:06:04

窃听器修好了。源可以从mono存储库中获取。

硕士: e094d3dc0cf186f1de32d5340d847dc18aeca0e2

单-2-10:98e4842eb19dfd60000ada 19 e9bfb265fad7c84b

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12432365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档