1. 程式人生 > >[JAVA加解密]仿照DH演算法編寫ECDH演算法時遇到的一些問題

[JAVA加解密]仿照DH演算法編寫ECDH演算法時遇到的一些問題

一、

下午在編寫ECDH演算法中乙方用甲方公鑰產生金鑰時,想到keyFactory能把金鑰材料變成金鑰,我是這麼敲的:

	public static final Map<String,Object> initKey(byte[] key) throws NoSuchAlgorithmException, InvalidKeySpecException{
		X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key);
		
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		ECPublicKey pubKey = (ECPublicKey)keyFactory.generatePublic(x509EncodedKeySpec);
		
		ECParameterSpec ecParam = pubKey.getParams();
		
		ECPublicKey publicKey = (ECPublicKey) keyFactory.generatePublic((KeySpec) ecParam);
		ECPrivateKey privateKey = (ECPrivateKey)keyFactory.generatePrivate((KeySpec)ecParam);
		
		Map<String,Object> keyMap = new HashMap<String,Object>(2);
		keyMap.put(PUBLIC_KEY, publicKey);
		keyMap.put(PRIVATE_KEY, privateKey);
		
		return keyMap;
		
	}

Junit報錯:java.lang.ClassCastException: sun.security.ec.NamedCurve cannot be cast to java.security.spec.KeySpec
at com.fdc.ECDHCoder.initKey(ECDHCoder.java:63)
at com.fdc.ECDHCoderTest.initKey(ECDHCoderTest.java:36)
……

通過查證發現,ECParameterSpec物件並非KeySpec的子類,它們的關係是這樣的:

interface AlgorithmParamSpec
class ECParamterSpec

ECParamterSpec實現了AlgorithmParamSpec介面

而KeyPairGenerator能接收這個引數

Class KeyPairGenerator

void Initializes the key pair generator using the specified parameter set and the SecureRandomimplementation of the highest-priority installed provider as the source of randomness.
void Initializes the key pair generator with the given parameter set and source of randomness.
void Initializes the key pair generator for a certain keysize using a default parameter set and theSecureRandom implementation of the highest-priority installed provider as the source of randomness.
void Initializes the key pair generator for a certain keysize with the given source of randomness (and a default parameter set).

進一步查詢得到:

Interface KeySpec

Class KeyFactory

    • java.security.KeyFactory
Modifier and Type Method and Description
Generates a private key object from the provided key specification (key material).

而且並沒有產生SecretKey的方法,回到AES演算法發現,原來當時的secretKey是由SecretKeyFactory產生的

Class SecretKeyFactory

    • javax.crypto.SecretKeyFactory
Modifier and Type Method and Description
Generates a SecretKey object from the provided key specification (key material).

不但如此,SecretKeyFactory並不繼承KeyFactory,兩者是並列的!

綜上,

KeyFactory的作用細化為:可將金鑰材料類KeySpec物件轉換成PublicKey,PrivateKey類物件

Interface PublicKey

二、BouncyCastle安裝

http://www.bouncycastle.org/latest_releases.html

注意JDK,JRE目錄下java,security的替換

三、小結:

1.DH演算法的精髓:甲乙雙方並沒有交換本地金鑰,依然可以完成資料對稱加密的實現

2.ECDH演算法金鑰長度取值:112,256,571,對本地金鑰的演算法不如DH那樣全面,AES,DES,DESede都失敗

3.X509EncodedKeySpec 和 PKCS8KeySpec 為EncodedKeySpec的子類,前者用於轉換公鑰編碼金鑰,後者用於轉換私鑰編碼金鑰

相關推薦

[JAVA解密]仿照DH演算法編寫ECDH演算法遇到的一些問題

一、 下午在編寫ECDH演算法中乙方用甲方公鑰產生金鑰時,想到keyFactory能把金鑰材料變成金鑰,我是這麼敲的: public static final Map<String,Object> initKey(byte[] key) throws NoSu

JAVA加密解密DH(Diffie-Hellman)演算法

DH演算法簡介 Diffie-Hellman演算法(D-H演算法),金鑰一致協議。是由公開金鑰密碼體制的奠基人Diffie和Hellman所提出的一種思想。簡單的說就是允許兩名使用者在公開媒體上交換資訊以生成”一致”的、可以共享的金鑰。換句話說,就是由甲方產出

[JAVA解密]RSA演算法、ElGamal演算法

一、RSA演算法: 1、簡介:RSA公鑰加密演算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一

第十八篇:JAVA加密解密DH(Diffie-Hellman)演算法

