記一次Java AES 加解密 對應C# AES加解密 的一波三折

最近在跟三方對接 對方采用AES加解密 作為一個資深neter Ctrl CV 是我最大的優點 所以我義正言辭的問他們要了demo

1541998119616

java demo代碼:
public class EncryptDecryptTool
{private static final String defaultCharset = "UTF-8";private static final String KEY_AES = "AES";private static final String KEY_MD5 = "MD5";private static MessageDigest md5Digest;static {try {md5Digest = MessageDigest.getInstance(KEY_MD5);} catch (NoSuchAlgorithmException e) {//}}public String encrypt(String message, String key) throws Exception
{return doAES(message, key, Cipher.ENCRYPT_MODE);
}public String decrypt(String message, String key) throws Exception
{return doAES(message, key, Cipher.DECRYPT_MODE);
}/*** 加解密** @param data* @param key* @param mode* @return* @throws NoSuchPaddingException * @throws NoSuchAlgorithmException */
private static String doAES(String data, String key, int mode) throws Exception
{if (StringUtils.isBlank(data) || StringUtils.isBlank(key)) {return null;}boolean encrypt = mode == Cipher.ENCRYPT_MODE;byte[]content;if (encrypt) {content = data.getBytes(defaultCharset);} else {content = Base64.decodeBase64(data.getBytes());}SecretKeySpec keySpec = new SecretKeySpec(md5Digest.digest(key.getBytes(defaultCharset)), KEY_AES);Cipher cipher = Cipher.getInstance(KEY_AES);// 創建密碼器
cipher.init(mode, keySpec);// 初始化byte[] result = cipher.doFinal(content);if (encrypt) {return new String(Base64.encodeBase64(result, false), defaultCharset);} else {return new String(result, defaultCharset);}}
}EncryptDecryptTool tool = new EncryptDecryptTool();try{//這里key的位數是個坑   之前找的一堆資料   java C#通用版啥的   都說key一定要是16位的   結果后來我發現 靠String msg = tool.decrypt("{\"Name\":\"20180122T155221\",\"OrderNo\":\"Test1000012059021180000008153\"}", "64個英文字母");System.out.println(msg);}catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}
哇咔咔 這不是大名鼎鼎的java嘛 但這難不倒我 不是還有IKVM 照樣Ctrl CV

1542000611421

新建一個.NET Standard項目NuGet 安裝IKVM

1536719957239

C#主要代碼
public class EncryptDecryptTool{private static readonly string KEY_AES = "AES";private static readonly string KEY_MD5 = "MD5";private static MessageDigest md5Digest;static EncryptDecryptTool(){try{md5Digest = MessageDigest.getInstance(KEY_MD5);}catch (NoSuchAlgorithmException e){//}}public string encrypt(string message, string key){return doAES(message, key, Cipher.ENCRYPT_MODE);}public string decrypt(string message, string key){return doAES(message, key, Cipher.DECRYPT_MODE);}/// <summary>/// /// </summary>/// <param name="data"></param>/// <param name="key"></param>/// <param name="mode"></param>/// <returns></returns>private static string doAES(string data, string key, int mode){bool encrypt = mode == Cipher.ENCRYPT_MODE;byte[] content;if (encrypt){content = Encoding.UTF8.GetBytes(data);}else{content = Convert.FromBase64String(data);}SecretKeySpec keySpec = new SecretKeySpec(md5Digest.digest(Encoding.UTF8.GetBytes(key)), KEY_AES);Cipher cipher = Cipher.getInstance(KEY_AES);// 創建密碼器cipher.init(mode, keySpec);// 初始化byte[] result = cipher.doFinal(content);if (encrypt){return Convert.ToBase64String(result);}else{return Encoding.UTF8.GetString(result);}}}static void Main(string[] args){var encryptDecryptTool = new EncryptDecryptTool();Console.WriteLine(encryptDecryptTool.encrypt("jack","64位密鑰"));}
運行NetCore控制臺

1542001527509

1542001571646

這是Net Framework Net Core以及IKVM不得不說的故事了 但是下午就要聯調了 總不能給三方講一千零一夜 沒事這難不倒我 新建一個Net Framework控制臺
   static void Main(string[] args){try{var argsLength = args.Length;if (argsLength > 1){EncryptDecryptTool tool = new EncryptDecryptTool();string result = string.Empty;if (args[0] == "encrypt"){result = tool.encrypt(args[1]);}else{result = tool.decrypt(args[1]);}Console.WriteLine(result);}}catch (Exception ex){Console.WriteLine(ex.Message);}}
Net Core調用
      string path = @"D:\WebSite\AESTool.exe";var method="encrypt";var msg="this is msg";string fileName = path;Process p = new Process();p.StartInfo.UseShellExecute = false;p.StartInfo.RedirectStandardOutput = true;p.StartInfo.FileName = fileName;p.StartInfo.CreateNoWindow = true;p.StartInfo.Arguments = $"{method} {msg}";//參數以空格分隔p.Start();var output = await p.StandardOutput.ReadToEndAsync();
測試ok 沒問題 就是時間有點久 加密解密每次差不多都要一秒

1542005197418

就這樣跑了一段時間 今天閑下來 想起上次的一秒

1542013331412

嗯 寫好辭職申請 備份 好的 我要開始重構了 嗯 知己知彼百戰不殆 那我們先去維密上大概了解一下AES

1542014447595

好吧 我知道你也沒看懂

1542014542480

我們還是看代碼吧 作為一個資深程序員的直覺

1542014881987

之前查了一堆資料 都說java C# AES加解密通用版 key的位都必須是16位 害的笨菜鳥陷入了思維誤區 我們再看上面那段代碼 Debug進去看 發現是用MD5算法根據key生成長度16的byte數據 16啊 多么敏感的數字 就是哈希計算 靠
果斷google,Ctrl CV
  public static class EncryptDecryptTool{private const string key = "qCOHfwhXgsZFBFSeZeGOlXtZbKOzApLBuZoWxrQjcmoxYHfrWZzdyFbvGuMcZqmC";/// <summary>/// MD5哈希計算/// </summary>/// <param name="key"></param>/// <returns></returns>public static byte[] ConvertStringToMD5(string key){byte[] ByteData = Encoding.UTF8.GetBytes(key);MD5 oMd5 = MD5.Create();       byte[] HashData = oMd5.ComputeHash(ByteData);return HashData;}/// <summary>/// AES加密 /// </summary>/// <param name="toEncrypt"></param>/// <returns></returns>public static string Encrypt(string toEncrypt){byte[] keyArray = ConvertStringToMD5(key);byte[] toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);RijndaelManaged rDel = new RijndaelManaged();rDel.Key = keyArray;rDel.Mode = CipherMode.ECB;rDel.Padding = PaddingMode.PKCS7;ICryptoTransform cTransform = rDel.CreateEncryptor();byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return Convert.ToBase64String(resultArray, 0, resultArray.Length);}/// <summary>/// AES解密/// </summary>/// <param name="toDecrypt"></param>/// <returns></returns>public static string Decrypt(string toDecrypt){byte[] keyArray = ConvertStringToMD5(key);byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);RijndaelManaged rDel = new RijndaelManaged();rDel.Key = keyArray;rDel.Mode = CipherMode.ECB;rDel.Padding = PaddingMode.PKCS7;ICryptoTransform cTransform = rDel.CreateDecryptor();byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return Encoding.UTF8.GetString(resultArray);}
打完收工

1542016198377

轉載于:https://www.cnblogs.com/aishangyipiyema/p/9948011.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396041.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396041.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

zemax評價函數編輯器_ZEMAX與光學設計案例:激光擴束系統詳細設計與公差分析(二)...

目前超過兩千人的光學與光學設計方面的微信公眾號&#xff0c;歡迎您的到來&#xff01;激光擴束系統公差分析ZEMAX與光學設計案例&#xff1a;激光擴束系統詳細設計與公差分析(二)作者&#xff1a;墨子川上10倍擴束系統在上篇已經設計好了&#xff0c;接下來就是進行系統的公差…

決策者根據什么曲線做出決策_如何做出產品設計決策

決策者根據什么曲線做出決策by Tanner Christensen由Tanner Christensen 如何做出產品設計決策 (How Product Design Decisions are Made) Recently in a Facebook group dedicated to designers, known as Designers Guild, a young design student named Marina Candela ask…

移動前端框架重構幾個關鍵問題

1. 是否該廢棄iscroll&#xff1f; 我得出的結論是&#xff0c;是該廢棄了。那當時為什么要用iscroll&#xff1f; 原因有三個&#xff1a; 1. 因為別人也用了。 2. 為了iPhone上頁面滑動更順暢。 3. 為了用上拉、下拉刷新。 關于這三個原因有幾點觀點&#xff1a; 1. 人最容易…

android 內部共享存儲,Android共享內部存儲

我現在面對txt文件的類似情況,并做到了這一點.File downloadedFile new File( context.getFilesDir(),"simple.txt" );downloadedFile.setReadable( true,false );downloadedFile.setWritable( true,false ); //set read/write for othersUri downloadFileUri Uri.f…

UiPath: Selectors repair 選擇器的修復,即被選擇的按鈕發生改變如何選擇第二按鈕...

實現批量注冊用戶功能時&#xff0c;出現第一個用戶注冊完時&#xff0c;彈出確認按鈕&#xff0c;點擊即可&#xff0c;但是第二個用戶注冊完成時&#xff0c;彈出的按鈕與第一個有差異&#xff0c;圖形用戶界面元素及其父元素的屬性都發生改變。所以就點不了按鈕&#xff0c;…

《C專家編程》一1.6 它很棒,但它符合標準嗎

本節書摘來自異步社區《C專家編程》一書中的第1章&#xff0c;第1.6節&#xff0c;作者 【美】Perter Van Der Linde&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 1.6 它很棒&#xff0c;但它符合標準嗎 不要添亂——立即解散ISO工作小組。 ——匿名人士 …

abap al設置單元格可編輯 oo_excel表格操作: 圖形和圖表編輯技巧匯總(二)

1. 快速選取圖表元素圖表創建好以后&#xff0c;我們還需要對某些圖表元素進行編輯和格式化。圖表區包括整個圖表和它的全部元素&#xff0c;當你選取圖表區后&#xff0c;你就可以看到8個黑色小方塊。要想調整單個的圖表對象&#xff0c;首先必須選取該對象&#xff0c;然后更…

trie樹查找前綴串_Trie數據結構(前綴樹)

trie樹查找前綴串by Julia GeistJulia蓋斯特(Julia Geist) A Trie, (also known as a prefix tree) is a special type of tree used to store associative data structuresTrie (也稱為前綴樹)是一種特殊類型的樹&#xff0c;用于存儲關聯數據結構 A trie (pronounced try) g…

我的北航故事

我的北航故事 致 沙航的我 既然是故事&#xff0c;那就一定少不了我們耳熟能詳的時間&#xff0c;地點&#xff0c;人物&#xff0c;事件&#xff0c;發展&#xff0c;高潮&#xff0c;結局。經過反復的琢磨&#xff0c;我覺得還是寫成日記形式比較適合&#xff0c;一是為了掩蓋…

oppo r11 android版本,OPPO R11手機一共有幾個版本?各版本都有哪些區別?

OPPO正式發布了新一代R11和R11 Plus兩款旗艦手機&#xff0c;那么OPPO R11有幾個版本&#xff1f;OPPO R11各個版本有什么區別&#xff1f;下面帶來OPPO R11各版本區別對比詳細評測&#xff0c;一起來了解下吧!外觀方面&#xff0c;采用微弧面設計&#xff0c;全新打磨輕薄“小…

CDB和PDB的創建、連接、啟動、關閉

CDB和PDB的創建、連接、啟動、關閉 一、CDB和PDB基本管理 基本概念&#xff1a; Multitenant Environment&#xff1a;多租戶環境 CDB&#xff08;Container Database&#xff09;&#xff1a;數據庫容器 PD&#xff08;Pluggable Database&#xff09;&#xff1a;可插拔數據庫…

《Java和Android開發學習指南(第2版)》——第2章,第2.10節本章小結

本節書摘來自異步社區《Java和Android開發學習指南&#xff08;第2版&#xff09;》一書中的第2章&#xff0c;第2.10節本章小結&#xff0c;作者 【加】Budi Kurniawan&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 2.10 本章小結本章介紹了Java語言的基礎…

控制usb掃碼槍_無線也可以很牢靠-世達SATA熱熔膠槍評測

作為一名喜歡動手制作的手工達人&#xff0c;往往樂趣就在于動手過程中的成就感。而在對零件進行固定時&#xff0c;熱熔膠由于可以包裹裸露的電線線頭&#xff0c;固定效果也非常好&#xff0c;相比電焊也更加的簡單易操作&#xff0c;因而被很多人選擇。但是&#xff0c;多數…

測試驅動開發 測試前移_為什么測試驅動的開發有用?

測試驅動開發 測試前移有關如何更有效地應用TDD的技巧&#xff0c;以及為什么它是一種有價值的技術 (Tips on how to apply TDD more efficiently, and why its a valuable technique) Theres a common pattern we follow when we start a project using TDD. We describe the …

Anaconda管理多版本的python環境

通過Conda的環境管理功能&#xff0c;我們能同時安裝多個不同版本的Python&#xff0c;并能根據需要自由切換。下面我將給大家分享一下&#xff0c;新增Python版本&#xff0c;切換&#xff0c;再切回主版本的詳細過程。 方法/步驟 1首先確保你的系統里已經安裝了Conda&#xf…

父子滬c轉大牌過戶_機動車異地過戶(轉籍)

最近我家換了一輛車&#xff0c;導航后臺數據統計是去足浴城最多的車主&#xff0c;尬&#xff01;從想起這個品牌到付定金&#xff0c;也就半天時間&#xff0c;買之前沒了解這么透徹。不過&#xff0c;到手駕駛&#xff0c;還是比之前的車舒適很多的&#xff0c;就是容易在不…

android安卓系統2.3 使用說明書,Android2.3操作界面

Android2.3操作界面摩托羅拉XT882的界面相對于原生的Gingerbread還是有了不小的變化&#xff0c;首先最大的感覺就是主色調亮了很多。默認背景在qHD分辨率下非常的清晰&#xff0c;同時整個界面仍然采用了多分屏界面。下方由中國電信定制&#xff0c;狀態欄加入了全新的單個狀態…

《運營力——微信公眾號 設計 策劃 客服 管理 一冊通》一一1.2 團隊崗位介紹...

本節書摘來自異步社區出版社《運營力——微信公眾號 設計 策劃 客服 管理 一冊通》一書中的第1章&#xff0c;第1.2節&#xff0c;作者&#xff1a; 杭州創博通信技術有限公司 , 施瑤君&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 1.2 團隊崗位介紹 創…

一切都是關于“ –ilities”的

by George Stepanek通過喬治斯蒂芬內克 都是關于“邪惡”的 (It’s all about the “-ilities”) We were “feature complete.”我們“功能齊全”。 Four weeks into a 10-week Free Code Camp project to build an environmental pledge web application, we had gotten al…

1,滑動驗證,前后臺接口

http://www.geetest.com/install/sections/idx-client-sdk.html 轉載于:https://www.cnblogs.com/yexiangwang/p/5481153.html