c# - 从 RSA 公钥中提取数据

标签 c# java php android cryptography

我从事的项目涉及读取用于签署 Android APK 的公钥数据。我能够成功提取签名作为公钥。当我查看由此生成的二进制公钥文件时,我看到了一些纯文本,例如名称和城市。

我如何使用 PHP(甚至 Java 或 C#)安全地提取嵌入在公钥中的名称/城市信息?并且希望以我确切知道这些字段是什么的方式进行提取是(即不是盲目抓取文本,而是知道哪个字符串是城市,哪个是名称)

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

更新:这是我的一个 APK 中的示例(base64 编码)公钥

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

最佳答案

您输入的字符串是 base 64 编码的 x509 证书,而不仅仅是公钥。

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

这是一个 C# 示例:

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
    }
}
}

关于c# - 从 RSA 公钥中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6282190/

相关文章:

php - 如何根据同一辆公交车选择路线记录

c# - Entity Framework 4 SaveChanges 内存不足

c# - 带有引用类型变量的对象类型装箱

c# - 在 C# 中将 At 命令的结果发送到 USB 调制解调器并读取结果

java - 使单例成为 Spring bean 的正确方法

javascript - 重定向用户下载,就像看不到一样

php - Symfony 表单提交不起作用

c# - SetSysTrayVisible 错误 Windows Phone 8

java - 如何在 JTable 和 JScrollPane 中拖动时用滚轮滚动

java - "read"使用 java 和 apache xml-rpc 来自 OpenERP 的具有多个 ID 的数据