最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java編程實(shí)現(xiàn)非對(duì)稱加密的方法詳解

 更新時(shí)間:2017年08月11日 12:06:09   作者:遲做總比不做強(qiáng)  
這篇文章主要介紹了Java編程實(shí)現(xiàn)非對(duì)稱加密的方法,簡單講述了非對(duì)稱加密的概念、原理,并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)DH加密解密、RSA加密解密、ElGamal加密等具體操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Java編程實(shí)現(xiàn)非對(duì)稱加密的方法。分享給大家供大家參考,具體如下:

對(duì)稱加密算法在加密和解密時(shí)使用的是同一個(gè)秘鑰;而非對(duì)稱加密算法需要兩個(gè)密鑰來進(jìn)行加密和解密,這兩個(gè)秘鑰是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。

是一種 高級(jí)的雙保險(xiǎn)加密方式,一般的實(shí)現(xiàn)加密方式有DH密鑰交換算法,RSA基于因子分解算法,ElGamal離散對(duì)數(shù)算法及ECC橢圓曲線加密等。

DH加密解密

/**
 * 非對(duì)稱加密之:DH加密
 * 非對(duì)稱DH,是安全性基于在有限域中計(jì)算離散對(duì)數(shù)的難度的一種加密算法。
 * 可用于密鑰分發(fā),但不能用于加/解密報(bào)文。DH即Diffie-Hellman算法的簡寫,也縮寫為D-H算法。
 * D-H加密算法的核心思想就是大素?cái)?shù)不可分解質(zhì)因數(shù)的數(shù)學(xué)理論方法。
 * @description:
 * @date 2015-10-29 上午9:08:14
 */
public class EncryptDH {
private static String dhStr = "encrypt test by DH";
public static void main(String[] args) {
jdkDh();
}
private static void jdkDh() {
try {
// 初始化發(fā)送方密鑰
KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");
senderKeyPairGenerator.initialize(512);
KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair();
byte[] senderPublicKeyEnc = senderKeyPair.getPublic().getEncoded();// 發(fā)送方的公鑰,發(fā)送給接受方,發(fā)送方式多種,比如文件,網(wǎng)絡(luò)等
// 初始化接受方密鑰
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 receiveKeyPair = receiverKeyPairGenerator.generateKeyPair();
PrivateKey receiverPrivateKey = receiveKeyPair.getPrivate();
byte[] receiverPublicKeyEnc = receiveKeyPair.getPublic().getEncoded();
// 密鑰構(gòu)建
KeyAgreement receiverKeyAgreement = KeyAgreement.getInstance("DH");
receiverKeyAgreement.init(receiverPrivateKey);
receiverKeyAgreement.doPhase(receiverPublicKey, true);
SecretKey receiverSecretKey = 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 snederSecretKey = senderKeyAgreement.generateSecret("DES");
if (Objects.equals(receiverSecretKey, snederSecretKey)) {
System.out.println("雙方密鑰相同");
}
// 加密
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, snederSecretKey);
byte[] result = cipher.doFinal(dhStr.getBytes());
System.out.println("DH加密后為:" + Base64.encode(result));
// 解密
cipher.init(Cipher.DECRYPT_MODE, receiverSecretKey);
result = cipher.doFinal(result);
System.out.println("DH解密后為:" + new String(result));
}
catch (Exception e) {
e.printStackTrace();
}
}
}

RSA加密解密

/**
 * 非對(duì)稱加密之:RSA加密
 * @description:
 * RSA公鑰加密算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。
 * 1987年首次公布,當(dāng)時(shí)他們?nèi)硕荚诼槭±砉W(xué)院工作。RSA就是他們?nèi)诵帐祥_頭字母拼在一起組成的。
 * RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。
 * 今天只有短的RSA鑰匙才可能被強(qiáng)力方式解破。到2008年為止,世界上還沒有任何可靠的攻擊RSA算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實(shí)際上是不能被解破的。
 * 但在分布式計(jì)算和量子計(jì)算機(jī)理論日趨成熟的今天,RSA加密安全性受到了挑戰(zhàn)。
 * RSA算法基于一個(gè)十分簡單的數(shù)論事實(shí):將兩個(gè)大素?cái)?shù)相乘十分容易,但是想要對(duì)其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
 * @date 2015-10-29 上午9:08:14
 */
