openssl 使用
生成私钥
采用 openssl 生成私钥,私钥安全密钥长度:2048
shell
openssl genrsa -out private_key.pem 1024
根据私钥,生成公钥
shell
openssl rsa -in private_key.pem -pubout -out public_key.pem
转为Java采用的pkcs8格式私钥
shell
openssl pkcs8 -topk8 -inform PEM -in private_key.pem -outform PEM -nocrypt -out private_key_pkcs8.pem
Java 使用代码
读取私钥
java
byte[] pArray1 = IOUtils.toString(new FileInputStream("private_key_pkcs8.pem"), StandardCharsets.UTF_8)
.replaceAll(KeyFinder.privateKeyHead, "")
.replaceAll(KeyFinder.privateKeyTail, "").getBytes();
byte[] privateKey = new Base64().decode(pArray1);
//取得私钥
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
//生成私钥
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
//数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
读取公钥
java
//公钥
byte[] pArray = IOUtils.toString(new FileInputStream("public_key.pem"), StandardCharsets.UTF_8)
.replaceAll(KeyFinder.publicKeyHead, "")
.replaceAll(KeyFinder.publicKeyTail, "").getBytes();
byte[] publicKey = new Base64().decode(pArray);
//实例化密钥工厂
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
//初始化公钥
//密钥材料转换
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
//产生公钥
PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
//数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
return cipher.doFinal(data);
PKCS 知识
The Public-Key Cryptography Standards (PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。
PKCS已经公布了以下标准:
- PKCS#1:定义RSA公开密钥算法加密和签名机制,主要用于组织PKCS#7中所描述的数字签名和数字信封[22]。
- PKCS#3:定义Diffie-Hellman密钥交换协议[23]。
- PKCS#5:描述一种利用从口令派生出来的安全密钥加密字符串的方法。使用MD2或MD5 从口令中派生密钥,并采用DES-CBC模式加密。主要用于加密从一个计算机传送到另一个计算机的私人密钥,不能用于加密消息[24]。
- PKCS#6:描述了公钥证书的标准语法,主要描述X.509证书的扩展格式[25]。
- PKCS#7:定义一种通用的消息语法,包括数字签名和加密等用于增强的加密机制,PKCS#7与PEM兼容,所以不需其他密码操作,就可以将加密的消息转换成PEM消息[26]。
- PKCS#8:描述私有密钥信息格式,该信息包括公开密钥算法的私有密钥以及可选的属性集等[27]。
- PKCS#9:定义一些用于PKCS#6证书扩展、PKCS#7数字签名和PKCS#8私钥加密信息的属性类型[28]。
- PKCS#10:描述证书请求语法[29]。
- PKCS#11:称为Cyptoki,定义了一套独立于技术的程序设计接口,用于智能卡和PCMCIA卡之类的加密设备[30]。
- PKCS#12:描述个人信息交换语法标准。描述了将用户公钥、私钥、证书和其他相关信息打包的语法[31]。
- PKCS#13:椭圆曲线密码体制标准[32]。
- PKCS#14:伪随机数生成标准。
- PKCS#15:密码令牌信息格式标准[33]。