2017-08-02 5 views
0

Ich habe ein Java-Programm mit einem HSM, das mit der nativen API gibt mir und R und S-Wert einer ECDSA-Signatur, die nur die zwei Big Integer ist. Ich muss diese Ganzzahlen nehmen und ASN.1-Codierung erstellen. Irgendeine Idee, wie ich das machen könnte? Ich habe BouncyCastle in Betrieb, aber mir sind die mir zur Verfügung stehenden Optionen nicht bekannt.Erstellen ASN.1 von zwei großen Ganzzahlen

Antwort

3

Ein kleines Beispiel zur Veranschaulichung:

import org.bouncycastle.asn1.ASN1Integer; 
import org.bouncycastle.asn1.DERSequence; 

import javax.xml.bind.DatatypeConverter; 
import java.math.BigInteger; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     BigInteger r = new BigInteger("29128391823901823918293108120938102381912839182390182391829310812093810238199"); 
     BigInteger s = new BigInteger("38663726871681756650018917824777578348866372687168175665001891782477757834811"); 

     ASN1Integer asn1R = new ASN1Integer(r); 
     ASN1Integer asn1S = new ASN1Integer(s); 

     DERSequence seq = new DERSequence(new ASN1Integer[]{asn1R, asn1S}); 
     byte[] encoded = seq.getEncoded(); 
     System.out.println(DatatypeConverter.printHexBinary(encoded)); 
    } 
} 
+0

Wenn Sie irgendwie Bytes anstelle von ganzen Zahlen erhalten dann das Vorzeichenbit stellen Sie sicher, richtig eingestellt, zum Beispiel durch Verwendung von 'new BigInteger (1, [Byte-Array])', wobei die 1 anzeigt, dass eine vorzeichenlose Codierung angenommen werden sollte. –

+0

Danke Mann! Ich schätze das wirklich! –