2011-12-05 56 views
1

我正在使用BouncyCastle生成DSA簽名,但使用本機JCE來驗證它。BouncyCastle在PC上使用本地Java生成的Veryfing簽名JCE

注:我有一個J2ME客戶端本身不支持簽名,因此對於BouncyCastle的需要)

所以工作時,在客戶端上進行如下產生數字簽名:

DSASigner sig = new DSASigner(); 
sig.init(true, privateKey); 
String plaintext = "This is the message being signed"; 
BigInteger[] sigArray = sig.generateSignature(plaintext.getBytes()); 
... 

sigArray包含2個BigIntegers r和s。

此簽名然後必須傳輸到使用本機JCE驗證簽名的服務器。在服務器端,使用本地Java JCE,它應該是可以驗證的簽名如下:

... 
Signature sig = Signature.getInstance("SHA1withDSA"); 
byte[] sigbytes = Base64.decode(signature); 
sig.initVerify(publicKey); 
sig.update(plaintext.getBytes()); 
sig.verify(sigbytes) 

我遇到的問題是:我如何編碼sigArray成可以發送到PC的格式/服務器作爲單個Base64字符串(而不是單獨的r和s),然後可以在服務器上使用本機JCE方法在代碼的第二個代碼段中進行驗證?

到目前爲止,我已經嘗試從r,s數組創建DERObjects(分開,一起作爲一個數組編碼),但仍然沒有運氣。有人遇到過這個?你是如何解決它的?

回答

0

根據加密消息語法算法RFC 3370)DSA簽名編碼是含有整數rs一個ASN.1序列:

Dss-Sig-Value ::= SEQUENCE { 
    r INTEGER, 
    s INTEGER } 
相關問題