91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

探討.NET Core數據加密和解密問題

發布時間:2020-07-11 16:08:28 來源:網絡 閱讀:320 作者:胡壯壯 欄目:編程語言

    

前言

一直困擾著我關于數據加密這一塊,24號晚上用了接近3個小時去完成一項任務,本以為立馬能解決,但是為了保證數據的安全性,我們開始去對數據進行加密,然后接下來3個小時專門去研究加密這一塊,然而用著用著卻發現了一點問題,于是下班回來到寫這篇博客到深夜才正式解決,請往下看。

3DES數據加密

由于數據需要獲取出來并顯示于是只能使用對稱加密,關于加密這一塊網上對于.NET Framework的實現數不勝數,好像對于.NET Core這一塊比較少,于是就開始進行研究。這個時候就利用DES或者Triple DES也稱作3DES,全名為Triple Data Encryption Algorithm (TDEA or Triple DEA),也就是對稱密碼塊密碼,3DES對數據的每個數據塊利用算法進行3次加密,最初開始設計該算法時,位數只有56位也就是7個字節,設計者認為已經足夠用,但是隨著計算機的高速發展,暴露破解已經使得該算法呈現的問題日益突出,而3DES算法的出現提供了一種比較簡單的方法來增加密鑰的大小從而防止***,而不是重新設計一套全新的分組密碼算法。

3DES加密算法命名

定義算法最早期的標準被放在ANS X9.52中并在1998年發布并將其描述為三重數據加密算法(簡稱TDEA),在ANSI X3.92中定義了該算法的三個操作但是并沒有使用DES或者3DES,直到1999年發布的FIPS PUB 46-3在正式命名三重數據加密算法,大概在2004到2005的樣子才正式引入三重數據加密算法,之前一直以TDEA存在著,也就是說TDEA就是3DES,但是沒有使用3DES作為標準術語。

3DES算法邏輯

三重數據加密算法使用包括密鑰K1,密鑰K2和密鑰約束K3,每一個包含56位不包含奇偶校驗,算法實現公式如下:

ciphertext = EK3(DK2(EK1(plaintext)))

密文 = EK3(DK2(EK1(平文)))

用K1對數據進行加密,用K2對數據進行解密,用K3對數據再加密。

解密公式為如下:

plaintext = DK1(EK2(DK3(ciphertext)))

平文 = DK1(EK2(DK3(密文)))

用K3j對數據進行解密,用K2對數據進行加密,用K1對數據進行加密。每次加密都處理64位數據并形成一塊。

3DES加密選項

定義了三種密鑰選項。

(1)三個密鑰相互獨立。

(2)K1和K2密鑰獨立,但K1 = K3。

(3)三個密鑰相等。

密鑰選項1的強度最高,擁有3 x 56 = 168個獨立的密鑰位。

密鑰選項2的安全性稍低,擁有2 x 56 = 112個獨立的密鑰位。該選項比簡單的應用DES兩次的強度較高,即使用K1和K2,因為它可以防御中途相遇***。

密鑰選項3等同與DES,只有56個密鑰位。這個選項提供了與DES的兼容性,因為第1和第2次DES操作相互抵消了。該選項不再為國家標準科技協會(NIST)所推薦,亦不為ISO/IEC 18033-3所支持。

利用3DES在.NET Framework中實現加密和解密

我們看下在.NET Framework中對于3DES的具體實現,如下:

