Java编程实现非对称加密的方法详解
作者:迟做总比不做强 发布时间:2023-08-24 01:21:26
标签:Java,加密
本文实例讲述了Java编程实现非对称加密的方法。分享给大家供大家参考,具体如下:
对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
是一种 高级的双保险加密方式,一般的实现加密方式有DH密钥交换算法,RSA基于因子分解算法,ElGamal离散对数算法及ECC椭圆曲线加密等。
DH加密解密
/**
* 非对称加密之:DH加密
* 非对称DH,是安全性基于在有限域中计算离散对数的难度的一种加密算法。
* 可用于密钥分发,但不能用于加/解密报文。DH即Diffie-Hellman算法的简写,也缩写为D-H算法。
* D-H加密算法的核心思想就是大素数不可分解质因数的数学理论方法。
* @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 {
// 初始化发送方密钥
KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");
senderKeyPairGenerator.initialize(512);
KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair();
byte[] senderPublicKeyEnc = senderKeyPair.getPublic().getEncoded();// 发送方的公钥,发送给接受方,发送方式多种,比如文件,网络等
// 初始化接受方密钥
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();
// 密钥构建
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年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
* RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。
* 今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
* 但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。
* RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
* @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年提出的公钥密码体制和椭圆曲线加密体系。
* 既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。
* 在加密过程中,生成的密文长度是明文的两倍,且每次加密后都会在密文中生成一个随机数K,
* 在密码中主要应用离散对数问题的几个性质:求解离散对数(可能)是困难的,而其逆运算指数运算可以应用平方-乘的方法有效地计算。
* 也就是说,在适当的群G中,指数函数是单向函数。
* @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等。
希望本文所述对大家java程序设计有所帮助。
来源:http://blog.csdn.net/true100/article/details/49489137
0
投稿
猜你喜欢
- 多选和单选的不同之处单选的时候,选中一个就可以直接把结果返回,因此本身底部弹窗无需状态管理。但到多选的时候,需要知道当前选中的选项,有选项被
- HashMap和HashTable,这二者的区别经常被别人问起,今天在此总结一下。(一)继承的历史不同public class
- 本文实例为大家分享了flutter实现倒计时加载页面的具体代码,供大家参考,具体内容如下效果图实现步骤1、pubspec.yaml中添加依赖
- 您已经看到很多包含视频内容的应用程序,比如带有视频教程的食谱应用程序、电影应用程序和体育相关的应用程序。您是否想知道如何将视频内容添加到您的
- public static String toUtf8String(String s) {
- 1、说明isInterrupted()可以判断当前线程是否被中断,仅仅是对interrupt()标识的一个判断,并不会影响标识发生任何改变(
- 在开发Android应用程序中,经常会自定义View来实现各种各样炫酷的效果,在实现这吊炸天效果的同时,我们往往会定义很多attr属性,这样
- 在Linux中创建一个新进程的唯一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,
- 效果图如下所示: 1、在Adapter中加入如下代码<pre style="background-color:#2
- 微服务治理Spring Cloud 工具套件为微服务治理提供了全面的技术支持。这些治理工具主要包括服务的注册与发现、负载均衡管理、动态路由、
- 1 简介Solace是一个强大的实时性的事件驱动消息队列。本文将介绍如何在Spring中使用,虽然代码使用的是Spring Boot,但并没
- FrameLayout 在这个布局中,所有的子元素都不能被指定放置的位置,他们统统防御这块区域的左上角, 并且后面的子元素直接覆盖在前面的子
- 引言设计: 嗯? 这个图片点击跳转进详情再返回图片怎么变白闪一下呢?产品: 是啊是啊! 一定是个bug开发: 囧囧囧在开发过程中, 也许你也
- 简介Android给我们提供了一种轻量级的异步任务类AsyncTask。该类中实现异步操作,并提供接口反馈当前异步执行结果及进度,这些接口中
- 背景:在Android中按照数据保存的方式,可以分为如下几种Content Provider (用的SQLite实现),SQLite,Sha
- 我们都知道,当RecyclerView数据源更新后,还需要通过adapter调用对应的方法,从而让RecyclerView重新绘制页面本次也
- 1.map遍历快速实现边距,文字自适应改变大小Container( // padding: EdgeI
- 你知道String、StringBuilder、Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗?别急,这篇文章
- 右击有main方法的类===> Run as===> Run Configurations ===>双击java
- 如果想实现一个在桌面显示的悬浮窗,用Dialog、PopupWindow、Toast等已经不能实现了,他们基本都是在Activity之上显示