Simple RSA Encryption and Decryption
843851Sep 23 2008 — edited Jan 5 2009Hello
I'm a newbie to java card .
I've been able to write a simple applet to write and read from a card .
Now I wanna write my data to card again , but I want it to be encrypted.
In the applet, I encrypt the received data with DES and decrypt it with DES and send it back to application fine .
my class has an instance variable that keeps the data .
I don't know how to use RSA (to obtain a longer KEY).
considering the fact , that the application does not interface with other parties , (that must obtain the public key).
I want a simple encrypt received and and decrypt the ToBeSent data to a trusted site using RSA.as done with DES in thread:
http://forums.sun.com/thread.jspa?messageID=3709542
I can encrypt the data but when trying to decrypt it , in GetString cipher.dofinal() throws exception.
public class SimpleString extends Applet {
final static byte SimpleString_CLA =
(byte)0x00;
final static byte SET_NAME = (byte)0x10;
final static byte GET_NAME = (byte)0x20;
final static byte SET_SHARE = (byte)0x30;
final static byte GET_SHARE = (byte)0x40;
// Holds APDU's for processing
//byte[] buffer;
// Holds the string data on the card
byte[] TheBuffer ;
private byte[] CrtKey = {
(byte)0xC2, (byte)0x01, (byte)0x05,
(byte)0xC2, (byte)0x41, (byte)0x00,
(byte)0xC5, (byte)0xD7, (byte)0x20, (byte)0x28, (byte)0xFA, (byte)0xA7, (byte)0x91, (byte)0x55,
(byte)0x23, (byte)0xE2, (byte)0x0D, (byte)0xE4, (byte)0x28, (byte)0x7C, (byte)0x65, (byte)0xB7,
(byte)0x18, (byte)0x59, (byte)0xD9, (byte)0x0D, (byte)0xBA, (byte)0xE7, (byte)0xCF, (byte)0x6A,
(byte)0xF1, (byte)0xE3, (byte)0x10, (byte)0xC3, (byte)0x7E, (byte)0x48, (byte)0x0D, (byte)0xBC,
(byte)0x76, (byte)0x7B, (byte)0x04, (byte)0x86, (byte)0xB6, (byte)0x7F, (byte)0xCD, (byte)0x6C,
(byte)0x84, (byte)0x1A, (byte)0x0B, (byte)0x86, (byte)0xB9, (byte)0x96, (byte)0xAA, (byte)0x83,
(byte)0x68, (byte)0x63, (byte)0x3C, (byte)0x4D, (byte)0x43, (byte)0x84, (byte)0xB8, (byte)0x6D,
(byte)0x48, (byte)0xAA, (byte)0xC4, (byte)0xC9, (byte)0x1B, (byte)0x50, (byte)0x47, (byte)0x49,
(byte)0xC2, (byte)0x41, (byte)0x00, (byte)0xC9, (byte)0x5E, (byte)0x4A, (byte)0x08, (byte)0x0E,
(byte)0xDC, (byte)0xA5, (byte)0x45,(byte)0x90, (byte)0x1C, (byte)0x52, (byte)0xF8, (byte)0x3E,
(byte)0xB0, (byte)0x6B, (byte)0x8F,(byte)0xCF, (byte)0xEA, (byte)0xA8, (byte)0xF5, (byte)0x1E,
(byte)0xAD, (byte)0xD3, (byte)0x82, (byte)0x52, (byte)0x30, (byte)0x43, (byte)0x04, (byte)0x9C,
(byte)0x25, (byte)0x63, (byte)0x87,(byte)0x37, (byte)0x20, (byte)0x64, (byte)0x3F, (byte)0x16, (byte)0xB0, (byte)0x50, (byte)0xCC,
(byte)0x38, (byte)0x06, (byte)0x1B, (byte)0xDF, (byte)0xE6, (byte)0x78, (byte)0xC3, (byte)0x99,
(byte)0xF7, (byte)0xC4, (byte)0x3F, (byte)0x95, (byte)0x81, (byte)0xE0, (byte)0x77, (byte)0x5C,
(byte)0xA3, (byte)0x78, (byte)0xB8, (byte)0x9C, (byte)0x8D, (byte)0x9B, (byte)0x46, (byte)0x5D,
(byte)0xC2, (byte)0x41, (byte)0x00, (byte)0x7F, (byte)0xDE, (byte)0x17, (byte)0x36, (byte)0xDA, (byte)0x18, (byte)0x1E, (byte)0xEF,
(byte)0xD0, (byte)0x50, (byte)0xBD, (byte)0x2C, (byte)0x57, (byte)0xBE, (byte)0x10, (byte)0x7B,
(byte)0x08, (byte)0x7D, (byte)0xC6, (byte)0xC7, (byte)0xF5, (byte)0x76, (byte)0xA2, (byte)0x59,
(byte)0x35, (byte)0x7D, (byte)0xEA, (byte)0xB0, (byte)0x73, (byte)0xE6, (byte)0x51, (byte)0xEB,
(byte)0xD3, (byte)0x07, (byte)0xDD, (byte)0x73, (byte)0x56, (byte)0x8B, (byte)0x76, (byte)0x46,
(byte)0x3F, (byte)0xAE, (byte)0x0A, (byte)0xB9, (byte)0xA3, (byte)0xE3, (byte)0x0D, (byte)0x71,
(byte)0xFB, (byte)0xFE, (byte)0x55, (byte)0x02, (byte)0xF6, (byte)0xB6, (byte)0x4D, (byte)0xC2,
(byte)0x79, (byte)0x64, (byte)0xFD, (byte)0x28, (byte)0xBB, (byte)0x13, (byte)0x23, (byte)0xB2,
(byte)0xC2, (byte)0x41, (byte)0x00,(byte)0xA3, (byte)0x8D, (byte)0xA3, (byte)0xED, (byte)0x9C, (byte)0xC2, (byte)0x18, (byte)0xB8,
(byte)0x9D, (byte)0x10, (byte)0x8D, (byte)0x51, (byte)0x58, (byte)0x52, (byte)0xF6, (byte)0xB7,
(byte)0xB5, (byte)0xEE, (byte)0xD9, (byte)0x2C, (byte)0xAB, (byte)0x9E, (byte)0x65, (byte)0xEF,
(byte)0xD0, (byte)0x86, (byte)0x59, (byte)0xDE, (byte)0x73, (byte)0xB0, (byte)0x57, (byte)0x82,
(byte)0xBD, (byte)0x24, (byte)0x17, (byte)0xEA, (byte)0xD2, (byte)0x46, (byte)0xB7, (byte)0x69,
(byte)0x85, (byte)0x90, (byte)0x0E, (byte)0x85, (byte)0x53, (byte)0x3A, (byte)0x06, (byte)0x3E,
(byte)0xDA, (byte)0x76, (byte)0x67, (byte)0x6C, (byte)0xAC, (byte)0x6B, (byte)0xB5, (byte)0x17,
(byte)0xCB, (byte)0x62, (byte)0x39, (byte)0x8A, (byte)0xD4, (byte)0x04, (byte)0xBA, (byte)0xD9,(byte)0xC2, (byte)0x41, (byte)0x00,
(byte)0x44 , (byte)0x03 , (byte)0x03 ,(byte)0xB0 ,(byte)0x1B, (byte)0x0C, (byte)0xED, (byte)0x09,
(byte)0x44, (byte)0xB6, (byte)0x3C, (byte)0x53, (byte)0xBA, (byte)0x20, (byte)0xAE, (byte)0x03,
(byte)0xA1, (byte)0xAE, (byte)0xD9, (byte)0x28, (byte)0x09, (byte)0x17, (byte)0x9E, (byte)0xC3,
(byte)0x7A, (byte)0x6C, (byte)0xF0, (byte)0x85, (byte)0xC3, (byte)0x13, (byte)0x61, (byte)0xBD,
(byte)0x4E, (byte)0xA2, (byte)0x33, (byte)0x19, (byte)0x97, (byte)0xD9, (byte)0x2F, (byte)0x40,
(byte)0xFA, (byte)0x7F, (byte)0x1D, (byte)0xB5, (byte)0x0E, (byte)0xCB, (byte)0xA5, (byte)0x0D,
(byte)0x00, (byte)0xC1, (byte)0x18, (byte)0xD4, (byte)0xAF, (byte)0x4C, (byte)0x18, (byte)0x24,
(byte)0x82, (byte)0xD6, (byte)0x08, (byte)0x4C, (byte)0x60, (byte)0x0B, (byte)0x9C, (byte)0xC5
};
//{(byte)0x50,(byte)0x51,(byte)0x52,(byte)0x53,(byte)0x54,(byte)0x55,(byte)0x56,(byte)0x57,(byte)0x58,(byte)0x59,(byte)0x5a,(byte)0x5b,(byte)0x5c,(byte)0x5d,(byte)0x5e,(byte)0x5f};
RSAPrivateCrtKey RsaCrt;
RSAPublicKey RsaPub;
// private Key secretKey;
private Cipher RSAcipher;
private SimpleString(byte[] bArray, short bOffset, byte bLength) {
TheBuffer = new byte[127];
KeyPair keyPair = new KeyPair(KeyPair.ALG_RSA_CRT, (short)1024);
// RsaPub = (RSAPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC,KeyBuilder.LENGTH_RSA_1024, false);
// RsaCrt = (RSAPrivateCrtKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_CRT_PRIVATE,KeyBuilder.LENGTH_RSA_1024, false);
keyPair.genKeyPair();
RsaCrt = (RSAPrivateCrtKey)keyPair.getPrivate();
RsaPub = (RSAPublicKey)keyPair.getPublic();
RSAcipher = Cipher.getInstance( Cipher.ALG_RSA_PKCS1, false);
//TheBuffer2 = new byte[127];
register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
public static void install(byte[] bArray, short bOffset, byte bLength) {
new SimpleString(bArray, bOffset, bLength);
}
/*public boolean select(){
return true;
} */
private void SetString(APDU apdu) {
byte[] buffer = apdu.getBuffer();
byte size = (byte)(apdu.setIncomingAndReceive());
TheBuffer[0]= size;
RsaCrt.setQ(CrtKey , (short )6 , (short)64);
RsaCrt.setP(CrtKey , (short)73 , (short )64);
RsaCrt.setPQ(CrtKey , (short)140 , (short )64);
RsaCrt.setDQ1(CrtKey , (short)207 , (short )64);
RsaCrt.setDP1(CrtKey , (short)274 , (short )64);
RSAcipher.init( RsaCrt, Cipher.MODE_ENCRYPT );
// RsaPub.setExponent(PubKey , (short)137 , (short)3);
// RsaPub.setModulus(PubKey , (short)6 , (short)128);
// RSAcipher.init(RsaPub , Cipher.MODE_ENCRYPT);
//byte index;
//Store the string length and the string itself
Util.arrayCopy(buffer,ISO7816.OFFSET_CDATA, TheBuffer, (short)1,(short)size);
//RSAcipher.doFinal( buffer, (short)ISO7816.OFFSET_CDATA, (short)size, TheBuffer, (short) 1 );
RSAcipher.doFinal( buffer, (short)ISO7816.OFFSET_CDATA, (short)size, buffer, (short) 0 );
Util.arrayCopy(buffer,ISO7816.OFFSET_CDATA, TheBuffer, (short)1,(short)size);
apdu.setOutgoing();
apdu.setOutgoingLength(size);
apdu.sendBytes((short)0,(short)size);
return;
}
public void process(APDU apdu) throws ISOException {
if (selectingApplet()) {
return;
}
byte[] buffer = apdu.getBuffer();
if (buffer[ISO7816.OFFSET_CLA] !=
SimpleString_CLA)
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
switch (buffer[ISO7816.OFFSET_INS]) {
case SET_NAME:
SetString(apdu);
return;
case GET_NAME:
GetString(apdu);
return;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
private void GetString(APDU apdu) {
byte[] buffer = apdu.getBuffer();
RsaCrt.setQ(CrtKey , (short )6 , (short)64);
RsaCrt.setP(CrtKey , (short)73 , (short )64);
RsaCrt.setPQ(CrtKey , (short)140 , (short )64);
RsaCrt.setDQ1(CrtKey , (short)207 , (short )64);
RsaCrt.setDP1(CrtKey , (short)274 , (short )64);
RSAcipher.init( RsaCrt, Cipher.MODE_DECRYPT );
byte numBytes = buffer[ISO7816.OFFSET_LC];
if (numBytes == 0)
ISOException.throwIt((short)(
ISO7816.SW_WRONG_LENGTH + TheBuffer[0]));
Util.arrayCopy(TheBuffer,
(short)1, buffer, (short)0,
(short)numBytes);
RSAcipher.doFinal(TheBuffer, (short) 0 , (short)numBytes, buffer, (short) 0 );
apdu.setOutgoing();
apdu.setOutgoingLength(numBytes);
apdu.sendBytes((short)0,(short)numBytes);
// apdu.sendBytesLong(TheBuffer,(short)0,(short)numBytes);
return;
}
}
Thanks in advance