2016-10-25 4 views
0

Mit der OpenSSL-Bibliothek habe ich eine digitale Signatur einer Datei erstellt.Wie konvertiert man OpenSSL digitale Signatur in ASN1?

ich sehen kann, dass, wenn ich den Befehl openssl verwenden:

openssl rsautl -verify -inkey pubkey.pem -pubin -asn1parse -in sigfile 

ich eine schöne Ausgabe von so etwas wie bekommen:

0:d=0 hl=2 l= 49 cons: SEQUENCE   
2:d=1 hl=2 l= 13 cons: SEQUENCE   
4:d=2 hl=2 l= 9 prim: OBJECT   :sha256 
15:d=2 hl=2 l= 0 prim: NULL    
17:d=1 hl=2 l= 32 prim: OCTET STRING  
    0000 - c9 8c 24 b6 77 ef f4 48-60 af ea 6f 49 3b ba ec ..$.w..H`..oI;.. 
    0010 - 5b b1 c4 cb b2 09 c6 fc-2b bb 47 f6 6f f2 ad 31 [.......+.G.o..1 

Wie kann ich meine Unterschrift konvertieren programmatisch Datei in eine ASN1, dass Ich kann dann analysieren?

+0

Der Ausgang Sie ist ein * nicht * ASN.1, ist es eine String-Darstellung von ASN.1 kodierten zur Einsicht und Debuggen entworfen. Also, was fragst du wirklich? –

+0

Ich bin mir bewusst, die Ausgabe ist nicht asn.1, ich bin mir auch bewusst, dass die Signatur auch nicht ist. Meine Frage ist, wie openssl von der Signatur zu einigen asn.1 gegangen ist, dass sie dann diese hübsche Zeichenkettenrepräsentation parsen und anzeigen konnten ... – james

+0

Die Ausgabe von openssl ist eine ASN.1 Reihenfolge, die die zurückgewonnenen Daten der RSA Unterschrift enthält: Digest-Algorithmus und der entschlüsselte Digest (der ursprüngliche Digest Ihres Inhalts) – pedrofb

Antwort

0

OpenSSL-verify Befehl gibt die zurückgewonnenen Daten der RSA-Signatur

-verify die Eingangsdaten und Ausgang der zurückgewonnenen Daten überprüfen.

Dies bedeutet, dass die Nachricht PKCS # 1 zurückgegeben wird. Eine digitale Signatur, die dem RFC2313 folgt, besteht aus dem Digest-Algorithmus-Identifizierer und dem verschlüsselten Digest des Inhalts mit dem privaten RSA-Schlüssel im PKCS # 7-Format, beschrieben in Abschnitt 9.1 von RFC2315. So

signedData ::= SEQUENCE { 
version Version, 
digestAlgorithms DigestAlgorithmIdentifiers, 
contentInfo ContentInfo, 
certificates 
    [0] IMPLICIT ExtendedCertificatesAndCertificates 
     OPTIONAL, 
crls 
    [1] IMPLICIT CertificateRevocationLists OPTIONAL, 
signerInfos SignerInfos } 

(wenn ich das richtig verstanden ...), die Ausgabe von OpenSSL ist eine ASN.1 Sequenz von algoritm verdauen + entschlüsselten Digest (die ursprüngliche Digest Ihrer Inhalte)

zu dekodieren es können Sie Bouncycastle

public class ASN1Decoder { 
    private static String opensslOutputB64= "MDEwDQYJYIZIAWUDBAIBBQAEIGGbJmsmf9lg/jeaXjm0XsUZ4ZS7xv0Da/NvPoNiRzRO"; 

    public final static void main(String argv[]) throws IOException{ 
     ASN1InputStream bIn = new ASN1InputStream(new ByteArrayInputStream(Base64.getDecoder().decode(opensslOutputB64))); 
     ASN1Primitive obj = bIn.readObject(); 
     System.out.println(ASN1Dump.dumpAsString(obj)); 

    } 
} 

prüfen Parsing ASN.1 binary data with Java für weitere Beispiele

0

Mit einigen verwenden Hilfe von @pedrofb ich es geschafft, mit der folgenden Lösung zu kommen:

// Get key from cert 
CertificateFactory fact = CertificateFactory.getInstance("X.509", new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
X509Certificate cer = (X509Certificate) fact.generateCertificate(new FileInputStream("/home/administrator/Downloads/cert_1.txt")); 
PublicKey key = cer.getPublicKey(); 

// or read key in from pem file 
PublicKey publicKey = ManifestUtils.publicKeyFromPemFile(new FileReader("/home/administrator/Downloads/publickey.txt")); 

// Decrypt the signature 
Cipher asymmetricCipher 
      = Cipher.getInstance("RSA/ECB/PKCS1Padding", new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
asymmetricCipher.init(Cipher.DECRYPT_MODE, publicKey); 
byte[] plainText = asymmetricCipher.doFinal(
      IOUtils.toByteArray(new FileInputStream("/home/administrator/Downloads/signature.sign"))); 

// print as hex 
System.out.println(Hex.encodeHexString(plainText)); 

// Print the ans1 nicely - ish 
ASN1InputStream input = new ASN1InputStream(plainText); 
ASN1Primitive p; 
while ((p = input.readObject()) != null) { 
    System.out.println(ASN1Dump.dumpAsString(p)); 
} 
Verwandte Themen