欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java编程实现非对称加密的方法详解

程序员文章站 2024-02-22 08:42:04
本文实例讲述了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等。

ps:关于加密解密感兴趣的朋友还可以参考本站在线工具:

文字在线加密解密工具(包含aes、des、rc4等):

md5在线加密工具:
http://tools.jb51.net/password/createmd5password

在线散列/哈希算法加密工具:

在线md5/hash/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160加密工具:

在线sha1/sha224/sha256/sha384/sha512加密工具:

更多关于java相关内容感兴趣的读者可查看本站专题:《java数学运算技巧总结》、《java数据结构与算法教程》、《java字符与字符串操作技巧总结》、《java日期与时间操作技巧汇总》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。