Извлечение данных из открытого ключа RSA

#c# #java #php #android #cryptography

#c# #java #php #Android #криптография

Вопрос:

Я работаю над проектом, который включает в себя чтение данных открытого ключа, используемых для подписи APK-файлов Android. Я могу успешно извлечь подписи в виде открытых ключей. Когда я заглядываю внутрь двоичных файлов pubkey, созданных этим, я вижу некоторый обычный текст, такой как имя и город.

Как я могу безопасно извлечь это имя / информацию о городе, встроенную в открытый ключ, используя PHP (или даже Java или C #)? И, надеюсь, сделайте это таким образом, чтобы я точно знал, что представляют собой эти поля (т. Е. не хватал текст вслепую, а знал, какая строка является городом, а какая — названием)

Для пояснения: у меня нет закрытого ключа или файла сертификата. В настоящее время я не заинтересован в подписывании или шифровании чего-либо, я просто хотел бы извлечь открытый текст внутри pubkey без использования сложных подходов, таких как regex.

Обновление: Вот образец (в кодировке base64) открытого ключа из одного из моих APK

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

Комментарии:

1. Можете ли вы опубликовать пример «двоичных файлов pubkey, созданных этим»? Используйте кодировку Base-64, чтобы преобразовать ее в текст с возможностью публикации.

2. @FlyingStreudel — Регулярное выражение, безусловно, может быть полезным во многих сценариях, но я не думаю, что оно подходит для этой задачи: P

3. @erickson — Сообщение было обновлено. Я использовал этот сайт, чтобы преобразовать это в двоичный файл: motobit.com/util/base64-decoder-encoder.asp

4. Вы на 100% уверены, что хотите сказать, что данные имени / города «встроены в открытый ключ»? Держу пари, что на самом деле вам нужен сертификат X509, который содержит как ключ, так и метаданные.

5. Колин, для меня это выглядит как полный сертификат x509. Вставьте базовую строку 64 в: redkestrel.co.uk/cgi/decodeCert.cgi

Ответ №1:

Введенная вами строка представляет собой сертификат x509 в кодировке base 64, а не просто открытый ключ.

Вам нужно проанализировать поля с различающимися именами, чтобы получить желаемую информацию.

Вот пример 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
    }
}
}
  

Комментарии:

1. Это идеально 🙂 После того, как мне сообщили, что у меня фактически есть сертификат, я придумал аналогичное PHP-решение для сброса данных с помощью $dataAsArray = openssl_x509_parse(openssl_x509_read($pemFormattedCertString));

Ответ №2:

«Двоичные файлы открытого ключа, созданные этим», являются сертификатом X.509.

Практически любая платформа поддерживает чтение сертификатов X.509 и создание из них структуры, из которой вы можете надежно извлечь «имя субъекта» и часто расширенную информацию, включающую адрес электронной почты или имя хоста.

Например, если у вас установлен OpenSSL, используйте следующую команду:

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

Вы можете извлекать определенные поля с дополнительными опциями. Например, добавление -subject дает:

subject = /C = US/ST = RI/L = Наррагансетт / CN = Колин О’Делл

Ответ №3:

В php я не уверен, но, возможно, эта функция могла бы стать вашим другом. Существует целый раздел функций, связанных с ssl, которые могут пригодиться, если вы играете с сертификатами.

Комментарии:

1. Возможно, но у меня есть только открытый ключ, а не полный сертификат. Я просмотрел этот список функций ранее, но не смог найти ничего, что конкретно требовало бы моего внимания. Возможно, я что-то пропустил?