2011-06-08 45 views
6

我正在研究涉及读取用于签署Android APK的公共密钥数据的项目。我能够成功地将签名提取为公钥。当我查看由此产生的二进制pubkey文件时,我会看到一些纯文本,如名称和城市。从RSA公钥提取数据

如何安全地提取使用PHP(甚至Java或C#)公钥内嵌入的名称/城市信息?希望这样做,我确切地知道这些字段是什么(即不是盲目地抓文本,但知道哪个字符串是一个城市,哪个是一个名称)

澄清:我没有私钥或证书文件。我目前对签名或加密任何东西都不感兴趣,我只想提取公钥内的明文而不使用像正则表达式这样的方法。

更新:下面是一个示例(base64编码),公钥从我的APK

MIICBzCCAXCgAwIBAgIES6KlazANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQGEwJVUzELMAkGA1UECBMCUkkxFTATBgNVBAcTDE5hcnJhZ2Fuc2V0dDEVMBMGA1UEAxMMQ29saW4gTydEZWxsMB4XDTEwMDMxODIyMTI1OVoXDTQ1MDMwOTIyMTI1OVowSDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlJJMRUwEwYDVQQHEwxOYXJyYWdhbnNldHQxFTATBgNVBAMTDENvbGluIE8nRGVsbDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAmPetcBW+ITURXY0LsI2ZfgM3R7K2kwicgpd0W+BYAXQBh76SXyN9MYvtfnUY3SNz37FW/lDQgAO3pbhEFqGwfADh2ctXlYmlE9DtcRQw0ojGVPIDlWBX+9IUxyL/89CPaN84R/1lvdosco4V0BqQYR300S9ZwmwFA2Vh9hSUZmsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBezKu4G11Z68NTPIBro8xsnbkdYxObzW7BsSr6t9MS5x6EQVs75R/nnKrsMcQ+9ImdT940jhQgZT3ZrYla5VhdbelxnLhBVbJfBdipV3Hv2bG7MnXzFqHYwQqYp+UrP8zWm1YHQf5I/P9VBjlkgwFyNKr0TxP4t/qS08oGX2wvZg== 
+0

正则表达式是缺憾? ( – FlyingStreudel 2011-06-08 16:40:23

+0

)你可以发布一个“由此生成的二进制pubkey文件”的例子吗?使用Base-64编码将它转换为可发布的文本 – erickson 2011-06-08 16:42:08

+0

@FlyingStreudel - 正则表达式在许多场景中肯定有用,但我不'我认为这适合于这个任务:P – 2011-06-08 16:42:27

回答

3

您输入的字符串是基本64位编码x509证书,而不仅仅是一个公钥。

您需要分析专有名称字段以获取所需的信息。

这里的一个C#例如:是X.509证书

using System; 
using System.Security.Cryptography.X509Certificates; 

namespace Sample 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     string base64EncodedX509 = 
      "MIICBzCCAXCgAwIBAgIES6KlazANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQGEwJVUzELMAkGA1UECBMCUkkxFTATBgNVBAcTDE5hcnJhZ2Fuc2V0dDEVMBMGA1UEAxMMQ29saW4gTydEZWxsMB4XDTEwMDMxODIyMTI1OVoXDTQ1MDMwOTIyMTI1OVowSDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlJJMRUwEwYDVQQHEwxOYXJyYWdhbnNldHQxFTATBgNVBAMTDENvbGluIE8nRGVsbDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAmPetcBW+ITURXY0LsI2ZfgM3R7K2kwicgpd0W+BYAXQBh76SXyN9MYvtfnUY3SNz37FW/lDQgAO3pbhEFqGwfADh2ctXlYmlE9DtcRQw0ojGVPIDlWBX+9IUxyL/89CPaN84R/1lvdosco4V0BqQYR300S9ZwmwFA2Vh9hSUZmsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBezKu4G11Z68NTPIBro8xsnbkdYxObzW7BsSr6t9MS5x6EQVs75R/nnKrsMcQ+9ImdT940jhQgZT3ZrYla5VhdbelxnLhBVbJfBdipV3Hv2bG7MnXzFqHYwQqYp+UrP8zWm1YHQf5I/P9VBjlkgwFyNKr0TxP4t/qS08oGX2wvZg=="; 
     var rawBytes = Convert.FromBase64String(base64EncodedX509); 

     X509Certificate cert = new X509Certificate(rawBytes); 

     // Parse the distinguished name to get your desired fields 

     Console.WriteLine(cert.Subject); // writes CN=Colin O'Dell, L=Narragansett, S=RI, C=US 
     Console.WriteLine(cert.Issuer); // writes CN=Colin O'Dell, L=Narragansett, S=RI, C=US 
    } 
} 
} 
+0

这是完美的:)被告知我infact有一个证书,我想出了一个类似的PHP解决方案来转储数据使用'$ dataAsArray = openssl_x509_parse(openssl_x509_read($ pemFormattedCertString));'' – 2011-06-08 17:08:09

0

在PHP中的一个,我不知道,但也许this function可能是你的朋友。有一个相关功能的whole section,可以派上用场,如果你正在玩证书。

+0

也许,但我只有公钥而不是完整的证书。我早些时候浏览了该函数列表,但无法找到任何明确想要的东西。也许我错过了什么? – 2011-06-08 16:46:48

1

的 “由此产生的二进制文件PUBKEY”。

几乎任何平台都支持读取X.509证书,并从中创建一个结构,从中可以可靠地提取“主题名称”,并且通常包含电子邮件地址或主机名的扩展信息。

例如,如果你有安装了OpenSSL,请使用以下命令:

openssl x509 -text -noout -inform der -in <yourfilehere> 

您可以提取带有附加选项的具体领域。例如,添加-subject收率:

受试者=/C = US/ST = RI/L =塞特/ CN =科林奥德尔