本文实例讲述了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等):
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程序设计有所帮助。
本文向大家介绍java 非对称加密算法DH实现详解,包括了java 非对称加密算法DH实现详解的使用技巧和注意事项,需要的朋友参考一下 非对称加密算法是相对于对称加密算法来说的,对于对称加密算法请查阅之前的总结,今天为大家介绍一下DH算法,DH是一种密钥交换算法,接收方根据发送方加密时的密钥,生成接收方解密密钥。下面就一起来学习一下吧: 初始化发送方密钥: 初始化接收方密钥: 构建接收方密钥: 构
本文向大家介绍java 非对称加密算法RSA实现详解,包括了java 非对称加密算法RSA实现详解的使用技巧和注意事项,需要的朋友参考一下 现在就为大家介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1、公钥加密,私钥解密;2、私钥加密,公钥解密。下面就为大家分析一下实现代码,相对于DH算法,RSA显得有些简单。 初始化密钥: 1、私钥加密,公钥解密: 2、公钥加密,私钥解密: 根据
本文向大家介绍java 对称加密算法实现详解,包括了java 对称加密算法实现详解的使用技巧和注意事项,需要的朋友参考一下 前言 对于信息的加密方式多种多样,之前为大家介绍了一种自己设计的加密方式,有兴趣的朋友可以欣赏一下,欢迎给予指点。今天为大家介绍一下对称加密方式,所谓对称加密指的是加密和解密方式呈对称格式,即解密是加密的逆过程,下面我们就看一下:DES、3DES、AES、PBE这四种方式,他
本文向大家介绍java 中DH的方式实现非对称加密的实例,包括了java 中DH的方式实现非对称加密的实例的使用技巧和注意事项,需要的朋友参考一下 java 中DH的方式实现非对称加密的实例 实现代码: 附上结果: 以上就是DH实现非对称加密的实例,如有 疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍java 中RSA的方式实现非对称加密的实例,包括了java 中RSA的方式实现非对称加密的实例的使用技巧和注意事项,需要的朋友参考一下 java 中RSA的方式实现非对称加密的实例 RSA通俗理解: 你只要去想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签
本文向大家介绍java结合keytool如何实现非对称加密与解密详解,包括了java结合keytool如何实现非对称加密与解密详解的使用技巧和注意事项,需要的朋友参考一下 前言 参考:java结合keytool实现非对称签名与验证 那一篇讲签名,这一篇将加密解密。在java安全体系中,签名属于JAAS模块,加解密属于JCE模块。 keytool的使用 keytool是JDK自带的一个密钥库管理工具