添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在与外部通信时,经常需要进行加解密、加签验签,加解密保证保密性,加签验签防篡改和抗否认。目前用的最多的加解密技术是非对称加密,即发送端公钥加密-接收端私钥解密;而加签验签则使用发送端私钥签名,接受端公钥验签。这些都依赖密钥,在真正的通信之前通常需要交换密钥,交换的是密钥文件,公钥文件常见的有 .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密钥对,然后获取公钥和私钥。接着,使用公钥进行加密,私钥进行解密,最后输出原始数据、加密后的数据和解密后的数据。 需要注意的是,在实际应用中,公钥通常是公开的,而私钥应该严格保密,不应该被泄露。