-
RSA算法是第一個(gè)能同時(shí)用于加密和數(shù)字簽名的算法 目前還沒(méi)有被破解,是使用最多的非對(duì)稱加密算法. RSA算法支持公鑰加密、私鑰解密.私鑰加密、公鑰解密. 有些算法只規(guī)定了公鑰加密、私鑰解密. RSA密鑰長(zhǎng)度:512~65536(64整數(shù)倍). JDK實(shí)現(xiàn)RSA算法的密鑰默認(rèn)長(zhǎng)度為1024,BC則是2048.查看全部
-
使用KeyPair、KeyFactory都可以產(chǎn)生密鑰對(duì). DH: 由甲方公鑰產(chǎn)生乙方密鑰對(duì)時(shí)候,需要使用X509EncodedKeySpec進(jìn)行密鑰轉(zhuǎn)換. 在構(gòu)造本地密鑰過(guò)程中,需要使用X509EncodedKeySpec分別對(duì)公鑰與密鑰進(jìn)行轉(zhuǎn)換. RSA: 在加密、解密之前都需要使用X509EncodedKeySpec進(jìn)行密鑰轉(zhuǎn)換.查看全部
-
DH密鑰交換算法使用場(chǎng)景.查看全部
-
//加密 p1-加密數(shù)據(jù) p2-本地密鑰. public static byte[] encrypt(byte[] data,byte[] key){ //生成本地密鑰 SecretKey secretKey=new SecretKeySpec(key,SECRET_ALGORITHM); //數(shù)據(jù)加密 Cipher cipher=Cipher.getInstance(secretKey.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, secretKey); return cipher.doFinal(data); } //解密 public static byte[] decrypt(byte[] data,byte[] key){ //生成本地密鑰 SecretKey secretKey=new SecretKeySpec(key,SECRET_ALGORITHM); //數(shù)據(jù)解密 Cipher cipher=Cipher.getInstance(secretKey.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, secretKey); return cipher.doFinal(data); } 測(cè)試類中: 調(diào)用generateKey()、getPublicKey()、getPrivateKey()方法生成并獲取公鑰私鑰(甲方). 調(diào)用generatekey(byte [] key)、getPublicKey()、getPrivateKey()方法構(gòu)造并獲取公鑰私鑰(乙方). 調(diào)用getSecretKey(byte [] b1,byte[] b2)方法分別組裝甲方的本地密鑰與乙方的本地密鑰. 組裝甲方本地密鑰(甲方私鑰,乙方公鑰) 組裝乙方本地密鑰(乙方私鑰,甲方公鑰) 調(diào)用加密解密方法.查看全部
-
//構(gòu)建本地密鑰 public static byte[] getSecretKey(byte[] publicKey,byte[] privateKey){ //初始化公鑰、密鑰材料轉(zhuǎn)換 X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(publicKey); //實(shí)例化密鑰工廠 KeyFactory keyFactory=KeyFactory.getInstance("DH"); //產(chǎn)生轉(zhuǎn)換后的公鑰 PublicKey pubKey=keyFactory.generatePublic(x509KeySpec); //初始化私鑰、密鑰材料轉(zhuǎn)換 PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(privateKey); //產(chǎn)生轉(zhuǎn)換后的私鑰 PrivateKey priKey=keyFactory.generatePrivate(pkcs8KeySpec); KeyAgreement keyAgree=KeyAgreement.getInstance("DH"); //初始化 keyAgree.init(priKey); //下一步初始化 keyAgree.doPhase(pubKey, true); //生成本地密鑰 SecretKey secretKey=keyAgree.generateSecret("AES"); return secretKey.getEncoded(); }查看全部
-
//獲取公鑰 public static byte[] getPublicKey(Map<String,Object> keyMap){ Key key=(Key) keyMap.get(PUBLIC_KEY); return key.getEncoded(); } //獲取私鑰 public static byte[] getPrivateKey(Map<String,Object> keyMap){ Key key=(Key)keyMap.get(PRIVATE_KEY); return key.getEncoded(); }查看全部
-
//根據(jù)一方公鑰生成另一方密鑰對(duì) public static Map<String,Object> generateKey(byte[] key){ //解析甲方的公鑰、轉(zhuǎn)換公鑰的材料 X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key); //實(shí)例化密鑰工廠 KeyFactory keyFactory=KeyFactory.getInstance("DH"); //產(chǎn)生轉(zhuǎn)換后的公鑰,該公鑰是甲方的 PublicKey pubKey=keyFactory.generatePublic(x509KeySpec); //由甲方的公鑰構(gòu)造乙方密鑰 DHParameterSpec dhParamSpec=((DHPublicKey)pubKey).getParams(); //實(shí)例化密鑰生成器 KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(keyFactory.getAlgorithm()); //初始化密鑰生成器 keyPairGenerator.initialize(dhParamSpec); //產(chǎn)生密鑰對(duì) KeyPair keyPair=keyPairGenerator.genKeyPair(); //乙方公鑰 DHPublicKey publicKey=(DHPublicKey)keyPair.getPublic(); //乙方私鑰 DHPrivateKey privateKey=(DHPrivateKey)keyPair.getPrivate(); //將密鑰存儲(chǔ)在Map中 Map<String,Object> keyMap=new HashMap<String,Object>(); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; }查看全部
-
代碼部分: //初始化甲方密鑰對(duì). public static Map<String,Object> generateKey(){ //實(shí)例化密鑰對(duì)生成器 KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("DH"); //初始化密鑰對(duì)生成器 keyPairGenerator.initialize(KEY_SIZE); //生成密鑰對(duì) KeyPair keyPair=keyPairGenerator.generateKeyPair(); //甲方公鑰 DHPublicKey publicKey=(DHPublicKey) keyPair.getPublic(); //甲方私鑰 DHPrivateKey privateKey=(DHPrivateKey) keyPair.getPrivate(); //將密鑰存儲(chǔ)在map中 Map<String,Object> keyMap=new HashMap<String,Object>(); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; }查看全部
-
KeyAgreement類用于生成本地密鑰(提供密鑰協(xié)定或密鑰交換協(xié)議的功能).使用其getInstance()靜態(tài)方法創(chuàng)建實(shí)例,參數(shù)是算法名,指定生成的本地密鑰符合某種特定算法. KeyAgreement類的init()方法用于給定密鑰初始化此密鑰協(xié)定.doPhase()方法用于用給定密鑰執(zhí)行此密鑰協(xié)定的下一個(gè)階段.兩個(gè)方法的參數(shù)都是Key類型,即使用公鑰、私鑰來(lái)初始化密鑰協(xié)定. KeyAgreement類的generateSecret()方法創(chuàng)建本地密鑰,參數(shù)是對(duì)稱加密算法名稱.返回SecretKey類型.查看全部
-
KeyPairGenerator:密鑰對(duì)生成器 KeyGenerator:密鑰生成器 使用KeyPairGenerator的getInstance()靜態(tài)方法創(chuàng)建實(shí)例,參數(shù)是算法名稱.指定密鑰對(duì)生成器生成指定算法的密鑰對(duì). 使用KeyPairGenerator的initialize()方法初始化密鑰的長(zhǎng)度. 使用KeyPairGenerator的generateKeyPair()方法創(chuàng)建KeyPair實(shí)例.一個(gè)KeyPair實(shí)例表示一對(duì)密鑰,即一個(gè)密鑰對(duì).包括公鑰與私鑰. KeyPair的getPublic()方法返回PublicKey類型(公鑰). getPrivate()方法返回PrivateKey類型(私鑰). DHPublicKey接口、DHPrivateKey接口分別繼承PublicKey接口與PrivateKey接口. X509EncodedKeySpec實(shí)例作用是把密鑰按照X.509標(biāo)準(zhǔn)進(jìn)行編碼. 直接new一個(gè)實(shí)例,構(gòu)造方法參數(shù)是密鑰. KeyFactory是密鑰工廠,SecretKeyFactory也是密鑰工廠.但是前者可以產(chǎn)生密鑰對(duì),即公鑰、私鑰. 使用KeyFactory的getInstance()靜態(tài)方法返回一個(gè)KeyFactory實(shí)例,參數(shù)指定算法名,指定密鑰工廠產(chǎn)生的密鑰是符合某種特定算法. 使用KeyFactory的generatePublic()方法可以生成一個(gè)公鑰,參數(shù)是X509EncodedKeySpec的實(shí)例.返回PublicKey. 使用DHPublicKey的getParams()方法返回DHParameterSpec實(shí)例. DHParameterSpec:此類指定隨同DH算法使用的參數(shù)集合,用于通過(guò)一方的公鑰生成另一方的密鑰對(duì). 使用KeyPairGenerator的initialize()初始化方法時(shí),參數(shù)還可以是DHParameterSpec的實(shí)例.用于通過(guò)一方公鑰生成密鑰對(duì).查看全部
-
JAVA DH加密算法 DH算法的默認(rèn)密鑰長(zhǎng)度是1024,密鑰長(zhǎng)度必須是64的倍數(shù),在512到1024位之間. DH是一種適基于密鑰一致協(xié)議的加密算法 密鑰一致協(xié)議就是允許兩名用戶在公開(kāi)媒體上交換信息以生成"一致"的、可以共享的密鑰. 由甲方產(chǎn)出一對(duì)密鑰(公鑰、私鑰),乙方依照甲方公鑰產(chǎn)生乙方密鑰對(duì)(公鑰、私鑰),以此為基線作為數(shù)據(jù)傳輸保密基礎(chǔ).同時(shí)雙方使用同一種對(duì)稱加密算法構(gòu)建本地密鑰(SecretKey)對(duì)數(shù)據(jù)加密. 在互通了本地密鑰算法后,甲乙雙方公開(kāi)自己的公鑰,使用對(duì)方的公鑰和剛才產(chǎn)生的私鑰加密數(shù)據(jù),同時(shí)可以使用對(duì)方的公鑰和自己的私鑰對(duì)數(shù)據(jù)解密. 流程分析: 1.甲方構(gòu)建密鑰對(duì),將公鑰公布給乙方,將私鑰保留. 乙方通過(guò)甲方公鑰構(gòu)建密鑰對(duì),將公鑰公布給甲方,將私鑰保留. 2.甲方使用自己私鑰、乙方公鑰與約定數(shù)據(jù)對(duì)稱加密算法構(gòu)建本地密鑰,然后通過(guò)本地密鑰加密數(shù)據(jù),發(fā)送給乙方加密后的數(shù)據(jù). 乙方使用自己私鑰、甲方公鑰與約定數(shù)據(jù)對(duì)稱加密算法構(gòu)建本地密鑰,然后通過(guò)本地密鑰對(duì)數(shù)據(jù)解密. 3.乙方使用自己私鑰、甲方公鑰與約定數(shù)據(jù)對(duì)稱加密算法構(gòu)建本地密鑰,然后通過(guò)本地密鑰加密數(shù)據(jù),發(fā)送給甲方加密后的數(shù)據(jù). 甲方使用私鑰、乙方公鑰與約定數(shù)據(jù)對(duì)稱加密算法構(gòu)建本地密鑰,然后通過(guò)本地密鑰對(duì)數(shù)據(jù)解密.查看全部
-
非對(duì)稱加密算法-DH(密鑰交換) 長(zhǎng)度為512~1024(64的倍數(shù))查看全部
-
對(duì)稱加密算法: 甲方與乙方事先要約定使用哪種算法與具有相同的密鑰.如何安全的傳遞密鑰是對(duì)稱加密帶來(lái)的困擾. 在這個(gè)基礎(chǔ)上產(chǎn)生了非對(duì)稱加密算法,公鑰是公開(kāi)的,自己保留私鑰,因此也不用擔(dān)心密鑰泄露的問(wèn)題.查看全部
-
非對(duì)稱加密算法的特點(diǎn): 算法強(qiáng)度復(fù)雜、安全性依賴于算法與密鑰.但是由于算法復(fù)雜,使得非對(duì)稱算法加解密速度沒(méi)有對(duì)稱算法加解密的速度快. 對(duì)稱密鑰體制中只有一種密鑰,并且是非公開(kāi)的,如果要解密就得讓對(duì)方知道密鑰.所以保證其安全性就是保證密鑰的安全. 非對(duì)稱密鑰體制有兩種密鑰,其中一個(gè)是公開(kāi)的,這樣就可以不需要像對(duì)稱密碼那樣向?qū)Ψ絺鬏斆荑€了.因此安全性就大了很多. 對(duì)稱密鑰與非對(duì)稱密鑰比較: 算法復(fù)雜度:對(duì)稱密鑰<非對(duì)稱密鑰 加解密速度:對(duì)稱密鑰>非對(duì)稱密鑰 安全性:對(duì)稱密鑰<非對(duì)稱密鑰查看全部
-
非對(duì)稱加密算法 因?yàn)榧用芎徒饷苁褂玫氖莾蓚€(gè)不同的密鑰,所以這種算法叫作非對(duì)稱加密算法. 非對(duì)稱加密算法需要兩個(gè)密鑰:公開(kāi)密鑰和私有密鑰.公開(kāi)密鑰與私有密鑰是一對(duì)的. 如果用公開(kāi)密鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私有密鑰才能解密. 如果用私有密鑰對(duì)數(shù)據(jù)進(jìn)行加密,那么只有用對(duì)應(yīng)的公開(kāi)密鑰才能解密(某些算法有提供). 非對(duì)稱加密算法實(shí)現(xiàn)機(jī)密信息交換的基本過(guò)程是: 甲方生成一對(duì)密鑰并將其中的一把作為公用密鑰向其它方公開(kāi),得到該公用密鑰的乙方使用該密鑰對(duì)信息進(jìn)行加密后再發(fā)送給甲方. 甲方再用自己保存的另一把專用密鑰對(duì)加密后的信息進(jìn)行解密. 另一方面,甲方可以使用乙方提供的公鑰對(duì)信息進(jìn)行加密后再發(fā)送給乙方,乙方再用自己的私匙對(duì)數(shù)據(jù)進(jìn)行解密. DH-密鑰交換算法是非對(duì)稱加密算法的起源. RSA-基于因子分解算法,是應(yīng)用最多的非對(duì)稱加密算法.查看全部
舉報(bào)
0/150
提交
取消