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中,非对称算法用于客户端和服务器之间交换对称加密的一次性密钥。客户端将一个随机数用服务器的公钥加密发给服务器,如果服务器持有私钥,就能解开密文获得随机数(这个随机数就是对称算法的密钥)。有了对称算法密钥,双方就可以用对称加密进行安全通信了。

原文地址:http://blog.51cto.com/14158311/2350467

时间: 2024-10-06 05:57:00

Java结合keytool实现非对称加密和解密的相关文章

java结合node.js非对称加密,实现密文登录传参——让前后端分离的项目更安全

前言   在参考互联网大厂的登录.订单.提现这类对安全性操作要求较高的场景操作时发现,传输的都是密文.而为了目前项目安全,我自己负责的项目也需要这方面的技术.由于,我当前的项目是使用了前后端分离技术,即node.js做前端,spring boot做后端.于是,我开始搜索有关node.js与java实现非对称加密的资料,然而,我却没有得到一个满意的答案.因此,我有了写本篇博客的想法,并希望给用到这类技术的朋友提供帮助. 一.明文密码传输对比 首先. 构建spring boot 2.0项目 引入we

Python使用rsa模块实现非对称加密与解密

Python使用rsa模块实现非对称加密与解密 1.简单介绍: RSA加密算法是一种非对称加密算法 是由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制.加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的. RSA密钥至少为500位长,一般推荐使用1024位.RSA密钥长度随着保密级别提高,增加很快. 由于RSA的特性,一个1024位的密钥只能加密117位字节数据,当数据量超过117位字节的时候,程序就会抛出异常. --来自大佬 2.代码实现: 来一段大佬的代码

Java Web 登录采用非对称加密(RSA算法)

登录时采用md5或者base64神马的加密都是不可靠的,被抓包了还是可以模拟登录的,基本没啥用,只能说好过没有... 接下来跟大家介绍下如何采用非对称加密,非对称加密的过程其实就是和https加密原理一样,我的处理过程是这样: a. 在登录页面生成公钥和私钥,将私钥存在sesion中 b.公钥用于前端页面对数据进行加密 c.将数据传输给后台,后台从session中拿到私钥,然后对数据进行解密,把session中的私钥删除 下面简单记录下实现过程,具体的工具类RSAUtils.java的实现不在这

非对称加密、解密、验证辅助类 RSASecurityHelper

/// <summary> /// 非对称加密生成的私钥和公钥 /// </summary> /// <param name="privateKey">私钥</param> /// <param name="publicKey">公钥</param> public static void GenerateRSAKey(out string privateKey, out string publi

java代码实现对excel加密、解密(设置或去除打开密码)

使用jxcell组件来完成对excel加密.解密的功能. jxcell.jar[点击下载](此jar没有使用限制,你懂得) 具体代码如下: import java.io.IOException; import com.jxcell.CellException; import com.jxcell.View; /** * excel加密.解密 代码 * * @author lifq * @date 2015-3-13 下午02:13:24 */ public class EncryptDecryp

java 实现文件内容的加密和解密

package com.umapp.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.cr

关于rsa非对称加密、解密、签名、验签

测试数据: 1 var xmlprikey =""; 2 var xmlpubkey =""; 3 rsa = new RSACryption(); 4 //待处理字符串 5 var str="hello成功啊啊!¥%……&*([email protected]#$%^&*()@#$%^&*()_}::{>>?}{>?{?"; 6 var strlen= str.Length; 7 rsa.RSAKey(

Java对称与非对称加密解密,AES与RSA

加密技术可以分为对称与非对称两种. 对称加密,解密,即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,AES等 而非对称技术,加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等 为什么要有非对称加密,解密技术呢 假设这样一种场景A要发送一段消息给B,但是又不想以明文发送,所以就需要对消息进行加密.如果采用对称加密技术,那么加密与解密用的是同一把秘钥.除非B事先就知道A的秘钥,并且保存好.这样才可以解密A发来的消息. 由于对称技术只有一把秘钥,所以秘钥的管理是一个很麻烦的问题.而非

Java中的加密与解密

Java中的加密与解密主要对数据的安全性提供保障,分为对称和非对称的,对称表示加密密钥和解密密钥是同一个密钥,因此也常常称作私密密钥或秘密密钥,非对称密钥表示加密密钥和解密为两个不同的密钥,一个为公共密钥,另一个则为私密密钥.对称加密解密算法有DES.AES等,非对称加密解密算法有RSA.DH等.对于数据的加密与解密我们通常通过生成密钥,然后通过加密与解密操作类利用密钥对数据进行加密与解密,接下来我们看看Java中如何实现对称.非对称加密与解密. 对称加密与解密:通过KeyGenerator(密