DH演算法簡介 Diffie-Hellman演算法(D-H演算法),金鑰一致協議。是由公開金鑰密碼體制的奠基人Diffie和Hellman所提出的一種思想。簡單的說就是允許兩名使用者在公開媒體上交換資訊以生成”一致”的、可以共享的金鑰。換句話說,就是由甲方產出一對金鑰(

Java解密與數字簽名

對稱 數組 aes 生成密鑰 分解 encode rup 特性 ntc Java加解密與數字簽名 2016-08-30 蕊蕊 java編程 ** Java加解密 ** 實現方式:JDK實現,CC,B

Java解密服務API解讀

ase dsa secret ner adding ogr 傳遞 ast 秘鑰 引言 本文是對Java Crypto API的解讀 。Java Cryptography API允許你對數據進行加解密操作,同時進行秘鑰管理,簽名等操作。 Java加解密服務涉及的包有: ja

Java 解密技術之SHA

序上一篇文章中介紹了基本的單向加密演算法 — — MD5,也大致的說了說它實現的原理。這篇文章繼續之前提到的單向加密,主要講的是 SHA,同 MD5 一樣,SHA 同樣也是一個系列,它包括 SHA-1,SHA-224,SHA-256,SHA-384,和 SHA-512 等幾種

java解密之RSA使用

最近為了分析一段請求流,不得不去研究一下RSA加密。 首先,強調一點:金鑰的“鑰”讀“yue”,不是“yao”,額。。。 網上關於RSA的原理一抓一大把的,這裡只是簡單說說我的理解: 1. 兩個足夠大的互質數p, q; 2. 用於模運算的模 n=p*q; 3. 公鑰KU(e

java解密之3重DES

單重DES加密較容易破解,為了提高安全性,3重DES加密就是在單重的基礎上衍生出來的,一般3重DES用的比較頻繁。加密過程為加密-解密-加密。 我一直想找用自己定義金鑰的方法來做程式,網上找了很多都找不到,單重倒是有很多,因此只能自己研究研究了,現在拿出來給各位做java的

Java 解密技術系列之 DES

序 前幾篇文章講的都是單向加密演算法,其中涉及到了 BASE64、MD5、SHA、HMAC 等幾個比較常見的加解密演算法。這篇文章,以及後面幾篇,打算介紹幾個對稱加密演算法,比如:DES、3DES(TripleDES)、AES 等。那麼,這篇文章主要是對 DES 大概講一

Java 解密技術系列之 RSA

<span style="font-family:Comic Sans MS;font-size:12px;">package com.test.rsa; import com.google.common.collect.Maps; import sun.misc.BASE64Decoder;

nodejs和java解密

一、首先安裝node.js mac 安裝完 mode -v 檢視安裝是否成功 touch hello-word.js 找個

.NET Core解密實戰系列之——對稱加密演算法

## 簡介 加解密現狀,編寫此係列文章的背景: - 需要考慮系統環境相容性問題(Linux、Windows) - 語言互通問題(如C#、Java等)(加解密本質上沒有語言之分,所以原則上不存在互通性問題) - 網上資料版本不一、或不全面 - .NET官方庫密碼演算法提供不全面,很難針對其他語言(Java)進

記一個加密演算法 java 3DES (DESede/ECB/PKCS5Padding) 解密

對接一個介面,需要用到DESede/ECB/PKCS5Padding 進行加密, 剛開始以為很牛逼... 上程式碼 private static Cipher DES_CIPHER; s

【密碼學】維吉尼亞密碼解密原理及其破解演算法Java實現

1. 維吉尼亞密碼方陣 人們在愷撒移位密碼的基礎上擴展出多表密碼,稱為維吉尼亞密碼。該方法最早記錄在吉奧萬·巴蒂斯塔·貝拉索( Giovan Battista Bellaso)於1553年所著的書《吉奧萬·巴蒂斯塔·貝拉索先生的密碼》 第一行代表明文字母

RSA演算法解密(JAVA)

/** * RSA加密演算法的演示驗證 * RSA是一種分組加密演算法 * 注意:金鑰對採用的長度決定了加密塊的長度,我這裡取的是2048,即256byte * 由於加密塊的長度固定為256,因此明文的長度至多為256 - 11 = 245byte * 我這裡明文

Java利用 AES/ECB/PKCS5Padding 演算法解密

Java利用  AES/ECB/PKCS5Padding 演算法加解密。 package com.newland.njwpayment.utils;   import javax.crypto.Cipher;   import javax.crypto.spec.

Java基礎之解密(三) SHA安全雜湊演算法

介紹:安全雜湊演算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。該演算法的思想是接收一段明文,

JAVA】常用解密演算法總結及JAVA實現【BASE64,MD5,SHA,DES,3DES,AES,RSA】

BASE64 這其實是一種編解碼方法,但是隻要我們能夠將原文變成肉眼不可識別的內容,其實就是一種加密的方法。 BASE64 的編碼都是按字串長度,以每 3 個 8 bit 的字元為一組,然後針對每組,首先獲取每個字元的 ASCII 編碼,然後將 ASCII 編碼轉換成 8

java 加密演算法 base64 以及 自定義 解密

import sun.misc.BASE64Decoder; public class Base64Utils {    public static String getBASE64(byte[] b) {   String s = null;   if (b !=