非對稱加密算法

我的博客網:https://wushaopei.github.io/    (你想要這裏多有)

1、概述

由於加密和解密使用的是兩個不一樣的密鑰,因此這種算法叫做非對稱加密算法.html

非對稱加密算法須要兩個密鑰:公開密鑰和私有密鑰. 公開密鑰與私有密鑰是一對的,這兩個共同組成一個解鑰,才能實現解密。java

特色: 高級、雙保險git

種類:github

  1. DH(Diffie-Hellman)密鑰交換算法
  2. RSA——基於因子分解  ,RSA是能夠雙向加密的:私鑰加密,公鑰解密;公鑰加密,私鑰解密。
  3. EIGamal——基於離散對數
  4. ECC(Elliptical Curve Cryptography)——橢圓曲線加密

說明:若是用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密. 若是用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密(某些算法有提供). 非對稱加密算法實現機密信息交換的基本過程是: 甲方生成一對密鑰並將其中的一把做爲公用密鑰向其它方公開,獲得該公用密鑰的乙方使用該密鑰對信息進行加密後再發送給甲方. 甲方再用本身保存的另外一把專用密鑰對加密後的信息進行解密. 另外一方面,甲方可使用乙方提供的公鑰對信息進行加密後再發送給乙方,乙方再用本身的私匙對數據進行解密.web

2、密鑰交換算法DH

一、DH算法概述

DH 對稱加密算法:數據安全、密鑰管理複雜、密鑰傳遞過程複雜(存在密鑰泄露問題)算法

非對稱加密算法的特色:apache

算法強度複雜、安全性依賴於算法與密鑰.可是因爲算法複雜,使得非對稱算法加解密速度沒有對稱算法加解密的速度快.安全

對稱密鑰體制中只有一種密鑰,而且是非公開的,若是要解密就得讓對方知道密鑰.因此保證其安全性就是保證密鑰的安全.app

非對稱密鑰體制有兩種密鑰,其中一個是公開的,這樣就能夠不須要像對稱密碼那樣向對方傳輸密鑰了.所以安全性就大了不少.ide

對稱密鑰與非對稱密鑰比較:

  • 算法複雜度:對稱密鑰<非對稱密鑰
  • 加解密速度:對稱密鑰>非對稱密鑰
  • 安全性:對稱密鑰<非對稱密鑰

二、DH算法實現過程及相關類詳解

【1】DH加密算法 密鑰交換:

初始化發送方密鑰,如:

  • KeyPairGenerator
  • KeyPair
  • PublicKey
//建立KeyPairGenerator對象 經過KeyPairGenerator來獲得KeyPair類的對象, KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");

初始化接收方密鑰,如:

  • KeyFactory
  • X509EncodedKeySpec
  • DHPublicKey
  • DHParameterSpec
  • KeyPairGenerator
  • PrivateKey

【2】密鑰構建

  • KeyAgreement
  • SecreKey
  • Keyactory
  • X509EncodedKeySpec
  • PublicKey

static KeyAgreement getInstance(String algorithm)

生成實現指定密鑰一致算法的KeyAgreement對象

【3】加密、解密

  • Cipher
Cipher cipher = Cipher.getInstance( " DES " );

三、DH算法實現

package com.webcode.cn.des;

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

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;
import javax.sound.midi.Soundbank;

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.crypto.agreement.srp.SRP6Client;
import org.bouncycastle.jcajce.provider.asymmetric.X509;
import org.omg.CORBA.PUBLIC_MEMBER;

public class DH {

	static String string = "wen-min";
	public static void main(String[] args) {
		DH.jdkDH();
	}
	
	public  static void jdkDH() {
		try {
			
			//1.初始化發送方密鑰
			KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");
			senderKeyPairGenerator.initialize(512);
			KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair();
			byte[] senderPublicKeyEnc = senderKeyPair.getPublic().getEncoded();//發送方公鑰,發送給接收方
			
			//2.初始化接收方密鑰
			KeyFactory receiverKeyFactory = KeyFactory.getInstance("DH");
			X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(senderPublicKeyEnc);
			PublicKey receiverPublicKey = receiverKeyFactory.generatePublic(x509EncodedKeySpec);
			DHParameterSpec dhParameterSpec = ((DHPublicKey)receiverPublicKey).getParams();
			KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance("DH");
			receiverKeyPairGenerator.initialize(dhParameterSpec);
			KeyPair receiverKeypair = receiverKeyPairGenerator.generateKeyPair();
			PrivateKey receiverPrivateKey = receiverKeypair.getPrivate();
			byte[] receiverPublicKeyEnc = receiverKeypair.getPublic().getEncoded();

			//3.密鑰構建
			KeyAgreement receiverKeyAgreement = KeyAgreement.getInstance("DH");
			receiverKeyAgreement.init(receiverPrivateKey);
			receiverKeyAgreement.doPhase(receiverPublicKey,true);
			SecretKey receiverDesKey = receiverKeyAgreement.generateSecret("DES");
			
			KeyFactory senderKeyFactory = KeyFactory.getInstance("DH");
			x509EncodedKeySpec = new X509EncodedKeySpec(receiverPublicKeyEnc);
			PublicKey senderPublicKey = senderKeyFactory.generatePublic(x509EncodedKeySpec);
			KeyAgreement senderKeyAgreement =  KeyAgreement.getInstance("DH");
			senderKeyAgreement.init(senderKeyPair.getPrivate());
			senderKeyAgreement.doPhase(senderPublicKey, true);
			SecretKey senderDesKey = senderKeyAgreement.generateSecret("DES");
			if(Objects.equals(receiverDesKey, senderDesKey)) {
				System.out.println("雙方密鑰相同");
			}
			
			//4.加密
			Cipher cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.ENCRYPT_MODE, senderDesKey);
			byte[] result = cipher.doFinal(string.getBytes());
			System.out.println("jdk dh eccrypt :" + Base64.encodeBase64String(result));
			
			//5.解密
			cipher.init(Cipher.DECRYPT_MODE, senderDesKey);
			result = cipher.doFinal(result);
			System.out.println("jdk dh decrypt : " + new String(result));
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

執行結果:

雙方密鑰相同
jdk dh eccrypt :Ra+RRytG7xw=
jdk dh decrypt : wen-min

四、DH加密算法的消息傳遞機制:

1.甲方構建密鑰對兒,將公鑰公佈給乙方,將私鑰保留;雙方約定數據加密算法;乙方經過甲方公鑰構建密鑰對兒,將公鑰公佈給甲方,將私鑰保留。2.甲方使用私鑰、乙方公鑰、約定數據加密算法構建本地密鑰,而後經過本地密鑰加密數據,發送給乙方加密後的數據;乙方使用私鑰、甲方公鑰、約定數據加密算法構建本地密鑰,而後經過本地密鑰對數據解密。3.乙方使用私鑰、甲方公鑰、約定數據加密算法構建本地密鑰,而後經過本地密鑰加密數據,發送給甲方加密後的數據;甲方使用私鑰、乙方公鑰、約定數據加密算法構建本地密鑰,而後經過本地密鑰對數據解密。

相關文章
相關標籤/搜索