可通用的C#與Java的Des加解密程式碼
最近專案中需要將Java的DES加密的內容,用C#解密。這裡僅做記錄。
1、Java版
import java.io.UnsupportedEncodingException; import java.security.SecureRandom; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; import Decoder.BASE64Decoder; import Decoder.BASE64Encoder; import javax.crypto.SecretKeyFactory; import javax.crypto.SecretKey; import javax.crypto.Cipher; public class MyDesc { public MyDesc() {} //測試 public static void main(String args[]) throws UnsupportedEncodingException { //待加密內容 String str = "{\"pid\":\"511025198710264794\",\"pname\":false}"; //密碼,長度要是8的倍數 String password = "2018052400018841"; String result = MyDesc.encrypt(str.getBytes("UTF-8"),password); System.out.println("加密後:"+result); //uMI2SuMFepPhQxytg/ONQPwfCnlLZHYOQiuIY6u176gbgHCw8nD7u3fMV7IgSr5o //直接將如上內容解密 try { String decryResult = MyDesc.decrypt(result, password); System.out.println("解密後:"+decryResult); //{"pid":"511025198710264794","pname":false} } catch (Exception e1) { e1.printStackTrace(); } } /** * 加密 * @param datasource * @param password * @return */ public static String encrypt(byte[] datasource, String password) { String strIv = "12345678"; try{ SecureRandom random = new SecureRandom(); DESKeySpec desKey = new DESKeySpec(password.getBytes("UTF-8")); //建立一個密匙工廠,然後用它把DESKeySpec轉換成 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey securekey = keyFactory.generateSecret(desKey); //Cipher物件實際完成加密操作 Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); //用密匙初始化Cipher物件 IvParameterSpec param = new IvParameterSpec(strIv.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, securekey, param); //現在,獲取資料並加密 //正式執行加密操作 byte[] buf = cipher.doFinal(datasource); String utf8 = new BASE64Encoder().encodeBuffer(buf); return utf8; }catch(Throwable e){ e.printStackTrace(); } return null; } /** * 解密 * @param src * @param password * @return * @throws Exception */ public static String decrypt(String src, String password) throws Exception { String strIv = "12345678"; // DES演算法要求有一個可信任的隨機數源 SecureRandom random = new SecureRandom(); // 建立一個DESKeySpec物件 DESKeySpec desKey = new DESKeySpec(password.getBytes()); // 建立一個密匙工廠 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // 將DESKeySpec物件轉換成SecretKey物件 SecretKey securekey = keyFactory.generateSecret(desKey); // Cipher物件實際完成解密操作 Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); // 用密匙初始化Cipher物件 IvParameterSpec param = new IvParameterSpec(strIv.getBytes()); cipher.init(Cipher.DECRYPT_MODE, securekey, param); // 真正開始解密操作 byte[] dec = new BASE64Decoder().decodeBuffer(src); byte[] utf8 = cipher.doFinal(dec); String decryptedStr = new String(utf8, "UTF-8"); return decryptedStr; } }
2、C#版
using System; using System.Collections.Generic; using System.Linq; using System; using System.Linq; using System.Web.Script.Serialization; using System.Runtime.Serialization; using System.Dynamic; using System.Net; using System.IO; using System.Collections.Specialized; using System.Web; using System.Security.Cryptography; using System.Text; namespace testDESC { static class Test { /// <summary> /// 解密 /// </summary> /// <param name="encryptedString"></param> /// <param name="keyString"></param> /// <returns></returns> public static string Decrypt(string encryptedString, string keyString) { keyString = keyString.Substring(0, 8); byte[] btKey = Encoding.UTF8.GetBytes(keyString); byte[] btIv = Encoding.UTF8.GetBytes("12345678"); var des = new DESCryptoServiceProvider(); des.Mode = CipherMode.CBC;//這裡指定加密模式為CBC des.Padding = PaddingMode.PKCS7; des.Key = btKey; des.IV = btIv; using (var ms = new MemoryStream()) { try { byte[] inData = Convert.FromBase64String(encryptedString); using (var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)) { cs.Write(inData, 0, inData.Length); cs.FlushFinalBlock(); } return Encoding.UTF8.GetString(ms.ToArray()); } catch (Exception ex) { return "-1"; // throw ex; } } } /// <summary> /// 加密 /// </summary> /// <param name="sourceString"></param> /// <param name="keyString"></param> /// <returns></returns> public static string Encrypt(string sourceString, string keyString) { keyString = keyString.Substring(0, 8); byte[] btIv = Encoding.UTF8.GetBytes("12345678"); byte[] btKey = Encoding.UTF8.GetBytes(keyString); try { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); using (MemoryStream ms = new MemoryStream()) { byte[] inData = Encoding.UTF8.GetBytes(sourceString); using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIv), CryptoStreamMode.Write)) { cs.Write(inData, 0, inData.Length); cs.FlushFinalBlock(); } return Convert.ToBase64String(ms.ToArray()); } } catch { return "-1"; } } static void Main(string[] args) { string str = "{\"pid\":\"511025198710264794\",\"pname\":false}"; string re = Encrypt(str, "2018052400018841"); Console.WriteLine("加密:" + re); //uMI2SuMFepPhQxytg/ONQPwfCnlLZHYOQiuIY6u176gbgHCw8nD7u3fMV7IgSr5o string re1 = Decrypt(re, "2018052400018841"); Console.WriteLine("解密:" + re1); //{"pid":"511025198710264794","pname":false} } } }
相關推薦
C語言AES加解密程式碼實現
#include<stdio.h> #include<string.h> #include<string> #include<iostream> #include<unistd.h> #include<algorithm> us
可通用的C#與Java的Des加解密程式碼
最近專案中需要將Java的DES加密的內容,用C#解密。這裡僅做記錄。1、Java版import java.io.UnsupportedEncodingException; import java.security.SecureRandom; import javax.cr
Javascript和C#真正可以互動的DES加解密程式碼
因專案需要,要用js加密後,提交給C#解密,在網上找了半天,網上有無數個版本,卻找不到一個能互相使用的甚至就連都是js版本的,都不能互通,汗一個。因為時間關係,沒有去深究加密程式碼,就隨便下載了一個JS版本的,並把它改寫成C#版本的 這樣JS加密後的結果,C#也能解密反之C#
C++的AES加解密
aes加解密 大致 filter aes buffere extern pos data rcp 最近公司項目要做個WPF程序,但是底層加密部分要用C++來實現。通過網上搜索各種資料,地址已經記不下了,沒發貼出來了! 下面看看如何加解密的~!先貼代碼。。。。 1
java aes128位 cfb與gcm加解密 aes-128-cfb aes-128-gcm
Base64.encodeBase64String(secretKey.getEncoded())是apache的commons-codec庫,二進位制經base64編碼為字串 //cfb package com.dddd.codec; import org.apache.comm
DES與3DES加解密
一、DES和3DES的概念 二、需求背景 我們在線上經常使用DES加密使用者id,以下簡稱(encodeId),後端傳個前端,前端會使用localStorage儲存encodeId,然後呼叫介面時將encodeId作為入參,後端通過e
C#實現AES加解密
1.關於.NET下的對稱加密演算法。 .NET Framework類庫提供了對稱加密、雜湊函式、非對稱加密、數字簽名等現有的主流加密演算法。.NET中預設實現了4種對稱加密演算法:DES、TripleDES、RC2、Rijndeal。其中前3種都比較老了哦。而第四種Rijndeal的全稱就是:高階加密
C# AESCBC256 與 java AESCBC256 加解密
created key rom post base bsp return block padding 和某上市公司對接接口,他們試用 java AES CBC PKCS5 256 加解密。網上C# 基本不合適。 註意:C# PKCS7 對應 java PKCS5 ///
C#與 微信小程序 互為加解密方案
password dst hexstring else malformed write all ref prototype CryptoJS下載地址: https://code.google.com/archive/p/crypto-js/downloads http://
MD5+DES在C#.NET與Java/Android中的加解密使用
main 模式 NPU ++ 代碼 加密、解密 ets 推薦 lock 一、背景後臺(C#.NET)使用一個MD5+DES的加解密算法,查了下,很多網友都使用了這個算法。在Android裏,也需要這個算法,如何把這個加解密算法切換成Java版,成了難題。畢竟好久沒涉及到這一
軟實現非對稱加解密,公鑰證書與公鑰值區別,包含提取公約值程式碼
目前有部分未採購簽名驗籤伺服器的企業,採用軟實現做非對稱、對稱加解密,本文簡略說明一下工作過程中遇到的問題。 本交易涉及傳送方,接收方 問題背景: 對方即接收方採用的是軟實現,並且只提供了公鑰值(未經CA簽發) 我方即傳送方,採用的是硬體簽名驗籤服務。伺服器中存有我方的私鑰,
CryptoJS與C#AES加解密互轉
頁面js引用: <script type="text/javascript" src="/content/plugin/CryptoJSv3.1.2/components/core-min.js"></script> <scrip
C#的DES文件加解密工具類
C# DES文件加解密 using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; using System.IO; namespace ww
Java加解密與數字簽名
對稱 數組 aes 生成密鑰 分解 encode rup 特性 ntc Java加解密與數字簽名 2016-08-30 蕊蕊 java編程 ** Java加解密 ** 實現方式:JDK實現,CC,B
C++: 基於OpenSSL的AES256加解密測試
技術分享 以及 ora 實習 erl this ifs 測試結果 binary 2018-07-12 暑假要求專業實習,要有周記和工作總結。之前老早就有過寫博客的想法,因為可以讓自己的學習生涯有跡可循。不過租的服務器即將到期,就不自己建站了。希望通過博客園這個
與非java語言使用RSA加解密遇到的問題:algid parse error, not a sequence
write ltr 結果 cep exp result 命令 pat ror 遇到的問題 在一個與Ruby語言對接的項目中,決定使用RSA算法來作為數據傳輸的加密與簽名算法。但是,在使用Ruby生成後給我的私鑰時,卻發生了異常:IOException: algid pars
Java、C#雙語版配套AES加解密示例
rijndael rand encrypt encoding res ace secret names tar 這裏采用的加解密使用base64轉碼方法,ECB模式,PKCS5Padding填充,密碼必須是16位,否則會報錯! 模式:Java的ECB對應C#的Sys
C#之演算法加密一:AES加解密
AES:是高階加密標準,在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準主要是代替原先的DES,以及被多方分析且廣為全世界所使用。 AES加密資料塊分組長度必須是128位元,金鑰長度可以使128位元,192位元,256位元中的任意一個(
C++霧中風景番外篇3:GDB與Valgrind ,除錯程式碼記憶體的工具
寫 C++的同學想必有太多和記憶體打交道的血淚經驗了,常常被 C++的記憶體問題攪的焦頭爛額。(寫 core 的經驗了)有很多同學一見到 core 就兩眼一抹黑,不知所措了。筆者 入"坑"C++之後,在除錯 C++程式碼的過程之中,學習了不少除錯程式碼記憶體的工具。希望借這個機會來介紹一下筆者常用的工具,
C# 可選引數與命名實參
Demo using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Option