This discussion is archived
2 Replies Latest reply: Oct 8, 2012 6:25 AM by 966781 RSS

RSA Decryption Error - Illegal Use

966781 Newbie
Currently Being Moderated
Hi there,

i have a crypthographic problem using a JavaCard application and a Java host application.
On the card i create a cipher object and a private/public key:
Cipher cipher = Cipher.getInstance(Cipher.ALG_RSA_PKCS1_OAEP, false);
KeyPair kP = new KeyPair(KeyPair.ALG_RSA, KeyBuilder.LENGTH_RSA_1984);
kP.genKeyPair();
RSAPublicKey app_public_key = (RSAPublicKey) kP.getPublic();
RSAPrivateKey app_private_key = (RSAPrivateKey) kP.getPrivate();
There are two functions on the card to send the modulus and the exponent from the public key to the host application using two APDUs.
private void sendModulus(APDU apdu)
{
     byte[] buffer = apdu.getBuffer();
     short modLength = app_public_key.getModulus(buffer, (short)ISO7816.OFFSET_CDATA);
     apdu.setOutgoing();
     apdu.setOutgoingLength(modLength);
     apdu.sendBytesLong(buffer, (short)ISO7816.OFFSET_CDATA, modLength);
}
     
private void sendExponent(APDU apdu)
{
     byte[] buffer = apdu.getBuffer();
     short expLength = app_public_key.getExponent(buffer, (short)ISO7816.OFFSET_CDATA);
     apdu.setOutgoing();
     apdu.setOutgoingLength(expLength);
     apdu.sendBytesLong(buffer, (short)ISO7816.OFFSET_CDATA, expLength);
}
On the host i request the modulus and the exponent and build the public key:
public void getAppMod() throws TerminalException
{
                  //get modulus
     ResponseApdu response = send(new CommandApdu("0x00 0xAA 0x01 0x00"));
     System.out.println(response.getStatusHexString());
     byte[] modulus = response.getData().toByteArray();

                  //get exponent
     ResponseApdu response = send(new CommandApdu("0x00 0xAA 0x02 0x00"));
     System.out.println(response.getStatusHexString());
     byte[] exponent = response.getData().toByteArray();

                  RSAPublicKeySpec kSpec = new RSAPublicKeySpec(new BigInteger(1, mod), new BigInteger(1, exp));
     KeyFactory kFac = KeyFactory.getInstance("RSA");
     RSAPublicKey app_rsa_publicKey = (RSAPublicKey)kFac.generatePublic(kSpec);
}
Now i create a cipher object on the host application, encrypt a message with this public key and send it to the card:
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("RSA", "BC");
cipher.init(Cipher.ENCRYPT_MODE, app_rsa_publicKey);
byte[] cipherData = cipher.doFinal(bData); //bData is the message and cipherData the encrypted 248byte message.
On the card now im trying to decrypt it with the private key.
byte[] buffer = apdu.getBuffer();
short bytesRead = apdu.setIncomingAndReceive();
cipher.init(app_private_key, Cipher.MODE_DECRYPT);
short messageLength = cipher.doFinal(buffer, (short)ISO7816.OFFSET_CDATA, bytesRead, buffer, (short)ISO7816.OFFSET_CDATA);
}
But the "doFinal" method throws an "ILLEGAL_USE" Exception...
I dont know what to do now....
Is it possible that the "BouncyCastle" Cipher object on the host side does not fit the cipher object on the card side ? because the key was transfered correctlly :(
is there any provider i can use whre i dont need a free library like bouncycastle ?

Thanks for helping...

Edited by: 963778 on 08.10.2012 01:56

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points