public class EncryptRSA {
private static String rsaStr = "encrypt test by ElGamal";
public static void main(String[] args) {
jdkRSA();
}
private static void jdkRSA() {
try {
// 初始化密鑰
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
System.out.println("RSA公鑰:" + Base64.encode(rsaPublicKey.getEncoded()));
System.out.println("RSA私鑰:" + Base64.encode(rsaPrivateKey.getEncoded()));
// 私鑰加密,公鑰解密--加密
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(rsaStr.getBytes());
System.out.println("RSA私鑰加密,公鑰解密--加密:" + Base64.encode(result));
// 私鑰加密,公鑰解密--解密
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
result = cipher.doFinal(result);
System.out.println("RSA私鑰加密,公鑰解密--解密:" + new String(result));
// 公鑰加密,私鑰解密--加密
x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
result = cipher.doFinal(rsaStr.getBytes());
System.out.println("公鑰加密,私鑰解密--加密:" + Base64.encode(result));
// 公鑰加密,私鑰解密--解密
pkcs8EncodedKeySpec=new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
privateKey= keyFactory.generatePrivate(pkcs8EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
result = cipher.doFinal(result);
System.out.println("公鑰加密,私鑰解密--解密:" + new String(result));
}
catch (Exception e) {
e.printStackTrace();
}
}
}

ElGamal加密

/**
 * 非對(duì)稱加密之:ElGamal加密
 * @description:
 * ElGamal算法,是一種較為常見的加密算法,它是基于1984年提出的公鑰密碼體制和橢圓曲線加密體系。
 * 既能用于數(shù)據(jù)加密也能用于數(shù)字簽名,其安全性依賴于計(jì)算有限域上離散對(duì)數(shù)這一難題。
 * 在加密過程中,生成的密文長度是明文的兩倍,且每次加密后都會(huì)在密文中生成一個(gè)隨機(jī)數(shù)K,
 * 在密碼中主要應(yīng)用離散對(duì)數(shù)問題的幾個(gè)性質(zhì):求解離散對(duì)數(shù)(可能)是困難的,而其逆運(yùn)算指數(shù)運(yùn)算可以應(yīng)用平方-乘的方法有效地計(jì)算。
 * 也就是說,在適當(dāng)?shù)娜篏中,指數(shù)函數(shù)是單向函數(shù)。
 * @date 2015-10-29 上午9:08:14
 */
public class EncrypElGamal {
private static String rsaStr = "encrypt test by ElGamal";
public static void main(String[] args) {
jdkRSA();
}
private static void jdkRSA() {
try {
// 公鑰加密,私鑰解密
// Security.addProvider(new BouncyCastleProvider());//需要添加bouncycastleprovider jar
//初始化密鑰
AlgorithmParameterGenerator algorithmParameterGenerator=AlgorithmParameterGenerator.getInstance("ElGamal");
algorithmParameterGenerator.init(256);
AlgorithmParameters algorithmParameters=algorithmParameterGenerator.generateParameters();
DHParameterSpec dhParameterSpec=algorithmParameters.getParameterSpec(DHParameterSpec.class);
KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("ElGamal");
keyPairGenerator.initialize(dhParameterSpec,new SecureRandom());
KeyPair keyPair=keyPairGenerator.generateKeyPair();
PublicKey publicKey=keyPair.getPublic();
PrivateKey privateKey=keyPair.getPrivate();
System.out.println("ElGamal加密公鑰:"+Base64.encode(publicKey.getEncoded()));
System.out.println("ElGamal加密私鑰:"+Base64.encode(privateKey.getEncoded()));
//加密解密同Rsa是一樣的
}
catch (Exception e) {
e.printStackTrace();
}
}
}

Ecc加密可以參考:http://www.pediy.com/kssd/pediy06/pediy6014.htm等。

PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線工具:

文字在線加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode

MD5在線加密工具:
http://tools.jb51.net/password/CreateMD5Password

在線散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt

在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha

在線sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《java日期與時(shí)間操作技巧匯總》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Java代碼中與Lua相互調(diào)用實(shí)現(xiàn)詳解

