【问题标题】:ASP.net rijndael decrypt - Length of data to decryptASP.net rijndael 解密 - 要解密的数据长度
【发布时间】:2010-12-13 02:06:35
【问题描述】:

到目前为止,我发现的很多项目都有些模糊或......不具体,所以我希望得到答案。

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

    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 只是返回 Encoding.UTF8.GetBytes(toByte);我的测试字符串很简单——“SomethingToEncrypt”。我已经陷入寻找this 的兔子洞,认为这可能是问题(Convert.ToBase64String 和 Convert.FromBase64String),似乎没有任何区别。至于报错……

测试用例 'Tests.Encryption.EncryptionUnitTests.JustTestingThisOut' 失败的: System.Security.Cryptography.CryptographicException :要解密的数据长度为 无效的。在 System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(字节[] 输入缓冲区,Int32 输入偏移量,Int32 输入计数)

我有 FlushFinalBlock() 在那里,我认为这样做,但......不,也没有什么区别。有任何想法吗?要尝试什么?

【问题讨论】:

    标签: asp.net encryption rijndaelmanaged rijndael


    【解决方案1】:

    加密时,首先将data 写入stream,然后用CryptoStream 包裹stream,然后再次写入data,这次是加密。为什么?解密失败,因为它首先遇到的是未加密的数据。

    打印密文之前 base64 编码的值来验证这一点。您应该会看到明文后面跟着一堆密文的 gobbledygook。

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

    【讨论】:

    • 我在某个时候看到过——文本后面的菱形问号。让我看看我是否无法恢复原状。关于 IV——是的,我知道,我只是想让它首先工作。我现在有一个用于测试的私有密码值,它看起来像... private const string password = "AreYouTellingMeThatAThreeOunceBirdCanCarryAOnePoundCoconut?"; :-)
    • 是的,抽出那一行——stream.Write(data, 0, data.Length);它有效。现在来连接有趣的东西。
    【解决方案2】:

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

    var encrypted = textToDecrypt.ToByteArray();

    这里的 textToDecrypt 是一个 base64 字符串。您首先必须将 base64 转换回普通字节,然后您可以使用它来解密。

    【讨论】:

      【解决方案3】:

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

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

      1. 要从加密字节[] 中获取加密字符串,您应该使用:

      Convert.ToBase64String(byte[] bytes)

      1. 要从要加密的字符串中获取原始字节[],您应该使用:

      Convert.FromBase64String(string data)

      还有一点需要注意的是,在进行加密时,您需要拥有FlushFinalBlock(),否则将无法正确填充。

      如需更多信息,请参阅 MS 安全大师 Shawn Fanning 的帖子http://blogs.msdn.com/b/shawnfa/archive/2005/11/10/491431.aspx

      【讨论】:

        猜你喜欢
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 2013-04-28
        • 1970-01-01
        • 1970-01-01
        • 2011-12-05
        • 2020-12-19
        相关资源
        最近更新 更多