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

网友投稿 337 2023-04-20


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://pediy.com/kssd/pediy06/pediy6014.htm等。

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

文字在线加密解密工具(包含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

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

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:转发接口设计图片软件(接口转发功能异常)
下一篇:为什么要实现接口(为什么要设计接口)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~