我有rsa公钥证书。我可以使用扩展名为.pem的文件,也可以将其用作具有以下格式的字符串:
-----开始rsa公钥-----
{键}
-----结束rsa公钥-----
我试图使用这个密钥来向服务器发送加密的json。我从其他相关的堆栈溢出问题中尝试了许多解决方案,但没有一个答案不适合我。这个答案似乎有道理https://stackoverflow.com/a/43534042,但有些东西不能正常工作,可能是因为x509encodedkeyspec期望的是der编码的数据,而不是其中一条注解中的pem。但是在这种情况下,我应该用什么来处理pem编码的数据呢?
2条答案
按热度按时间s3fp2yjn1#
michael fehr的答案展示了如何在没有第三方库的情况下加载pkcs#1格式的公钥。如果后者是一个要求,那么这就是你必须走的路。
否则,如果您使用bouncycastle,可能还会考虑一些不太详细的解决方案,因此值得一提(尽管给出的答案已经被接受):
下面的方法需要pkcs#1格式的公钥,经过pem编码并将其加载到
java.security.PublicKey
示例:另一个类似的紧凑实现可以在这里找到。
要在android中使用bouncycastle,必须在build.gradle文件的dependencies部分中引用与使用的api级别相对应的对bouncycastle的依赖关系。我使用了api级别28(pie)并引用了以下依赖项(假设android studio):
ppcbkaq52#
正如@topaco所评论的,您的rsa公钥采用pem编码,但采用pkcs#1格式,而不是java“开箱即用”可读的pkcs#8格式。
下面的解决方案是由@maarten bodewes提供的(https://stackoverflow.com/a/54246646/8166854)将执行读取并将其转换为(java)可用的rsapublickey的任务。
解决方案是在我的openjdk11上运行的,如果您使用的是“android java”,您可能需要更改base64调用。没有必要像bouncy castle这样的外部库。请遵守马丁关于钥匙长度的说明。
简单输出:
代码: