2012-01-08 3 views
2

javacard를 사용하여 서명을 만들고 확인하는 방법에 대한 조언을 누군가에게 줄 수 있습니까? 내가 서명 생성 및 검증 뭔가 잘못하고있는 중이 야 같아요 ...JavaCard> 서명 및 확인

SignatureMessageRecovery sig; 

...

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); 
} 

을 ...

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)); 
} 

ON 자바 측 나는 이미 공개 키를 X509Certificate로서 localy 파일에 저장했습니다. 확실히 그들이 modulus와 지수와 동일하다는 것은 인증서와 카드 모두에서 동일하게 보입니다.

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

, 당신은 두 개의 개별 서명 기능을 사용하는 것입니다. 오래된 ISO9796 Java 측에서 "SHA1withRSA"을 지정하는 경우 사용되는 PKCS # 1 서명 형식과 약간 다릅니다. 실제로 메시지 복구가 필요합니까 ? 요즘 카드 인증 인증서에 주로 사용됩니다 (이면 사용).

Java 카드 측에 SignatureMessageRecoveryALG_RSA_SHA_ISO9796_MR 대신 SignatureALG_RSA_SHA_PKCS1을 사용하기 만하면됩니다.

메시지 복구를 원할 경우 Java 측에서 Bouncy Castle 라이브러리를 사용해야 할 수도 있습니다 (그리고 Bouncy에서도 제대로 작동하려면 조금 까다 롭습니다).

+0

많은 지식을 공유해 주셔서 감사합니다. 이제 작동합니다! – peshkatari