最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中對(duì)稱加密算法的踩坑日常記錄

 更新時(shí)間:2019年06月24日 08:34:23   作者:ixysy  
這篇文章主要給大家介紹了關(guān)于C#中對(duì)稱加密算法的踩坑日常記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1|0前言

有幸接觸了一下傳說(shuō)中的對(duì)稱加密算法3DES

感覺(jué)這些加密算法與我的工作是想去甚遠(yuǎn)的,一般沒(méi)什么機(jī)會(huì)接觸這些東西

今次了解了一下3DES這個(gè)對(duì)稱算法

原理算不上明白,算是踩了C#中的一些坑吧

C#中對(duì)于密鑰的處理比較奇怪,花費(fèi)了一晚上一早上的時(shí)間才弄明白

期間偷窺了不少C#的源代碼

下面由我娓娓道來(lái)

2|0簡(jiǎn)介

2|13DES算法命名

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

2|2基本邏輯

三重?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ù)并形成一塊。

2|33DES加密選項(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)樗梢苑烙型鞠嘤龉簟?/p>

密鑰選項(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所支持。

2|4C#實(shí)現(xiàn)

講真簡(jiǎn)介里用來(lái)湊字?jǐn)?shù)的這些內(nèi)容我其實(shí)沒(méi)怎么看明白

C#中使用TripleDESCryptoServiceProvider類來(lái)實(shí)現(xiàn)相關(guān)功能

    public static string DesEncrypt(string input, string key)
    {
      byte[] inputArray = Encoding.UTF8.GetBytes(input);
      TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
      tripleDES.Key = Encoding.UTF8.GetBytes(key);
     
      tripleDES.Mode = CipherMode.ECB;
      tripleDES.Padding = PaddingMode.PKCS7;
      ICryptoTransform cTransform = tripleDES.CreateEncryptor();
      byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
      tripleDES.Clear();
      return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }

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

從下面源碼中看出,該類接收的Key為16位或24位

然后對(duì)于這個(gè)Key,C#似乎有自己的處理方式

以下為個(gè)人理解:

這個(gè)24位的key會(huì)被處理成3個(gè)8字節(jié)的獨(dú)立密鑰參與運(yùn)算

當(dāng)提供24位key時(shí)并沒(méi)有什么不妥

但是當(dāng)提供16位的key時(shí) 會(huì)把提供的key拆分成兩個(gè)塊(block) 并以第一個(gè)塊作為第三個(gè)塊組成一個(gè)24位的密鑰

如下:

輸入密鑰:49, 50, 51, 52, 53, 54, 55, 56, 57, 49, 50, 51, 52, 53, 54, 55

實(shí)際使用:49, 50, 51, 52, 53, 54, 55, 56, 57, 49, 50, 51, 52, 53, 54, 55, 49, 50, 51, 52, 53, 54, 55, 56

可以看出使用了前8位來(lái)進(jìn)行后面8位的補(bǔ)全

這時(shí)候你可能要問(wèn),如果提供一個(gè)不是16位也不是24位的密鑰時(shí)會(huì)發(fā)生什么

會(huì)拋異常

以上理解都是在.NetFramework中的體現(xiàn)

如果換到NetCore中,效果就又不一樣了

2|5NetCore

在NetCore中不存在TripleDESCryptoServiceProvider 取而代之的是 TripleDES

所以此時(shí)我們的代碼需要稍作修改

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);
    }

NetCore中同樣要求我們提供24位的Key

但是不在兼容16位的Key,如果你提供一個(gè)非24位的Key就會(huì)異常

不過(guò)沒(méi)關(guān)系,對(duì)于16位的Key我們可以自行處理一下

同理使用前8位補(bǔ)全后8位

    public static string DesEncrypt(string input, string key)
    {

      byte[] inputArray = Encoding.UTF8.GetBytes(input);
      var tripleDES = TripleDES.Create();
      var byteKey = Encoding.UTF8.GetBytes(key);
      //復(fù)制前8位補(bǔ)全后8位
      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);
      //復(fù)制前8位補(bǔ)全后8位
      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);
    }

