Extraer datos de la clave pública de RSA

Estoy trabajando en un proyecto que implica leer datos de clave pública utilizados para firmar APKs de Android. Puedo extraer con éxito las firmas como llaves públicas. Cuando miro dentro de los archivos binarios del pubkey producidos por esto, veo un cierto texto llano tal como un nombre y una ciudad.

¿Cómo puedo extraer con seguridad esta información de nombre / ciudad incrustada dentro de la clave pública usando PHP (o incluso Java o C #)? Y espero hacerlo de tal manera que sé exactamente lo que estos campos son (es decir, no ciegamente agarrar el texto, pero saber qué cadena es una ciudad y que es un nombre)

Para aclaración: No tengo la clave privada o un archivo de certificado. Actualmente no estoy interesado en la firma o cifrado de nada, sólo me gustaría extraer el texto sin formato en el pubkey sin usar enfoques kludgy como regex.

Actualización: Aquí hay una clave pública de ejemplo (base64-codificada) de uno de mis APKs

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

La cadena que pones es un certificado x509 codificado en base 64, no simplemente una clave pública.

Necesitará analizar los campos de nombre distinguido para obtener la información deseada.

Aquí hay un ejemplo de 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 } } } 

Los "archivos pubkey binarios producidos por este" es un certificado X.509.

Casi cualquier plataforma tiene soporte para leer certificados X.509 y crear una estructura a partir de ellos, desde la que se puede extraer de forma fiable el "nombre del sujeto" ya menudo se amplía la información que incluye una dirección de correo electrónico o un nombre de host.

Por ejemplo, si tiene instalado OpenSSL, utilice el siguiente comando:

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

Puede extraer campos específicos con opciones adicionales. Por ejemplo, la adición de los rendimientos del objeto:

Sujeto = / C = US / ST = RI / L = Narragansett / CN = Colin O'Dell

En php, no estoy seguro, pero tal vez esta función podría ser su amigo. Hay una sección completa de funciones relacionadas con ssl que podrían resultar útiles si estás jugando con certificados.

  • Obtener imágenes de un servidor PHP a Android
  • PHP HTTP POST en el dispositivo Android mediante HttpURLConnection
  • Android: imposible cargar la imagen a MySql remoto DB con php script
  • El mismo elemento se elimina dos veces después de ejecutar la llamada de red en un bucle
  • ¿Cómo guarda de forma segura una orden en la nube, si no puede verificar el pago desde la nube?
  • Cómo utilizar la sesión para trabajar entre php webservices y android
  • Seguridad para la aplicación android para comunicarse con webservice
  • Mensaje GCM de Android enviado correctamente pero no recibido
  • StringByEvaluatingJavascriptFromString (método iOS, ¿qué es Android equivalente?)
  • Android - Mantener usuario conectado
  • Algoritmo AES difiere en PHP desde Android e iOS
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.