探討.NET Core數據加密和解密問題

           DesEncrypt( input, [] inputArray == ====[] resultArray = cTransform.TransformFinalBlock(inputArray,  Convert.ToBase64String(resultArray,    DesDecrypt( input, [] inputArray == ====[] resultArray = cTransform.TransformFinalBlock(inputArray,

探討.NET Core數據加密和解密問題

我們給出一個16位的加密密鑰,然后對相應數據進行加密和解密

            var name = "Jeffcky";            var encryptStr = DesEncrypt(name, "sblw-3hn8-sqoy19");
            Console.WriteLine(name);            var decryptStr = DesDecrypt(encryptStr, "sblw-3hn8-sqoy19");
            Console.WriteLine(decryptStr);

探討.NET Core數據加密和解密問題

探討.NET Core數據加密和解密問題 

我們定義密鑰為16個字節,即此時應該是有兩個密鑰,但是此時密鑰卻不同,所以猜測內部實現的3DES密碼選項中的第二項,因為密鑰3和密鑰1相等,既然沒出錯,內部應該會去拿密鑰1中的位數作為密鑰3的位數。接下里我們再來看在.NET Core中的情況。

利用3DES在.NET Core實現加密和解密

由于在.NET Core中不存在 TripleDESCryptoServiceProvider 取而代之的是 TripleDES ,所以此時我們的代碼需要稍作修改,如下:

探討.NET Core數據加密和解密問題

        public static string DesEncrypt(string input, string key)
        {            byte[] inputArray = Encoding.UTF8.GetBytes(input);            var tripleDES = TripleDES.Create();            var byteKey = Encoding.UTF8.GetBytes(key);
            tripleDES.Key = byteKey;
            tripleDES.Mode = CipherMode.ECB;
            tripleDES.Padding = PaddingMode.PKCS7;
            ICryptoTransform cTransform = tripleDES.CreateEncryptor();            byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }        public static string DesDecrypt(string input, string key)
        {            byte[] inputArray = Convert.FromBase64String(input);            var tripleDES = TripleDES.Create();            var byteKey = Encoding.UTF8.GetBytes(key);
            tripleDES.Key = byteKey;
            tripleDES.Mode = CipherMode.ECB;
            tripleDES.Padding = PaddingMode.PKCS7;
            ICryptoTransform cTransform = tripleDES.CreateDecryptor();            byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);            return Encoding.UTF8.GetString(resultArray);
        }

探討.NET Core數據加密和解密問題

接著進行調用:

            var name = "Jeffcky";            var encryptStr = DesEncrypt(name, "sblw-3hn8-sqoy19");
            Console.WriteLine(name);            var decryptStr = DesDecrypt(encryptStr, "sblw-3hn8-sqoy19");
            Console.WriteLine(decryptStr);

探討.NET Core數據加密和解密問題 

結果出錯了詳細信息如下:

System.Security.Cryptography.CryptographicException:“Specified key is not a valid size for this algorithm.”

由上說明我們給出密鑰的大小對于3DES對稱加密算法時無效的,為何呢,在.NET Framework是好使的呀,當我們調試時將鼠標放在3DES中密鑰時你會發現它實際需要的字節為24個字節,而我們只提供了16個字節,如下:

探討.NET Core數據加密和解密問題 

所以到這里我們應該知道問題出在什么地方了,根據我們對3DES的介紹內部實現的選項應該是密鑰選項2,將密鑰1和密鑰2獨立開來,而密鑰3和密鑰相同,在.NET Framework中我們只要兩個密鑰即可,因為第三個密鑰和第一個相同,既然沒出錯肯定是內部重用了密鑰1,但是在.NET Core需要我們給出24個字節,說明即使密鑰1和密鑰3相同也要我們提供密鑰的字節,所以我們只要將密鑰1中的八個字節拷貝到密鑰3中,這樣就有了24個字節,實現如下:

探討.NET Core數據加密和解密問題

        public static string DesEncrypt(string input, string key)
        {            byte[] inputArray = Encoding.UTF8.GetBytes(input);            var tripleDES = TripleDES.Create();            var byteKey = Encoding.UTF8.GetBytes(key);            byte[] allKey = new byte[24];            Buffer.BlockCopy(byteKey, 0, allKey, 0, 16);
            Buffer.BlockCopy(byteKey, 0, allKey, 16, 8);
            tripleDES.Key = allKey;
            tripleDES.Mode = CipherMode.ECB;
            tripleDES.Padding = PaddingMode.PKCS7;
            ICryptoTransform cTransform = tripleDES.CreateEncryptor();            byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }        public static string DesDecrypt(string input, string key)
        {            byte[] inputArray = Convert.FromBase64String(input);            var tripleDES = TripleDES.Create();            var byteKey = Encoding.UTF8.GetBytes(key);            byte[] allKey = new byte[24];            Buffer.BlockCopy(byteKey, 0, allKey, 0, 16);
            Buffer.BlockCopy(byteKey, 0, allKey, 16, 8);
            tripleDES.Key = allKey;
            tripleDES.Mode = CipherMode.ECB;
            tripleDES.Padding = PaddingMode.PKCS7;
            ICryptoTransform cTransform = tripleDES.CreateDecryptor();            byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);            return Encoding.UTF8.GetString(resultArray);
        }

探討.NET Core數據加密和解密問題

此時我們再來看下打印結果:

探討.NET Core數據加密和解密問題

            var name = "Jeffcky";
            Console.WriteLine($"加密字符串為{name}");            var encryptStr = DesEncrypt(name, "sblw-3hn8-sqoy19");
            Console.WriteLine($"加密后結果為:{encryptStr}");            var decryptStr = DesDecrypt(encryptStr, "sblw-3hn8-sqoy19");
            Console.WriteLine($"解密后字符串為{decryptStr}");

探討.NET Core數據加密和解密問題

探討.NET Core數據加密和解密問題 


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

读书| 宽甸| 卢龙县| 巩留县| 库伦旗| 怀安县| 买车| 宿迁市| 松桃| 灵璧县| 雷波县| 奈曼旗| 焦作市| 阜康市| 苏尼特左旗| 青海省| 湖州市| 石阡县| 镇安县| 汽车| 朔州市| 象山县| 锦州市| 潜江市| 邓州市| 新丰县| 揭阳市| 柳江县| 新津县| 塔城市| 云安县| 宝丰县| 平原县| 环江| 璧山县| 寻乌县| 清河县| 普格县| 格尔木市| 渑池县| 正安县|