【发布时间】:2019-05-24 06:14:30
【问题描述】:
用例: 我有一个用例,其中客户端生成私钥和公钥,将 base 64 编码的公钥发送到服务器。
在服务器端,我将使用此公钥加密消息并将加密消息发送给客户端,客户端使用其私钥对其进行解密。约定的算法是“RSA”。
问题出在服务器端,我看到某些密钥正在使用 X509EncodedKeySpec 作为密钥规范
byte[] publicBytes = Base64.decodeBase64(base64EncodedPubKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);
虽然有些键使用 X509EncodedKeySpec 会引发异常 (Caused by: java.security.InvalidKeyException: IOException: algid parse error, not a sequence),但使用 RSAPublicKeySpec 可以工作:
byte[] publicBytes = Base64.decodeBase64(base64EncodedPubKey);
org.bouncycastle.asn1.pkcs.RSAPublicKey.RSAPublicKey pkcs1PublicKey = org.bouncycastle.asn1.pkcs.RSAPublicKey.RSAPublicKey.getInstance(publicBytes);
BigInteger modulus = pkcs1PublicKey.getModulus();
BigInteger publicExponent = pkcs1PublicKey.getPublicExponent();
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);
所以,我的理解是客户端和服务器需要同意是否使用:
PKCS #1 或 X.509 用于对密钥进行编码。 我的问题是哪一种更适合我的用例? 有什么指导方针何时使用哪种格式?
【问题讨论】:
-
RSAPublicKey,一个接口,没有静态的getInstance方法。也没有办法意外地随机产生一种编码或另一种编码。 -
使用 org.bouncycastle.asn1.pkcs.RSAPublicKey .. 编辑问题
-
同样,也没有办法意外地随机产生一种编码或另一种编码。您必须使用与密钥编码方式兼容的方法。
-
我的问题的最后一行是实际问题,使用 PKCS #1 还是 X.509 编码更好,有什么好处和坏处,什么时候使用哪个指南?
-
我认为 X.509 比 PKCS#1 更广泛的规范(超集)。如您的示例所示, RSAPublicKey 接口需要模数和指数。从 X.509 证书中提取这些信息并不容易。
标签: java public-key-encryption public-key