Java加密技術(五)DH
DH
Diffie-Hellman演算法(D-H演算法),金鑰一致協議。是由公開金鑰密碼體制的奠基人Diffie和Hellman所提出的一種思想。簡單的說就是允許兩名使用者在公開媒體上交換資訊以生成"一致"的、可以共享的金鑰。換句話說,就是由甲方產出一對金鑰(公鑰、私鑰),乙方依照甲方公鑰產生乙方金鑰對(公鑰、私鑰)。以此為基線,作為資料傳輸保密基礎,同時雙方使用同一種對稱加密演算法構建本地金鑰(SecretKey)對資料加密。這樣,在互通了本地金鑰(SecretKey)演算法後,甲乙雙方公開自己的公鑰,使用對方的公鑰和剛才產生的私鑰加密資料,同時可以使用對方的公鑰和自己的私鑰對資料解密。不單單是甲乙雙方兩方,可以擴充套件為多方共享資料通訊,這樣就完成了網路互動資料的安全通訊!該演算法源於中國的同餘定理——中國餘數定理。
流程分析:
1.甲方構建金鑰對兒,將公鑰公佈給乙方,將私鑰保留;雙方約定資料加密演算法;乙方通過甲方公鑰構建金鑰對兒,將公鑰公佈給甲方,將私鑰保留。
2.甲方使用私鑰、乙方公鑰、約定資料加密演算法構建本地金鑰,然後通過本地金鑰加密資料,傳送給乙方加密後的資料;乙方使用私鑰、甲方公鑰、約定資料加密演算法構建本地金鑰,然後通過本地金鑰對資料解密。
3.乙方使用私鑰、甲方公鑰、約定資料加密演算法構建本地金鑰,然後通過本地金鑰加密資料,傳送給甲方加密後的資料;甲方使用私鑰、乙方公鑰、約定資料加密演算法構建本地金鑰,然後通過本地金鑰對資料解密。
通過java程式碼實現如下:
Java程式碼
- import java.security.Key;
- import java.security.KeyFactory;
- import java.security.KeyPair;
- import java.security.KeyPairGenerator;
- import java.security.PublicKey;
- import java.security.spec.PKCS8EncodedKeySpec;
- import java.security.spec.X509EncodedKeySpec;
-
import java.util.HashMap;
- import java.util.Map;
- import javax.crypto.Cipher;
- import javax.crypto.KeyAgreement;
- import javax.crypto.SecretKey;
- import javax.crypto.interfaces.DHPrivateKey;
- import javax.crypto.interfaces.DHPublicKey;
- import javax.crypto.spec.DHParameterSpec;
- /**
- * DH安全編碼元件
- *
- * @author 樑棟
- * @version 1.0
- * @since 1.0
- */
- publicabstractclass DHCoder extends Coder {
- publicstaticfinal String ALGORITHM = "DH";
- /**
- * 預設金鑰位元組數
- *
- * <pre>
- * DH
- * Default Keysize 1024
- * Keysize must be a multiple of 64, ranging from 512 to 1024 (inclusive).
- * </pre>
- */
- privatestaticfinalint KEY_SIZE = 1024;
- /**
- * DH加密下需要一種對稱加密演算法對資料加密,這裡我們使用DES,也可以使用其他對稱加密演算法。
- */
- publicstaticfinal String SECRET_ALGORITHM = "DES";
- privatestaticfinal String PUBLIC_KEY = "DHPublicKey";
- privatestaticfinal String PRIVATE_KEY = "DHPrivateKey";
- /**
- * 初始化甲方金鑰
- *
- * @return
- * @throws Exception
- */
- publicstatic Map<String, Object> initKey() throws Exception {
- KeyPairGenerator keyPairGenerator = KeyPairGenerator
- .getInstance(ALGORITHM);
- keyPairGenerator.initialize(KEY_SIZE);
- KeyPair keyPair = keyPairGenerator.generateKeyPair();
- // 甲方公鑰
- DHPublicKey publicKey = (DHPublicKey) keyPair.getPublic();
- // 甲方私鑰
- DHPrivateKey privateKey = (DHPrivateKey) keyPair.getPrivate();
- Map<String, Object> keyMap = new HashMap<String, Object>(2);
- keyMap.put(PUBLIC_KEY, publicKey);
- keyMap.put(PRIVATE_KEY, privateKey);
- return keyMap;
- }
- /**
- * 初始化乙方金鑰
- *
- * @param key
- * 甲方公鑰
- * @return
- * @throws Exception
- */
- publicstatic Map<String, Object> initKey(String key) throws Exception {
- // 解析甲方公鑰
- byte[] keyBytes = decryptBASE64(key);
- X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
- KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
- PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
- // 由甲方公鑰構建乙方金鑰
- DHParameterSpec dhParamSpec = ((DHPublicKey) pubKey).getParams();
- KeyPairGenerator keyPairGenerator = KeyPairGenerator
- .getInstance(keyFactory.getAlgorithm());
- keyPairGenerator.initialize(dhParamSpec);
- KeyPair keyPair = keyPairGenerator.generateKeyPair();
- // 乙方公鑰
- DHPublicKey publicKey = (DHPublicKey) keyPair.getPublic();
- // 乙方私鑰
- DHPrivateKey privateKey = (DHPrivateKey) keyPair.getPrivate();
- Map<String, Object> keyMap = new HashMap<String, Object>(2);
- keyMap.put(PUBLIC_KEY, publicKey);
- keyMap.put(PRIVATE_KEY, privateKey);
- return keyMap;
- }
- /**
- * 加密<br>
- *
- * @param data
- * 待加密資料
- * @param publicKey
- * 甲方公鑰
- * @param privateKey
- * 乙方私鑰
- * @return
- * @throws Exception
- */
- publicstaticbyte[] encrypt(byte[] data, String publicKey,
- String privateKey) throws Exception {
- // 生成本地金鑰
- SecretKey secretKey = getSecretKey(publicKey, privateKey);
- // 資料加密
- Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm());
- cipher.init(Cipher.ENCRYPT_MODE, secretKey);
- return cipher.doFinal(data);
- }
- /**
- * 解密<br>
- *
- * @param data
- * 待解密資料
- * @param publicKey
- * 乙方公鑰
- * @param privateKey
- * 乙方私鑰
- * @return
- * @throws Exception
- */
- publicstaticbyte[] decrypt(byte[] data, String publicKey,
- String privateKey) throws Exception {
- // 生成本地金鑰
- SecretKey secretKey = getSecretKey(publicKey, privateKey);
-
相關推薦
Java加密技術(五)DH
接下來我們分析DH加密演算法,一種適基於金鑰一致協議的加密演算法。 DH Diffie-Hellman演算法(D-H演算法),金鑰一致協議。是由公開金鑰密碼體制的奠基人Diffie和Hellman所提出的一種思想。簡單的說就是允許兩名使用者在公開媒體上交換資訊以
Java加密技術(一)——BASE64與單向加密算法MD5&SHA&MAC
sha256 integer 被人 sent 發現 Coding design 如果 targe http://snowolf.iteye.com/blog/379860 加密解密,曾經是我一個畢業設計的重要組件。在工作了多年以後回想當時那個加密、解密算法,實在是太單
Java加密技術(八)——數字證書
keystore 表示 encode png 代碼 簽名 更新 rsa加密 turn 原文:http://snowolf.iteye.com/blog/391931 請大家在閱讀本篇內容時先閱讀 Java加密技術(四),預先了解RSA加密算法。 在構建Java代碼實現前
java基礎回顧(五)線程詳解以及synchronized關鍵字
dom com stack 相互 ++ 關於 而是 。。 str 本文將從線程的使用方式、源碼、synchronized關鍵字的使用方式和陷阱以及一些例子展開java線程和synchronized關鍵字的內容。 一、線程的概念 線程就是程序中單獨順序的流控制。線程本 身不能
java設計模式(五)責任鏈模式
args 測試 處理 next 設計 ted static rgs stat 很多對象有每個對象對其下家的引用而連接起來形成一條鏈,請求在這條鏈上傳遞,直到鏈上某個對象決定處理此請求,應用場景如單位審批流程等。 要點:1)抽象處理者角色:定義處理請求接口及設定下家引
Java基礎——Oracle(五)
file get 沒有 當前日期 _for 結構 earch 導入 數據庫管理 一、Oracle 中的分頁 1) select * from emp; 2)select * ,rownum from emp; //這樣寫不行 3)select ename,job,sal,
Java常用類(五)之集合工具類Collections
可變集合 並發 nts oid element 出現的次數 ole 最小 概述 前言 Java提供了一個操作Set、List和Map等集合的工具類:Collections,該工具類提供了大量方法對集合進行排序、查詢和修改等操作, 還提供了將集合對象置為不可
Java集合框架(五)—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap
getprop color name 找到 文件 remove style 情況 read Map Map用於保存具有映射關系的數據,因此Map集合裏保存著兩組值,一組值用於保存Map裏的key,另一組值用於保存Map裏的value,key和value
Java面試題(五)
Java 基礎 程序員 面試 (1)面試題:數組中有沒有length(),字符串中有沒有length(),集合中有沒有length()? 數組中沒有length()方法,只有length屬性 字符串中有length()
Java 刷題(五)
IE ont bubuko pic remove ins help int ace Codewars 刷題第五天,數組問題。 Enough is enough! Alice and Bob were on a holiday. Both of them took many
Java Thread系列(五)synchronized
執行 java 釋放 lock java t 操作 bject 線程 出現 Java Thread系列(五)synchronized synchronized鎖重入 關鍵字 synchronized 擁有鎖重入的功能,也就是在使用 synchronized 時,當線程等到
Java虛擬機(五)Java的四種引用級別
tsp 進行 tro 圖片 分享 ros 通過 技術 存在 1.前言 HotSpot采取了可達性分析算法用來判斷對象是否被能被GC,無論是引用計算法還是可達性分析算法都是判斷對象是否存在引用來判斷對象是否存活。如果reference類型的數據中存儲的數值代表的是另外一塊
Java面試題(五)線程及集合補充
每一個 場景 nds 試題 個數 安全 應用程序 -- 服務器 1,一個進程就是一個應用程序。一個線程就是一個進程中運行的最小單元。 一個進程可以包括多線程。 餐館(進程)。 主線程。 服務員(線程) 服務員(線程) 服務員(線程) 服務員(線程) 加塞,讓步,守護,
第13講 | 深入區塊鏈技術(五):PoS共識機制
運行 離線 難題 感謝 並且 發現 即使 pos系統 分享 上一篇我們講到了PoW共識機制,這一篇我們就來分享另外一種共識機制,PoS共識機制。 PoS全稱是Proof of Stake,中文翻譯為權益證明。這一篇我們會將PoS與PoW對比講解,幫助你加深理解。
.net轉java 學習筆記 (五) 使用eclipse 搭建 ssh框架( struts spring hibernate )
註入 mage 面向切面 但是 模式 nbsp gen pro jdbc ssh為 struts+spring+hibernate的一個集成框架,是目前較流行的一種Web應用程序開源框架 struts :是一個基於MVC設計模式的Web應用框架,struts類似.net
Java NIO教程(五) 通道之間的資料傳輸
Java NIO教程(五) 通道之間的資料傳輸
Java設計模式(五)之建立型模式:原型模式
一、定義: 用原型例項指定建立物件的種類,並通過拷貝這些原型建立新的物件。 UML類圖: 原型模式主要用於物件的複製,它的核心是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個條件: (1)實現Cloneable介面:在java語言有一個Cloneab
Java開發筆記(五)數值變數的型別
如今個人電腦的配置越來越高,記憶體和硬碟的容量大小都是以G為單位,而1G=1024M=10241024K=102410241024位元組。不過在PC的早期發展階段,電腦的儲存空間卻是十分有限的,像2000年前後廣泛使用的3.5寸軟盤,其儲存容量只有區區1.44M,當時流行的SDR記憶體容
Java自學筆記(五)
陣列(引用記憶體地址,涉及到JVM,方法棧,堆,不用手動清除記憶體) 一維陣列 資料型別[] 變數名稱 = new 資料型別[儲存元素個數]; 資料型別[] 變數名稱 = new 資料型別[] {元素1,元素2,……,元素N}; 資料型別
JAVA複習筆記(五)
二維陣列 矩陣。 m[i][j] 第i行 j列 表示一個由行列組成的資料,例如:表格 1