日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

探讨NET Core数据进行3DES加密或解密弱密钥问题

發布時間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 探讨NET Core数据进行3DES加密或解密弱密钥问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【導讀】之前寫過一篇《探討.NET Core數據進行3DES加密和解密問題》,最近看到有人提出弱密鑰問題,換個強密鑰不就完了嗎,猜測可能是與第三方對接導致很無奈不能更換密鑰,所以產生本文解決.NET Core中3DES弱密鑰問題,寫下本文,希望對碰到此問題的童鞋有所幫助。

3DES加密或解密弱密鑰

在基于.NET Framework中,我們可以使用反射獲取到TripleDESCryptoServiceProvider的“_NewEncryptor”私有方法,從而規避判斷弱秘鑰問題,但在.NET Core中沒有這個方法,我們首先來看看問題的產生,如下為.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?=?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); }

接下來我們調用上述加密方法對數據進行加密,當然這里的密鑰很簡單為16位1,NET Framework中對弱密鑰的具體判斷邏輯這里不做深入分析,如下:

var?desEncryptData?=?DesEncrypt("Jeffcky",?"1111111111111111");

為解決這個問題我們下載BouncyCastle.NetCore包,此包有針對基本所有加密算法實現,你會發現通過該包實現和Java中加密算法實現非常相似,若與第三方Java對接,對方所傳數據可能利用.NET Core無法解密或通過加密導致對方無法解密,因為無論是C#還是Java對于算法的實現還是有所差異,利用此包可以進行互操作。

在C#中3DES名稱定義為TripleDES,而在Java中名稱則是DESede,同時C#中的填充模式PKCS7對應Java中的PKCS5Padding,接下來你將看到如下C#代碼幾乎就是從Java中翻譯過來,如下:

static?IBufferedCipher?CreateCipher(bool?forEncryption,?string?key,string?cipMode?=?"DESede/ECB/PKCS5Padding") {var?algorithmName?=?cipMode;if?(cipMode.IndexOf('/')?>=?0){algorithmName?=?cipMode.Substring(0,?cipMode.IndexOf('/'));}var?cipher?=?CipherUtilities.GetCipher(cipMode);var?keyBytes?=?Encoding.UTF8.GetBytes(key);var?keyParameter?=?ParameterUtilities.CreateKeyParameter(algorithmName,?keyBytes);cipher.Init(forEncryption,?keyParameter);return?cipher; }

如上主要是創建加密算法接口(默認為3DES),若forEncryption為true表示加密,否則解密,具體細節這里就不再詳細解釋,有興趣的童鞋可自行研究。接下來我們實現加密和解密方法:

static?string?EncryptData(string?input,?string?key) {var?inCipher?=?CreateCipher(true,?key);var?inputArray?=?Encoding.UTF8.GetBytes(input);byte[]?cipherData?=?inCipher.DoFinal(inputArray);return?Convert.ToBase64String(cipherData); }static?string?DecryptData(string?input,?string?key) {var?inputArrary?=?Convert.FromBase64String(input);var?outCipher?=?CreateCipher(false,?key);var?encryptedDataStream?=?new?MemoryStream(inputArrary,?false);var?dataStream?=?new?MemoryStream();var?outCipherStream?=?new?CipherStream(dataStream,?null,?outCipher);int?ch;while?((ch?=?encryptedDataStream.ReadByte())?>=?0){outCipherStream.WriteByte((byte)ch);}outCipherStream.Close();encryptedDataStream.Close();var?dataBytes?=?dataStream.ToArray();return?Encoding.UTF8.GetString(dataBytes); }

雖然密鑰是16位,但在內置具體實現時也會如.NET Core中一樣填充到24位,接下來我們再來調用上述加密和解密方法,看看數據加密和解密是否正確

var?data?=?EncryptData("Jeffcky",?"1111111111111111");var?decryptData?=?DecryptData(data,?"1111111111111111");


那么問題來了,為何在C#中會拋出弱密鑰異常,但是在這個包中卻沒能拋出異常呢?內置是基于Schneier pp281的弱和半弱鍵表進行查找可能與C#實現邏輯有所不同(個人猜測),如下:

