use*_*425 7 java encryption public-key-encryption
我在文本文件中有证书,其内容如下:
-----BEGIN PUBLIC KEY-----
xxxx
xxxx
xxxx
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
我相信这是一个pem编码证书?所以我想现在加载它,我正在尝试以下方法:
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(
readFileToByteArray("keyfile"));
Run Code Online (Sandbox Code Playgroud)
但我得到一个InvalidKeySpecException.
如果我加载文件,切断开始/结束页眉/页脚,然后base64解码'xxxx'内容,我不会得到任何投诉:
String contents = readFileToString("keyfile");
contents = contents.replace("-----BEGIN PUBLIC KEY-----", "");
contents = contents.replace("-----END PUBLIC KEY-----", "");
byte[] prepared = Base64.decode(contents);
// ok.
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(prepared);
Run Code Online (Sandbox Code Playgroud)
这是加载密钥文件的正确方法吗?我看到还有一个RSAPublicKeySpec类,根据名称,它似乎是我在这里感兴趣的东西.但我相信这只是为了生成证书,而不是阅读现有证书?
谢谢
还有就是公共密钥格式一个很好的总结在这里.如X509EncodedKeySpec的javadoc所示,此类用于在X.509标准中的SubjectPublicKeyInfo ASN.1结构和Java公钥格式之间进行转换.并且因为第一个链接指示了表单的文件
-----开始公钥-----
xxxx
xxxx
-----结束公钥-----
确实是一个SubjectPublicKeyInfo,你正在解析文件.您缺少最后一步,那就是将X509EncodedKeySpec转换为公钥.这是KeyFactory类的功能.要将你的例子扩展两行,那就是
KeyFactory kf = KeyFactory.getInstance("RSA"); // Assuming this is an RSA key
RSAPublicKey rsaPubKey = (RSAPublicKey) kf.generatePublic(publicKeySpec);
Run Code Online (Sandbox Code Playgroud)