2012-01-08 20 views
2

javacardで署名を作成して検証する方法について、少し助言してくれる人がいますか? 私は署名生成と検証と間違って何かをやっていると思います: JavaCard>署名と検証

private void insCryptoSigne(APDU apdu) { 

    byte[] buffer = apdu.getBuffer(); 
    short bytesRead = apdu.setIncomingAndReceive(); 
    short[] m1Data = JCSystem.makeTransientShortArray((short) 1, JCSystem.CLEAR_ON_DESELECT); 

    sigLen = sig.sign(buffer, ISO7816.OFFSET_CDATA, bytesRead, sigBuff, (short) 0, m1Data, (short) 0); 
    // set m1Length into sigBuff array 
    sigBuff[sigLen] = (byte) ((short) (m1Data[(short) 0] & ((short) 0xFF00)) >> ((short) 8)); 
    sigBuff[(short) (sigLen + 1)] = (byte) (m1Data[(short) 0] & ((short) 0x00FF)); 

    apdu.setOutgoing(); 
    apdu.setOutgoingLength((short) (sigLen + 2));// The extra 2 bytes for 
    apdu.sendBytesLong(sigBuff, (short) 0, (short) (sigLen + 2)); 
} 
...

private Cardlet(byte[] bArray, short bOffset, byte bLength) { 
    /* Generate our RSA key */ 
    keyPair = new KeyPair(KeyPair.ALG_RSA, (short) 512); 
    keyPair.genKeyPair(); 
    /* signature buffer is 64 + 2 (offset + length) */ 
    sigBuff = JCSystem.makeTransientByteArray((short) (SIG_LENGTH + 2), JCSystem.CLEAR_ON_DESELECT); 
    sig = (SignatureMessageRecovery) Signature.getInstance(Signature.ALG_RSA_SHA_ISO9796_MR, false); 
} 

...

...

SignatureMessageRecovery sig; 

をON Java側 私はすでに公開鍵がX509Certificateとしてlocalyファイルに保存されています。モジュラスと指数と同じであることを確かめてください。証明書とカードの両方で同じように見えます。

FileInputStream certis = new FileInputStream(cert); 
X509Certificate c1 = new X509Certificate(certis); 

...

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
byte[] testsig = new byte[64]; 
System.arraycopy(raw_signature,0, testsig, 0, 64); 
Signature signature = Signature.getInstance("SHA1withRSA", "BC"); 
signature.initVerify(c1.getPublicKey()); 
System.out.println(c1.getPublicKey()); 
System.out.println(signature); 
System.out.println(file_data.length+":> "+new String(file_data)); 
signature.update(file_data); 
System.out.println("VERIFY > "+signature.verify(testsig)+" <"); 

結果は手始めに偽:(

おかげで、よろしく トゥリ

答えて

1

で、次の2つの別々の署名機能を使用しています。古いISO9796 Java側で"SHA1withRSA"を指定した場合に使用されるPKCS#1署名形式とはかなり異なります。本当にメッセージ回復が必要ですか?最近では、カード検証可能な証明書に使用されています(の場合は)。

Javaカード側でSignatureMessageRecoveryALG_RSA_SHA_ISO9796_MRの代わりにSignatureALG_RSA_SHA_PKCS1を単に使用してください。

メッセージリカバリを希望する場合は、Java側でBouncy Castleライブラリを使用する必要があります(Bouncyでは正しく動作させるには少し難しい)。

+0

あなたの知識を共有してくれてありがとうございました。それは今働きます! – peshkatari