    Java代碼中與Lua相互調(diào)用實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了Java代碼中與Lua相互調(diào)用實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Eclipse智能提示及快捷鍵

    Eclipse智能提示及快捷鍵

    本文主要介紹了Eclipse智能提示及快捷鍵的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • 深入解讀Java代碼組織中的package包結(jié)構(gòu)

    深入解讀Java代碼組織中的package包結(jié)構(gòu)

    這篇文章主要介紹了Java代碼組織中的package包結(jié)構(gòu),是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-03-03
  • Java基礎(chǔ)學(xué)習(xí)之反射機(jī)制原理詳解

    Java基礎(chǔ)學(xué)習(xí)之反射機(jī)制原理詳解

    反射是框架的靈魂,Java框架底層都是用反射機(jī)制+xml配置等來實(shí)現(xiàn)的,本文將通過示例詳細(xì)講解Java中的反射機(jī)制,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-03-03
  • 在Java程序中使用數(shù)據(jù)庫的新方法

    在Java程序中使用數(shù)據(jù)庫的新方法

    這篇文章主要介紹了在Java程序中使用數(shù)據(jù)庫的新方法,講述了Java8以來數(shù)據(jù)庫API的一些新特性,需要的朋友可以參考下
    2015-07-07
  • 解決FileWriter 寫入文本不換行的問題

    解決FileWriter 寫入文本不換行的問題

    這篇文章主要介紹了解決FileWriter 寫入文本不換行的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java+Spring+MySql環(huán)境中安裝和配置MyBatis的教程

    Java+Spring+MySql環(huán)境中安裝和配置MyBatis的教程

    這篇文章主要介紹了Java+Spring+MySql環(huán)境中安裝和配置MyBatis的教程,MyBatis一般被用來增強(qiáng)數(shù)據(jù)庫操作,文中對(duì)MyBatis的主配置文件有較為詳細(xì)的講解,需要的朋友可以參考下
    2016-04-04
  • Java模擬UDP通信示例代碼

    Java模擬UDP通信示例代碼

    這篇文章主要介紹了Java模擬UDP通信,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • springboot實(shí)現(xiàn)簡單的消息對(duì)話的示例代碼

    springboot實(shí)現(xiàn)簡單的消息對(duì)話的示例代碼

    本文主要介紹了springboot實(shí)現(xiàn)簡單的消息對(duì)話的示例代碼,可以使用WebSocket技術(shù),WebSocket是一種在客戶端和服務(wù)器之間提供實(shí)時(shí)雙向通信的協(xié)議,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 從架構(gòu)思維角度分析分布式鎖方案

    從架構(gòu)思維角度分析分布式鎖方案

    這篇文章主要介紹了從架構(gòu)與思維的角度來分析分布式鎖的方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-01-01

最新評(píng)論

成都市| 资中县| 云和县| 济阳县| 台前县| 金门县| 泗阳县| 古丈县| 龙胜| 金乡县| 永修县| 沁阳市| 河津市| 会理县| 寿阳县| 大足县| 正安县| 庆阳市| 四平市| 白城市| 清丰县| 泰州市| 卢湾区| 祁门县| 拉萨市| 礼泉县| 通海县| 兴义市| 大足县| 台安县| 乌鲁木齐县| 繁峙县| 准格尔旗| 珲春市| 德钦县| 建平县| 岚皋县| 扎鲁特旗| 凤冈县| 诸暨市| 汶川县|