前言
参考:java结合keytool实现非对称签名与验证
那一篇讲签名,这一篇将加密解密。在java安全体系中,签名属于JAAS模块,加解密属于JCE模块。
keytool的使用
keytool是JDK自带的一个密钥库管理工具。这里只用到了keytool的部分功能,包括生成密钥对,导出公钥等。keytool生成的公钥/私钥对存放到一个到了一个文件中,这个文件有密码保护,通称为keystore。
生成密钥对
$ keytool -genkey -alias signLegal -keystore examplestanstore2 -validity 1800 -keyalg RSA
生成别名为signLegal的密钥对,存放在密钥库examplestanstore2中,证书的有效期是1800天(默认是90天)。
输入一系列的参数。输入的参数遵循了LDAP的风格和标准。可以想象,生成的密钥对可以看成LDAP的一个条目。
命令执行成功后会在当前目录下创建一个叫examplestanstore2的文件。相对另一篇博文,增加了一个keyalg参数。因为keytool默认算法是DSA,而DSA只能用于签名。RSA既能用于签名,也能用于加密。而本文是研究加密问题,只能用RSA算法。
查看密钥对
$ keytool -list -keystore examplestanstore2 -v
列出了examplestanstore2密钥库的中所有密钥对。-v参数表示详细信息,详细信息中有证书的失效时间。
导出公钥证书
$ keytool -export -keystore examplestanstore2 -alias signLegal -file StanSmith.crt -rfc
导出的公钥存放在当前目录的StanSmith.crt文件中。讲“签名”的那篇博文没有加-rfc参数,导出是个二进制文件(CER格式)。
加上-rfc后,导出的是文本文件(PEM)格式。在下面的测试中,如果使用CER格式,会报错 ` No installed provider supports this key: sun.security.provider.DSAPublicKeyImpl`。
java加密和解密
参考了这篇文章。
在java程序中,首先从密钥库取出私钥和公钥,然后对测试字符串进行加密。二进制的密文转换成字符串输出到屏幕,然后解密成明文再输出到屏幕。
GenSig2.java
import java.io.*; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import javax.crypto.Cipher; import sun.security.provider.*; public class RSAEntry { public static void main(String[] args) { try { //1.从密钥库中取私钥 KeyStore ks = KeyStore.getInstance("JKS"); FileInputStream ksfis = new FileInputStream("examplestanstore2"); BufferedInputStream ksbufin = new BufferedInputStream(ksfis); // open keystore and get private key // alias is 'signLeal', kpasswd/spasswd is 'vagrant' ks.load(ksbufin, "vagrant".toCharArray()); PrivateKey prikey = (PrivateKey) ks.getKey("signLegal", "vagrant".toCharArray()); //2.根据命令行参数取公钥 FileInputStream certfis = new FileInputStream(args[0]); java.security.cert.CertificateFactory cf = java.security.cert.CertificateFactory.getInstance("X.509"); java.security.cert.Certificate cert = cf.generateCertificate(certfis); PublicKey pubKey = cert.getPublicKey(); //3.使用公钥进行加密 String data = "测试数据"; //构建加密解密类 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey);//设置为加密模式 byte[] jmdata = cipher.doFinal(data.getBytes()); //打印加密后数据 System.out.println(bytesToHexString(jmdata)); //改为解密模式进行解密 cipher.init(Cipher.DECRYPT_MODE, prikey);//会用私钥解密 jmdata = cipher.doFinal(jmdata); System.out.println(new String(jmdata)); }catch (Exception e) { e.printStackTrace(); } } //这个方法用于把二进制转换成ASCII字符串。 public static String bytesToHexString(byte[] bytes) { if (bytes == null) return "null!"; int len = bytes.length; StringBuilder ret = new StringBuilder(2 * len); for (int i = 0; i < len; ++i) { int b = 0xF & bytes[(i)] >> 4; ret.append("0123456789abcdef".charAt(b)); b = 0xF & bytes[(i)]; ret.append("0123456789abcdef".charAt(b)); } return ret.toString(); } }
编译,并运行:
$ javac RSAEntry.java $ java RSAEntry StanSmith.crt 8fceea48e34fdc786bde05459f3366714b650ff04f4e81e52eca139d8ee0b4acbcad019cd496de3589765894b2d5f4a2af38914af614d9e9b73e551ae01830cd6f49505685d7e527e3adc2b7a2a75608068627c0a12b338d3c743a5de2af2de327a0de14b548604e5c8905747aef077852ecfd2eb4a134ca0f3a56b23db8ae4beb07add5ba3725ab3ee0ffa7481494856144ba5004a329cfe2c43078f0cd95aebcbbfc6c1894efafacac90615e549cb8432c125d912a5e54ce4884f633f3e96bd7b61c1d538e38713716367f7ec6f5ca01288e6d96ad9e3d6515147369144390e1d002b1beaf5797966e3b498cc7def754816c99456ef380b3a83366a44415f6 测试数据
本文展示的算法是一种非对称算法,计算较慢。在SSL中,非对称算法用于客户端和服务器之间交换对称加密的一次性密钥。客户端将一个随机数用服务器的公钥加密发给服务器,如果服务器持有私钥,就能解开密文获得随机数(这个随机数就是对称算法的密钥)。有了对称算法密钥,双方就可以用对称加密进行安全通信了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
本文向大家介绍java结合keytool如何实现非对称签名和验证详解,包括了java结合keytool如何实现非对称签名和验证详解的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要介绍了关于java结合keytool实现非对称签名和验证的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 参考 还有姊妹篇:java结合keytool实现非对称加密和解密 keytool的
本文向大家介绍java 非对称加密算法DH实现详解,包括了java 非对称加密算法DH实现详解的使用技巧和注意事项,需要的朋友参考一下 非对称加密算法是相对于对称加密算法来说的,对于对称加密算法请查阅之前的总结,今天为大家介绍一下DH算法,DH是一种密钥交换算法,接收方根据发送方加密时的密钥,生成接收方解密密钥。下面就一起来学习一下吧: 初始化发送方密钥: 初始化接收方密钥: 构建接收方密钥: 构
本文向大家介绍java 非对称加密算法RSA实现详解,包括了java 非对称加密算法RSA实现详解的使用技巧和注意事项,需要的朋友参考一下 现在就为大家介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1、公钥加密,私钥解密;2、私钥加密,公钥解密。下面就为大家分析一下实现代码,相对于DH算法,RSA显得有些简单。 初始化密钥: 1、私钥加密,公钥解密: 2、公钥加密,私钥解密: 根据
主要内容:1.对称加密,2.非对称加密,3.混合加密,4.常见的摘要算法1.对称加密 AES,密钥长度有128/256/192。高级加密标准,是下一代的加密算法标准,速度快,安全级别高; DES:密钥为56, 数据加密标准,速度较快,适用于加密大量数据的场合。 3DES: 密钥为168.是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。 IDES: 密钥为128 SM1: 密钥为128 SM4: 密钥为128 RC4, RC5, RC6 DESX 两边用
本文向大家介绍java 对称加密算法实现详解,包括了java 对称加密算法实现详解的使用技巧和注意事项,需要的朋友参考一下 前言 对于信息的加密方式多种多样,之前为大家介绍了一种自己设计的加密方式,有兴趣的朋友可以欣赏一下,欢迎给予指点。今天为大家介绍一下对称加密方式,所谓对称加密指的是加密和解密方式呈对称格式,即解密是加密的逆过程,下面我们就看一下:DES、3DES、AES、PBE这四种方式,他
本文向大家介绍C#对称加密与非对称加密实例,包括了C#对称加密与非对称加密实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#对称加密与非对称加密的原理与实现方法,分享给大家供大家参考。具体分析如下: 一、对称加密(Symmetric Cryptography) 对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secr