1. 程式人生 > >可通用的C#與Java的Des加解密程式碼

可通用的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位 cfbgcm解密 aes-128-cfb aes-128-gcm

Base64.encodeBase64String(secretKey.getEncoded())是apache的commons-codec庫,二進位制經base64編碼為字串 //cfb package com.dddd.codec; import org.apache.comm

DES3DES解密

一、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#.NETJava/Android中的解密使用

main 模式 NPU ++ 代碼 加密、解密 ets 推薦 lock 一、背景後臺(C#.NET)使用一個MD5+DES的加解密算法,查了下,很多網友都使用了這個算法。在Android裏,也需要這個算法,如何把這個加解密算法切換成Java版,成了難題。畢竟好久沒涉及到這一

軟實現非對稱解密,公鑰證書公鑰值區別,包含提取公約值程式碼

目前有部分未採購簽名驗籤伺服器的企業,採用軟實現做非對稱、對稱加解密,本文簡略說明一下工作過程中遇到的問題。 本交易涉及傳送方,接收方 問題背景: 對方即接收方採用的是軟實現,並且只提供了公鑰值(未經CA簽發) 我方即傳送方,採用的是硬體簽名驗籤服務。伺服器中存有我方的私鑰,

CryptoJSC#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:GDBValgrind ,除錯程式碼記憶體的工具

寫 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