java 密钥工具 非对称加密和解密
本文参考
什么是keytool?
keytool是JDK自带的一个密钥库管理工具。这里只用到了keytool的部分功能,包括生成密钥对,导出公钥等。keytool生成的公钥/私钥对存放到一个到了一个文件中,这个文件有密码保护,通称为keystore。
生成密钥对
$ keytool -genkeypair \
-alias config-server \
-keystore config-server.keystore \
-validity 1800 \
-keyalg RSA \
-dname "CN=yxx, OU=company, O=org, L=city, ST=province, C=china" \
-keypass 222222 \
-storepass 111111
上面是创建密钥对的命令,具体参数如下:
*alias 别名
*keystore 密钥库名称
*validity 有效时间
*keyalg 密钥对方式
*dname 基本信息
*keypass 密钥口令
*storepass 密钥库口令
执行上面的命令,会有一个提示,如下:
JKS 密钥库使用专用格式。
建议使用 "keytool -importkeystore -srckeystore config-server.keystore
-destkeystore config-server.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
可以根据自己的情况看是否需要转P12。
查看密钥对
$ keytool -list -keystore examplestanstore -v
列出了config-server.keystore密钥库的中所有密钥对。-v参数表示详细信息,详细信息中有证书的失效时间。
导出公钥证书
$ keytool -export -keystore config-server.keystore \
-alias config-server -file config-server.cer
导出的公钥存放在当前目录的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中,非对称算法用于客户端和服务器之间交换对称加密的一次性密钥。客户端将一个随机数用服务器的公钥加密发给服务器,如果服务器持有私钥,就能解开密文获得随机数(这个随机数就是对称算法的密钥)。有了对称算法密钥,双方就可以用对称加密进行安全通信了。
学习交流,请加群:64691032
下一篇: 数学分析复习:洛皮达定律、泰勒公式
推荐阅读
-
[1075] OpenSSL 和 Python 实现 RSA 密钥公开密钥加密私钥解密
-
RSA 加密、解密和签名的 java 实现
-
在 Java 中使用 OpenSSL 生成用于数据加密和解密的公钥和私钥
-
java 密钥工具 非对称加密和解密
-
php md5 加密解密算法和工具(含代码)
-
基于 NFC 的无线电池管理 BMS - ● 主动读取内部传感器:利用 NFC 技术,BMS 能够主动读取内部传感器的数据 [... 考虑车辆外使用案例中的空闲状态场景:NFC 技术可用于处理闲置状态下的电池组读取,例如在第二次生命转移期间进行存储。 主动诊断读取:在邻近系统中部署了 BMS 的情况下,使用 NFC 技术进行主动诊断读取。 (ii) 系统结构 系统架构如图所示,在建立安全通道之前,需要对设备进行身份验证。数据链路通信层由 NDEF 记录处理,而数据存储可以是离线的,也可以是数据库中的在线存储。活动和空闲状态的诊断读数取决于设备和数据方向,需要与外部 NFC 阅读器进行通信。软件架构分为三层,包括硬件抽象层(HAL)、中间层(中间件)和应用层。HAL 处理硬件驱动组件,中间件执行设备验证,而应用层则由开发人员根据安全漏洞和格式扩展*定义。 为确保安全,系统采用了一个安全模型,为 BMS 和主动诊断读取情况格式化应用数据。安全考虑因素包括设备相互验证、使用安全通道(加密和防篡改)以及确保电池组内读数的安全。 考虑到不同的 BMS 拓扑,包括集中式、调制式、分布式和分散式,系统需要满足设备相互验证和使用安全通道的要求。对于每种拓扑结构,都必须考虑将性能开销降至最低。电池是封闭的,对其进行物理攻击不可行或成本太高。外部攻击可能也很困难。基于对称或非对称加密技术的自动验证可用于保护电池组读数。安全协议在验证阶段和会话密钥确认阶段采用双密钥加密,以抵御攻击。中间件在数据格式验证、确认和处理中发挥关键作用,确保数据传输安全。 (iii) 唤醒模型设计
-
在线的区块链加密工具(基于非对称加密和哈希技术)
-
搞懂2018年10月11日的加密技术:对称加密、非对称加密与Hash算法,从此轻松应对加解密和散列函数那些事儿
-
使用Java进行数据加密和解密:EncryptUtil、MD5和SHA-1的应用