關於遇到的 C# DES 解密出現 "CryptographicException:不正確的數據"

tomcat中的加密程序需要換到iis中,用起了 C#中的 DESCryptoServiceProvider,上網找了些相關流程寫了個類,感覺比java的程序精簡。

但測試中發現異常,同一次測試中,加密,解密都正常。但把加密的base64字符串,再另外測試就出現“不正確的數據”的提示。

然後再上網對比了很多,沒看到什麼不對的地方。程序如下:

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

namespace Cproject.capp
{
    public static class Crypt
    {
        private static DESCryptoServiceProvider crypt = new DESCryptoServiceProvider();
        private static bool bInit = false;
        public static void init()
        {
            if (bInit == false)
            {
                bInit = true;
                //crypt.IV = Encoding.UTF8.GetBytes("87654321");  //這裏需要添加一行
                crypt.Key = Encoding.UTF8.GetBytes("12345678");
                crypt.Mode = CipherMode.CBC;
                crypt.Padding = PaddingMode.PKCS7;
            }
        }

        public static String encrypt(String str)
        {
            init();
            //用UTF-8編碼,轉爲byte[]
            byte[] bysData = Encoding.UTF8.GetBytes(str);
            //因為PaddingMode.None的關係, byte[]的長度要是8的倍數
            //byte[] bysFixSizeData = new byte[(int)Math.Ceiling(bysData.Length / 8.0) * 8];
            //將資料複製到長度為8的倍數的byte[]
            //Array.Copy(bysData, bysFixSizeData, bysData.Length);

            //進行加密
            byte[] bysEncrypted = crypt.CreateEncryptor().TransformFinalBlock(bysData, 0, bysData.Length);
            //將byte[]轉為Base64的字串
            return Convert.ToBase64String(bysEncrypted);
        }

        public static String decrypt(String str)
        {
            init();
            byte[] bysData = Convert.FromBase64String(str);

            //進行解密
            byte[] bysDecrypted = crypt.CreateDecryptor().TransformFinalBlock(bysData, 0, bysData.Length);
            return Encoding.UTF8.GetString(bysDecrypted);
        }
    }
}


後來看了一下msdn關於 DESCryptoServiceProvider 的 成員,看到了一個IV的屬性,裏面有這一段描述:

若要解密使用其中一個 SymmetricAlgorithm 類加密的數據,必須將 Key 屬性和 IV 屬性設置爲用於加密的相同值。


意思就是另外需要再設置一個IV,這個IV跟Key的長度要一致,默認是 8 個字節。

測試終於成功通過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章