ASP.net rijndael decrypt-要解密的数据长度

ASP.net rijndael decrypt-要解密的数据长度,asp.net,encryption,rijndaelmanaged,rijndael,Asp.net,Encryption,Rijndaelmanaged,Rijndael,到目前为止,我发现的很多东西都有点模糊或。。。不具体,所以我希望得到一个答案 我有两个小方法-看起来很简单的方法 private const string initVector = "1234567890123456"; private const string SaltValue = "ThisIsMySaltValue"; private const int KeySize = 256; public static string Encrypt(string

到目前为止,我发现的很多东西都有点模糊或。。。不具体,所以我希望得到一个答案

我有两个小方法-看起来很简单的方法

    private const string initVector = "1234567890123456";
    private const string SaltValue = "ThisIsMySaltValue";
    private const int KeySize = 256;

    public static string Encrypt(string textToEncrypt)
    {
        var rijndael = new RijndaelManaged {KeySize = KeySize};
        var salt = SaltValue.ToByteArray();
        var vector = initVector.ToByteArray();

        var rfcBytes = new Rfc2898DeriveBytes(vector, salt, 2);
        var key = rfcBytes.GetBytes(rijndael.KeySize/8);

        ICryptoTransform encrypt = rijndael.CreateEncryptor(key, vector);

        var stream = new MemoryStream();
        var data = Encoding.ASCII.GetBytes(textToEncrypt);
        stream.Write(data, 0, data.Length);

        var cryptoStream = new CryptoStream(stream, encrypt, CryptoStreamMode.Write);
        cryptoStream.Write(data, 0, data.Length);
        cryptoStream.FlushFinalBlock();

        cryptoStream.Close();
        return Convert.ToBase64String(stream.ToArray());
    }


    public static string Decrypt(string textToDecrypt)
    {
        var vector = initVector.ToByteArray();
        var salt = SaltValue.ToByteArray();
        var encrypted = textToDecrypt.ToByteArray();

        var rijndael = new RijndaelManaged {KeySize = KeySize};

        var rfcBytes = new Rfc2898DeriveBytes(vector, salt, 2);
        var key = rfcBytes.GetBytes(rijndael.KeySize/8);

        var decrypt = rijndael.CreateDecryptor(key, vector);

        var stream = new MemoryStream(encrypted);
        var cryptoStream = new CryptoStream(stream, decrypt, CryptoStreamMode.Read);

        byte[] plainBytes = new byte[textToDecrypt.Length];

        var decryptedLength = cryptoStream.Read(plainBytes, 0, plainBytes.Length);

        var plainText = Encoding.UTF8.GetString(plainBytes, 0, decryptedLength);
        return plainText;
    }
单元测试看起来像这样

    [Test]
    public void JustTestingThisOut()
    {
        var encryptMe = "SomethingToEncrypt";
        string result = encryptMe.ConvertToEncrypted();
        result.ShouldNotEqual(encryptMe);
        string backToReadAble = result.ConvertToDecrpted();
        backToReadAble.ShouldEqual(encryptMe);
    }
ToByteArray只执行返回编码.UTF8.GetBytes(toByte);我的测试字符串很简单——“SomethingToEncrypt”。我已经陷入了一个白兔洞,认为这可能是问题所在(Convert.ToBase64String和Convert.FromBase64String),但这似乎没有任何区别。至于错误

测试用例 '测试。加密。加密单元测试。仅测试输出' 失败: System.Security.Cryptography.CryptographyException异常 :要解密的数据的长度为 无效的在 System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(字节[]) inputBuffer,Int32 inputOffset,Int32 输入计数)


我有FlushFinalBlock()在里面,我想这样就可以了,但是……不,也没什么区别。有什么想法吗?尝试什么?

加密时,您首先将
数据
写入
,然后用
加密流
包装
,然后再次写入
数据
,这次是加密。为什么?解密失败,因为它遇到的第一件事是未加密的数据

在base64编码之前打印密文的值以验证这一点。你应该看到明文后面跟着一堆乱七八糟的东西,这就是密文


另外,您正在使用初始化向量作为密码。它们肯定不是同一件事,这样使用它会损害安全性。

我看不出这将如何像jeriley建议的那样工作,因为在解密函数中,您会这样做


var encrypted=textToDecrypt.ToByteArray();


这里textToDecrypt是一个base64字符串。您首先必须将base64转换回普通字节,然后使用这些字节进行解密

您的代码中潜伏着一个间歇性错误

决不能将任何System.Text.Encoding类用于密文。您将遇到间歇性错误。您应该使用Base64编码和System.Convert类方法

  • 要从加密字节[]获取加密字符串,应使用:
  • Convert.tobase64字符串(字节[]字节)

  • 要从要加密的字符串中获取原始字节[],应使用:
  • Convert.FromBase64String(字符串数据)

    另外一个注意事项是,在进行加密时,需要使用
    FlushFinalBlock()
    ,否则无法正确填充


    有关更多信息,请参阅安全专家肖恩·范宁女士的帖子,网址为

    ,我在某个时候看到过——文本后面的菱形问号。让我看看我能不能回到那个位置。关于静脉注射——是的,我知道,我只是想先让它起作用。我现在有一个用于测试的私有密码值,看起来像。。。private const string password=“Youtelling MethatathreeounceBirdCancarryaoNeboundCoach?”;:-)是的,猛拉那一行——stream.Write(data,0,data.Length);它是有效的。现在把有趣的东西连接起来。