2011-08-23 57 views
1

到Android在服务器发送公钥从红宝石

OpenSSL::PKey::RSA.generate(1024).public_key.to_s 

回报

"-----BEGIN RSA PUBLIC KEY-----\nMIGJAoGBAPHpKZe0jKkyyslkhnoQzRovzQB+6OLtACNkILk+6UKgYJ1UM7Qkpxab\noEHnpR/XHrIfFUB8dfhaIeqHGC3IASZh6vveH6ypwZTqDHrejqYcfOuKOJcCRDJf\n/qxeVy1jwt7oMbrDhCeVNd3eIYdq0joEnZ6k4KwqvG1ZIOKkE8adAgMBAAE=\n-----END RSA PUBLIC KEY-----\n" 

当我复制并粘贴此字符串作为一个Java字符串,它的工作原理。但是,我需要通过httpResponse获取此公钥。当被HttpRequest调用时,它返回:

-----BEGIN RSA PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCySmMxjxX1Xw80yRB35BQHP27V 
EhIUG9/bxsyJMs4rhmvnpP7saeBznyDMQ3I5wt7cJEPABy+QuuAGjphj6/FsfsXP 
9zLRroX02f48fQXNM7j8RtQ5y8bhcZrnb8/MNoAKnbAqkKlkuW/gRxSB0qeG5Q17 
vvSJ6KHb5heAFwaGtwIDAQAB 
-----END RSA PUBLIC KEY----- 

但是这是无效的。是什么赋予了?

+0

它看起来对我有效。 \ n正在扩大到新线 –

回答

0

这真的是一个很好的:)好吧,让我们从头开始。

  • 我检查是否我可以的Base64解码与问题字符串的内容 - >是
  • 我检查经解码的字节数组是否是一个有效的DER编码 - >是
  • 我检查是否DER编码表示RSA公钥 - >是
  • 我检查我是否可以直接解析原始的字符串作为RSA公钥 - >无

WTF?然后,我再编码的RSA公钥我能够解码为PEM - 它给了我:

-----BEGIN PUBLIC KEY----- 
... same Base64 as in your string ... 
-----END PUBLIC KEY----- 

看到区别了 - 这是PEM头。 Base64编码的结构是公共密钥的通用X.509表示(因此也是标题中的差异),而不是PKCS#1中描述的RSA特定表示,这是标题意味着的!如果您更改PEM标题,那么它将起作用!