2017-08-02 78 views
0

我有一個使用HSM的java程序,它使用本地API提供給我,以及只有兩個大整數的ECDSA簽名的R和S值。我需要採取這些整數並創建ASN.1編碼。任何想法,我怎麼能做到這一點?我確實有BouncyCastle運行,但是,我不熟悉可用的選項。從兩個大整數創建ASN.1

回答

3

一個小例子來說明:

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

如果你以某種方式獲得字節而不是整數,然後確保你正確設置符號位,例如通過使用'new BigInteger(1,[byte array])',其中1表示應該假設無符號編碼。 –

+0

謝謝你!對此,我真的非常感激! –