2010-02-02 450 views
1

我的伙伴给我,看起来像这样的RSA公钥:转换公/私密钥字符串RSA的xmlString

 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSK+roLfbUYf6PGNIf6Ej8R5EqSTjlRABTu7T0FxR/B6iurI80jktW9+zKu4jFnFJ8oYx24raD3x5KhJZR2VCBEEbtYpPq/5E25v+LIkFbx8sNkMvEACZdAWyeQcEookGfKDER4PGrB35bntcO2SnItTZc8BOI3jAOBXTeBO16NwIDAQAB 

我知道有模数和指数中的公钥,我见过的xml RSA密钥文件;但我不知道如何从这个纯字符串中提取这些部分。

有人会知道如何完成我想要做的事吗?

回答

1

这是一个base-64编码的SubjectPublicKeyInfo(请参阅RFC 5280),用于RSA公钥。如您所述,它包含RSA模数和公开指数。

1

要完成GregS的答案,假设你使用Java作为编程语言:

  1. 你应该变换Base64编码成二进制。这里有一些Base64解码器,例如this one,似乎是“公有领域”,因此可以随意重复使用。你也可以自己实现它;这并不难。 Wikipedia具有有用的链接。
  2. 使用SubjectPublicKeyInfo ASN.1结构解码二进制斑点。这不是很容易(除非你掌握ASN.1),但现有的代码可以用于此。特别是,Java知道如何直接做到这一点。在Java中

公共密钥解密看起来是这样的(假设二进制BLOB是可变blob):

KeyFactory kf = KeyFactory.getInstance("RSA"); 
KeySpec ks = new X509EncodedKeySpec(blob); 
RSAPublicKey pk = (RSAPublicKey)kf.generatePublic(ks); 

,并从RSAPublicKey例如,你有getModulus()getPublicExponent()方法,这是不言自明。相关课程包括java.security,java.security.interfacesjava.security.spec。对于您的公钥,这产生以下结果:

modulus   = 102645155313298195029358862270152655993457886674545775623230610032728692959011417523892551564448476401788726191516935717690886291325065114613951136136194912439244754958152467056511740824446734443711392654194943771385565670988939260236433577393483222184597978937921816958725758100559250155638540637401770719799 
public exponent = 65537