在与外部通信时,经常需要进行加解密、加签验签,加解密保证保密性,加签验签防篡改和抗否认。目前用的最多的加解密技术是非对称加密,即发送端公钥加密-接收端私钥解密;而加签验签则使用发送端私钥签名,接受端公钥验签。这些都依赖密钥,在真正的通信之前通常需要交换密钥,交换的是密钥文件,公钥文件常见的有
.cer
文件、
.pem
文件;私钥文件常见的有jks密钥库、pfx密钥库,
der、pem
文件,读取这些文件并转换成Java的公钥PublicKey、私钥PrivateKey对象的方式有所区别,下面介绍下各种文件的解析方式。
2.私钥解析
格式
|
内容
|
der
|
PKCS#8 二进制流 或者Base64编码
|
pem
|
-----BEGIN PRIVATE KEY-----
...Base64(der)...
-----END PRIVATE KEY-----
|
2.1 der格式
der私钥文件通常是二进制形式或者其Base64编码(base64编码后比较常见),存储的是PKCS8EncodedKeySpec PKCS#8规范编码后的二进制流。虽然下样例中pri.pem文件名是pem,但是打开来看是der格式的,解析方式见代码
输入文件
@Test
public void pksSpec() throws Exception{
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); //BC实现
// der 文件解析 到PrivateKey 对象
File file = new File("/Users/wangying49/certs/javaTest/pri.pem");
byte[] key2 = FileUtils.readFileToByteArray(file);
System.out.println("length: " + key2.length);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(key2));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
System.out.println(privateKey.hashCode());
System.out.println(privateKey);
// 转换成der base64编码 与原pri.pem对比是没有换行
File wfile = new File("/Users/wangying49/certs/javaTest/newpri.pem");
FileUtils.writeByteArrayToFile(wfile, Base64.encodeBase64(privateKey.getEncoded()));
2.1 pem格式
pem文件通常是包含了-----BEGIN PRIVATE KEY-----分割头和-----END PRIVATE KEY-----尾的
* INPUT: pem格式 私钥文件
* OUTPUT: PrivateKey
* @throws Exception
@Test
public void testPermPri() throws Exception {
FileInputStream pemfin = new FileInputStream("/Users/wangying49/certs/javaTest/priPem.key");
// pem 格式JCE没有对PEM直接支持的方式,但是可以通过第三方包例如bouncycastle解析
Security.addProvider(new BouncyCastleProvider());
PEMReader reader = new PEMReader(new InputStreamReader(pemfin), new PasswordFinder() {
@Override
public char[] getPassword() {
return "".toCharArray();
PrivateKey privateKey =(PrivateKey)reader.readObject();
reader.close();
System.out.println(privateKey.hashCode());
也可以把头尾去掉,用上一种方法解析也行。
1.前言在与外部通信时,经常需要进行加解密、加签验签,加解密保证保密性,加签验签防篡改和抗否认。目前用的最多的加解密技术是非对称加密,即发送端公钥加密-接收端私钥解密;而加签验签则使用发送端私钥签名,接受端公钥验签。这些都依赖密钥,在真正的通信之前通常需要交换密钥,交换的是密钥文件,公钥文件常见的有.cer文件、.pem文件;私钥文件常见的有jks密钥库、pfx密钥库,der、pem文件,读取...
众所周知,证书请求
文件CSR与
私钥文件Private Key是成对出现的,只能一次性生成,即使填写完全一致的信息,再次生成的证书请求CSR
文件、
私钥Private Key与首次生成的CSR
文件、Private Key
文件也不能混用。
注意: 必须使用与
私钥文件Private Key一起生成的CSR
文件申请SSL证书,否则签发的SSL证书与你的
私钥Private Key不匹配,会导致SSL证书无法部署到服务器上,影响您的使用!
打开在线CSR生成工具,填写相对应的资料,然后点击生成CSR即可。
http://blog.sina.com.cn/s/blog_4fcd1ea30100yh4s.html
在PKCS#1 RSA算法标准中定义RSA私钥语法为:
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent...
PKCS#8格式使用的是ASN.1结构,首先我们对一个没有执行加密的PKCS#8格式
私钥文件进行一下
解析,方便我们下面分析其结构。
命令:openssl asn1parse -i -in privatekey.
pem
结果如下:
[html] view plaincopy
0:d=0 hl=4 l=1213 cons: SEQUENCE
4:d=1 hl=2 l= 1 prim: INTEGER ...
RSAPrivateKey::=SEQUENCE{
versionVersion, -- 当前的RSA版本,一般是 0x00
modulusINTEGER, --n 是 RSA合数模 n
publicExponentINTEGER, --e 是 RSA的公开...
Openssl提供了强大证书功能,生成密钥对、证书,颁发证书、生成crl、验证证书、销毁证书等。本文将j介绍如何利用openssl的命令分析RSA私钥文件格式,同时也将简单介绍几种常见的私钥文件格式。
1 生成私钥文件
openssl有多种方法生成私钥:
genrsa生成RSA密钥。req在生成req证书请求时同时产生密钥。genpkey除了可以生成RSA密钥外,还可以生成DS
https://blog.csdn.net/ryf1099030083/article/details/84857344,文章链接
3082025c # 标签头
020100 # 整型 长度 为 0 (0x00),内容:version
028181 # 整型 长度 为 129 字节 (0x81)内容:模数 n (modulus)
00e7b0dd45eba985ea1eb2fd7a7237e654ff0e40c9e5818d9348aa2df7fc04e7e2a...
Abstract Syntax Notation One,抽象语法标记
ASN.1是一种 ISO/ITU-T 标准,用于描述对数据进行表示、编码、传输和解码。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何实现这些数据的具体方式,也不用去管到底是什么样的应用程序。ASN.1是一种标记语言,用于描述数据结构,但不对数据结构进行实现。
二、PKCS
The Public-Key Cryptography Standards,公钥密码学标准
是由美国RSA数据安全公司及其合作伙伴
公钥加密私钥解密是一种非对称加密算法,常用于保护数据的安全性。在Java中,可以使用Java Cryptography Extension(JCE)提供的API实现公钥加密私钥解密。
下面是一个简单的示例代码:
```java
import java.security.*;
import javax.crypto.*;
import java.util.*;
public class RSAExample {
public static void main(String[] args) throws Exception {
// 生成RSA密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 获取公钥和私钥
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 使用公钥加密数据
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedData = cipher.doFinal("Hello World!".getBytes());
// 使用私钥解密数据
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(encryptedData);
// 输出结果
System.out.println("原始数据:" + "Hello World!");
System.out.println("加密后数据:" + Base64.getEncoder().encodeToString(encryptedData));
System.out.println("解密后数据:" + new String(decryptedData));
在上述代码中,首先使用`KeyPairGenerator`生成2048位的RSA密钥对,然后获取公钥和私钥。接着,使用公钥进行加密,私钥进行解密,最后输出原始数据、加密后的数据和解密后的数据。
需要注意的是,在实际应用中,公钥通常是公开的,而私钥应该严格保密,不应该被泄露。