JavaCard>;签字核实

JavaCard>;签字核实,java,cryptography,signature,javacard,Java,Cryptography,Signature,Javacard,有人能给我一个关于如何用javacard签名并验证它的小建议吗? 我想我在签名生成和验证方面出了问题: 在Java端 我已经获得了公钥,并将其作为X509证书保存在本地文件中。很确定它们是相同的,因为在证书和卡片中,模数和指数似乎是相同的 FileInputStream certis = new FileInputStream(cert); X509Certificate c1 = new X509Certificate(certis); Security.addProvider(新o

有人能给我一个关于如何用javacard签名并验证它的小建议吗? 我想我在签名生成和验证方面出了问题:

在Java端 我已经获得了公钥,并将其作为X509证书保存在本地文件中。很确定它们是相同的,因为在证书和卡片中,模数和指数似乎是相同的

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

Security.addProvider(新org.bouncycastle.jce.provider.BouncyCastleProvider());
字节[]testsig=新字节[64];
数组复制(原始签名,0,testsig,0,64);
签名签名=Signature.getInstance(“SHA1withRSA”,“BC”);
signature.initVerify(c1.getPublicKey());
System.out.println(c1.getPublicKey());
系统输出打印号(签名);
System.out.println(file_data.length+“:>”+新字符串(file_data));
签名。更新(文件和数据);

System.out.println(“VERIFY>”+signature.VERIFY(testsig)+“对于初学者,您使用的是两个独立的签名函数。较旧的ISO9796与PKCS#1签名格式有很大不同,PKCS#1签名格式是在指定RSA时使用的“
在Java方面。您真的需要消息恢复吗?现在它主要用于卡验证证书(如果使用的话)

只需使用
Signature
ALG_RSA_SHA_PKCS1
而不是Java卡端的
SignatureMessageRecovery
ALG_RSA_SHA_ISO9796_MR

如果您想要恢复消息,您可能必须在Java端使用BouncyCastle库(即使在BouncyCastle中,要让它正常工作也有点棘手)

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