成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

探討.NETCore數(shù)據(jù)加密和解密問題

    

我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、昆明ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的昆明網(wǎng)站制作公司

前言

一直困擾著我關(guān)于數(shù)據(jù)加密這一塊,24號(hào)晚上用了接近3個(gè)小時(shí)去完成一項(xiàng)任務(wù),本以為立馬能解決,但是為了保證數(shù)據(jù)的安全性,我們開始去對(duì)數(shù)據(jù)進(jìn)行加密,然后接下來3個(gè)小時(shí)專門去研究加密這一塊,然而用著用著卻發(fā)現(xiàn)了一點(diǎn)問題,于是下班回來到寫這篇博客到深夜才正式解決,請(qǐng)往下看。

3DES數(shù)據(jù)加密

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

3DES加密算法命名

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

3DES算法邏輯

三重?cái)?shù)據(jù)加密算法使用包括密鑰K1,密鑰K2和密鑰約束K3,每一個(gè)包含56位不包含奇偶校驗(yàn),算法實(shí)現(xiàn)公式如下:

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

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

用K1對(duì)數(shù)據(jù)進(jìn)行加密,用K2對(duì)數(shù)據(jù)進(jìn)行解密,用K3對(duì)數(shù)據(jù)再加密。

解密公式為如下:

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

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

用K3j對(duì)數(shù)據(jù)進(jìn)行解密,用K2對(duì)數(shù)據(jù)進(jìn)行加密,用K1對(duì)數(shù)據(jù)進(jìn)行加密。每次加密都處理64位數(shù)據(jù)并形成一塊。

3DES加密選項(xiàng)

定義了三種密鑰選項(xiàng)。

(1)三個(gè)密鑰相互獨(dú)立。

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

(3)三個(gè)密鑰相等。

密鑰選項(xiàng)1的強(qiáng)度最高,擁有3 x 56 = 168個(gè)獨(dú)立的密鑰位。

密鑰選項(xiàng)2的安全性稍低,擁有2 x 56 = 112個(gè)獨(dú)立的密鑰位。該選項(xiàng)比簡(jiǎn)單的應(yīng)用DES兩次的強(qiáng)度較高,即使用K1和K2,因?yàn)樗梢苑烙型鞠嘤?**。

密鑰選項(xiàng)3等同與DES,只有56個(gè)密鑰位。這個(gè)選項(xiàng)提供了與DES的兼容性,因?yàn)榈?和第2次DES操作相互抵消了。該選項(xiàng)不再為國(guó)家標(biāo)準(zhǔn)科技協(xié)會(huì)(NIST)所推薦,亦不為ISO/IEC 18033-3所支持。

利用3DES在.NET Framework中實(shí)現(xiàn)加密和解密

我們看下在.NET Framework中對(duì)于3DES的具體實(shí)現(xiàn),如下:

探討.NET Core數(shù)據(jù)加密和解密問題

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

探討.NET Core數(shù)據(jù)加密和解密問題

我們給出一個(gè)16位的加密密鑰,然后對(duì)相應(yīng)數(shù)據(jù)進(jìn)行加密和解密

            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數(shù)據(jù)加密和解密問題

探討.NET Core數(shù)據(jù)加密和解密問題 

我們定義密鑰為16個(gè)字節(jié),即此時(shí)應(yīng)該是有兩個(gè)密鑰,但是此時(shí)密鑰卻不同,所以猜測(cè)內(nèi)部實(shí)現(xiàn)的3DES密碼選項(xiàng)中的第二項(xiàng),因?yàn)槊荑€3和密鑰1相等,既然沒出錯(cuò),內(nèi)部應(yīng)該會(huì)去拿密鑰1中的位數(shù)作為密鑰3的位數(shù)。接下里我們?cè)賮砜丛?NET Core中的情況。

利用3DES在.NET Core實(shí)現(xiàn)加密和解密

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

探討.NET Core數(shù)據(jù)加密和解密問題

        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數(shù)據(jù)加密和解密問題

接著進(jìn)行調(diào)用:

            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數(shù)據(jù)加密和解密問題 

結(jié)果出錯(cuò)了詳細(xì)信息如下:

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

由上說明我們給出密鑰的大小對(duì)于3DES對(duì)稱加密算法時(shí)無效的,為何呢,在.NET Framework是好使的呀,當(dāng)我們調(diào)試時(shí)將鼠標(biāo)放在3DES中密鑰時(shí)你會(huì)發(fā)現(xiàn)它實(shí)際需要的字節(jié)為24個(gè)字節(jié),而我們只提供了16個(gè)字節(jié),如下:

探討.NET Core數(shù)據(jù)加密和解密問題 

所以到這里我們應(yīng)該知道問題出在什么地方了,根據(jù)我們對(duì)3DES的介紹內(nèi)部實(shí)現(xiàn)的選項(xiàng)應(yīng)該是密鑰選項(xiàng)2,將密鑰1和密鑰2獨(dú)立開來,而密鑰3和密鑰相同,在.NET Framework中我們只要兩個(gè)密鑰即可,因?yàn)榈谌齻€(gè)密鑰和第一個(gè)相同,既然沒出錯(cuò)肯定是內(nèi)部重用了密鑰1,但是在.NET Core需要我們給出24個(gè)字節(jié),說明即使密鑰1和密鑰3相同也要我們提供密鑰的字節(jié),所以我們只要將密鑰1中的八個(gè)字節(jié)拷貝到密鑰3中,這樣就有了24個(gè)字節(jié),實(shí)現(xiàn)如下:

探討.NET Core數(shù)據(jù)加密和解密問題

        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數(shù)據(jù)加密和解密問題

此時(shí)我們?cè)賮砜聪麓蛴〗Y(jié)果:

探討.NET Core數(shù)據(jù)加密和解密問題

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

探討.NET Core數(shù)據(jù)加密和解密問題

探討.NET Core數(shù)據(jù)加密和解密問題 

網(wǎng)頁(yè)題目:探討.NETCore數(shù)據(jù)加密和解密問題
瀏覽地址:http://jinyejixie.com/article30/posopo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)企業(yè)網(wǎng)站制作、用戶體驗(yàn)、建站公司外貿(mào)建站、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
顺平县| 廊坊市| 洪江市| 仁化县| 多伦县| 汶川县| 河津市| 太湖县| 蒙自县| 贵港市| 灵武市| 平凉市| 饶平县| 菏泽市| 文化| 敦煌市| 嘉黎县| 柘城县| 合山市| 云霄县| 外汇| 祁东县| 泰州市| 江华| 罗定市| 满洲里市| 凤城市| 名山县| 栾城县| 巨野县| 蒙山县| 通渭县| 枣强县| 明水县| 乐陵市| 玉树县| 凤山市| 宁武县| 霍州市| 和田县| 新竹市|