至此就可以正常兼容NetFramework的代碼了

3|0小結(jié)

至此寫下此文,也算是對(duì)3DES有了些許了解吧

需要記住

在.NET Core中利用3DES加密和解密必須要給出3個(gè)密鑰即24個(gè)字節(jié)即使密鑰3和密鑰1相等,它不會(huì)像.NET Framework中會(huì)重用密鑰1中的位數(shù)。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • C#針對(duì)xml文件轉(zhuǎn)化Dictionary的方法

    C#針對(duì)xml文件轉(zhuǎn)化Dictionary的方法

    這篇文章主要介紹了C#針對(duì)xml文件轉(zhuǎn)化Dictionary的方法,是C#操作XML文件的典型應(yīng)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • C#封裝DBHelper類

    C#封裝DBHelper類

    DBHelper類是用類將ADO.NET用方法封裝起來(lái),用以減少程序員的工作量。本文為大家提供一個(gè)C#封裝的DBHelper類,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C#中DrawCurve的用法小結(jié)

    C#中DrawCurve的用法小結(jié)

    本文主要介紹了C#中DrawCurve的用法小結(jié),通常用于繪制一條平滑的曲線通過(guò)一系列給定的點(diǎn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • C#編寫的windows計(jì)算器的實(shí)例代碼

    C#編寫的windows計(jì)算器的實(shí)例代碼

    這篇文章介紹了C#編寫windows計(jì)算器的代碼,有需要的朋友可以參考一下
    2013-07-07
  • C#遞歸算法和排列算法

    C#遞歸算法和排列算法

    這篇文章介紹了C#的遞歸算法和排列算法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • c#遍歷System.drawing.Color下面的所有顏色以及名稱以查看

    c#遍歷System.drawing.Color下面的所有顏色以及名稱以查看

    c#遍歷System.drawing.Color下面的所有顏色以及名稱以查看,需要的朋友可以參考一下
    2013-02-02
  • WinForm使用DataGridView實(shí)現(xiàn)類似Excel表格的查找替換功能

    WinForm使用DataGridView實(shí)現(xiàn)類似Excel表格的查找替換功能

    這篇文章主要介紹了WinForm使用DataGridView實(shí)現(xiàn)類似Excel表格的查找替換功能,現(xiàn)在小編通過(guò)本文給大家分享查找替換實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下
    2021-07-07
  • C#難點(diǎn)逐個(gè)擊破(6):C#數(shù)據(jù)類型與.net framework數(shù)據(jù)類型

    C#難點(diǎn)逐個(gè)擊破(6):C#數(shù)據(jù)類型與.net framework數(shù)據(jù)類型

    最近開(kāi)始看Illustrator C#2008,這真是一本好書,我讀計(jì)算機(jī)書籍這么多了,能讓我稱為好書的沒(méi)有多少。
    2010-02-02
  • Unity實(shí)現(xiàn)彈球打磚塊游戲

    Unity實(shí)現(xiàn)彈球打磚塊游戲

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)彈球打磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • winform 實(shí)現(xiàn)控制輸入法

    winform 實(shí)現(xiàn)控制輸入法

    在工作中遇到這樣一個(gè)問(wèn)題,在系統(tǒng)使用過(guò)程中,輸入法會(huì)變灰導(dǎo)致無(wú)法使用輸入法輸入文字,就好像輸入法被禁用了沒(méi)有啟用似的。對(duì)此,在這里做個(gè)備錄
    2015-08-08

最新評(píng)論

定南县| 贡嘎县| 克什克腾旗| 泰和县| 嘉荫县| 仙桃市| 凤凰县| 惠安县| 阳曲县| 定州市| 清流县| 武鸣县| 长岛县| 芷江| 宁强县| 乌兰浩特市| 白山市| 香河县| 三穗县| 什邡市| 双鸭山市| 盐亭县| 水城县| 马尔康县| 汉寿县| 南和县| 安溪县| 富平县| 巴林右旗| 怀宁县| 鄂尔多斯市| 彰化县| 临夏县| 延津县| 厦门市| 临海市| 白朗县| 兴化市| 剑河县| 西贡区| 肃北|