欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

DH加密解密

/**
 * 非對稱加密之:DH加密
 * 非對稱DH,是安全性基于在有限域中計算離散對數(shù)的難度的一種加密算法。
 * 可用于密鑰分發(fā),但不能用于加/解密報文。DH即Diffie-Hellman算法的簡寫,也縮寫為D-H算法。
 * D-H加密算法的核心思想就是大素數(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加密解密

/**
 * 非對稱加密之:RSA加密
 * @description:
 * RSA公鑰加密算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。
 * 1987年首次公布,當時他們?nèi)硕荚诼槭±砉W(xué)院工作。RSA就是他們?nèi)诵帐祥_頭字母拼在一起組成的。
 * RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標準。
 * 今天只有短的RSA鑰匙才可能被強力方式解破。到2008年為止,世界上還沒有任何可靠的攻擊RSA算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實際上是不能被解破的。
 * 但在分布式計算和量子計算機理論日趨成熟的今天,RSA加密安全性受到了挑戰(zhàn)。
 * RSA算法基于一個十分簡單的數(shù)論事實:將兩個大素數(shù)相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
 * @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加密

/**
 * 非對稱加密之:ElGamal加密
 * @description:
 * ElGamal算法,是一種較為常見的加密算法,它是基于1984年提出的公鑰密碼體制和橢圓曲線加密體系。
 * 既能用于數(shù)據(jù)加密也能用于數(shù)字簽名,其安全性依賴于計算有限域上離散對數(shù)這一難題。
 * 在加密過程中,生成的密文長度是明文的兩倍,且每次加密后都會在密文中生成一個隨機數(shù)K,
 * 在密碼中主要應(yīng)用離散對數(shù)問題的幾個性質(zhì):求解離散對數(shù)(可能)是困難的,而其逆運算指數(shù)運算可以應(yī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é)運算技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《java日期與時間操作技巧匯總》、《Java操作DOM節(jié)點技巧總結(jié)》和《Java緩存操作技巧匯總

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

相關(guān)文章

  • 出現(xiàn)log.info報紅的解決方案

    出現(xiàn)log.info報紅的解決方案

    這篇文章主要介紹了出現(xiàn)log.info報紅的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • SpringBoot配置類中@Configuration和@Bean的作用

    SpringBoot配置類中@Configuration和@Bean的作用

    這篇文章主要介紹了SpringBoot配置類中@Configuration和@Bean的作用,@Configuration 指明當前類是一個配置類來替代之前的Spring配置文件,Spring boot的配置類,相當于Spring的配置文件,需要的朋友可以參考下
    2023-11-11
  • java項目構(gòu)建Gradle的使用教程

    java項目構(gòu)建Gradle的使用教程

    這篇文章主要為大家介紹了java項目構(gòu)建Gradle的使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • 詳解Java JDK動態(tài)代理

    詳解Java JDK動態(tài)代理

    這篇文章主要介紹了Java JDK動態(tài)代理的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java 代理的有關(guān)知識,感興趣的朋友可以了解下
    2020-08-08
  • java版十大排序經(jīng)典算法:完整代碼(4)

    java版十大排序經(jīng)典算法:完整代碼(4)

    優(yōu)秀的文章也不少,但是Java完整版的好像不多,我把所有的寫一遍鞏固下,同時也真誠的希望閱讀到這篇文章的小伙伴們可以自己去從頭敲一遍,不要粘貼復(fù)制!希望我的文章對你有所幫助,每天進步一點點
    2021-07-07
  • 如何計算Java對象占用了多少空間?

    如何計算Java對象占用了多少空間?

    在Java中沒有sizeof運算符,所以沒辦法知道一個對象到底占用了多大的空間,但是在分配對象的時候會有一些基本的規(guī)則,我們根據(jù)這些規(guī)則大致能判斷出來對象大小,需要的朋友可以參考下
    2016-01-01
  • 淺談Java中BIO、NIO和AIO的區(qū)別和應(yīng)用場景

    淺談Java中BIO、NIO和AIO的區(qū)別和應(yīng)用場景

    這篇文章主要介紹了Java中BIO、NIO和AIO的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Hibernate Validation自定義注解校驗的實現(xiàn)

    Hibernate Validation自定義注解校驗的實現(xiàn)

    這篇文章主要介紹了Hibernate Validation自定義注解校驗的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Hibernate核心類和接口的詳細介紹

    Hibernate核心類和接口的詳細介紹

    今天小編就為大家分享一篇關(guān)于Hibernate核心類和接口的詳細介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • java中重寫equals()方法的同時要重寫hashcode()方法(詳解)

    java中重寫equals()方法的同時要重寫hashcode()方法(詳解)

    下面小編就為大家?guī)硪黄猨ava中重寫equals()方法的同時要重寫hashcode()方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論