public?const?int?DesKeyLength?=?8;private?const?int?N_DES_WEAK_KEYS?=?16;//基于Schneier?pp281的弱和半弱鍵表 private?static?readonly?byte[]?DES_weak_keys?= {/*?弱鍵?*/(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,?(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x1f,(byte)0x1f,(byte)0x1f,(byte)0x1f,?(byte)0x0e,(byte)0x0e,(byte)0x0e,(byte)0x0e,(byte)0xe0,(byte)0xe0,(byte)0xe0,(byte)0xe0,?(byte)0xf1,(byte)0xf1,(byte)0xf1,(byte)0xf1,(byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe,?(byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe,/*?半弱鍵?*/(byte)0x01,(byte)0xfe,(byte)0x01,(byte)0xfe,?(byte)0x01,(byte)0xfe,(byte)0x01,(byte)0xfe,(byte)0x1f,(byte)0xe0,(byte)0x1f,(byte)0xe0,?(byte)0x0e,(byte)0xf1,(byte)0x0e,(byte)0xf1,(byte)0x01,(byte)0xe0,(byte)0x01,(byte)0xe0,?(byte)0x01,(byte)0xf1,(byte)0x01,(byte)0xf1,(byte)0x1f,(byte)0xfe,(byte)0x1f,(byte)0xfe,?(byte)0x0e,(byte)0xfe,(byte)0x0e,(byte)0xfe,(byte)0x01,(byte)0x1f,(byte)0x01,(byte)0x1f,?(byte)0x01,(byte)0x0e,(byte)0x01,(byte)0x0e,(byte)0xe0,(byte)0xfe,(byte)0xe0,(byte)0xfe,?(byte)0xf1,(byte)0xfe,(byte)0xf1,(byte)0xfe,(byte)0xfe,(byte)0x01,(byte)0xfe,(byte)0x01,?(byte)0xfe,(byte)0x01,(byte)0xfe,(byte)0x01,(byte)0xe0,(byte)0x1f,(byte)0xe0,(byte)0x1f,?(byte)0xf1,(byte)0x0e,(byte)0xf1,(byte)0x0e,(byte)0xe0,(byte)0x01,(byte)0xe0,(byte)0x01,?(byte)0xf1,(byte)0x01,(byte)0xf1,(byte)0x01,(byte)0xfe,(byte)0x1f,(byte)0xfe,(byte)0x1f,?(byte)0xfe,(byte)0x0e,(byte)0xfe,(byte)0x0e,(byte)0x1f,(byte)0x01,(byte)0x1f,(byte)0x01,?(byte)0x0e,(byte)0x01,(byte)0x0e,(byte)0x01,(byte)0xfe,(byte)0xe0,(byte)0xfe,(byte)0xe0,?(byte)0xfe,(byte)0xf1,(byte)0xfe,(byte)0xf1 };public?static?bool?IsWeakKey(byte[]????key,?int?offset) {if?(key.Length?-?offset?<?DesKeyLength)throw?new?ArgumentException("key?material?too?short.");//nextkey:for?(int?i?=?0;?i?<?N_DES_WEAK_KEYS;?i++){bool?unmatch?=?false;for?(int?j?=?0;?j?<?DesKeyLength;?j++){if?(key[j?+?offset]?!=?DES_weak_keys[i?*?DesKeyLength?+?j]){//continue?nextkey;unmatch?=?true;break;}}if?(!unmatch){return?true;}}return?false; }

如果第三方為Java,當利用.NET Core實在走投無路無法進行解密時,那就使用上述提供的解密方法進行解密,理論上都可以解密,不能解密的情況大多出現于對C#和Java實現原理不了解導致,如下:

本文重點在于解決.NET Core中3DES弱密鑰問題,同時和第三方對接時實在懶得去理解各語言實現加密算法原理,可嘗試采用上述包來進行互操作,看到有幾位童鞋在文章下提出這個問題而苦于沒找到解決方案,這里提供一種可選擇的方案,都已封裝好,拿去用吧。

總結

以上是生活随笔為你收集整理的探讨NET Core数据进行3DES加密或解密弱密钥问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。