Новичок
Профиль
Группа: Участник
Сообщений: 12
Регистрация: 1.11.2010
Репутация: нет Всего: нет
|
Генерирую библиотекой OpenSSL 512 битный ключ. Режим выравнивания данных RSA_NO_PADDING. Код: Код | // указатель на структуру для хранения ключей RSA * rsa = NULL; // длина ключа в битах unsigned long bits = 512; int i, inlen, outlen; // Генерируем ключи rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL);
int key_size = RSA_size(rsa); unsigned char *ptext, *ctext; ptext = (unsigned char *) malloc(key_size); ctext = (unsigned char *) malloc(key_size);
inlen = key_size;
printf("inlen read \nsend B25C%x00%x", inlen, inlen);
for(i = 0; i < inlen; i++) { ptext[i] = i+1; printf("%2.2x", ptext[i]); }
puts("\n");
RSA_public_encrypt(inlen, ptext, ctext, rsa, RSA_NO_PADDING);
inlen = key_size;
printf("key_size %x\n\n", inlen); for(i = 0; i < inlen; i++) { printf("%2.2x", ctext[i]); }
puts("\n");
RSA_private_decrypt(inlen, ctext, ptext, rsa, RSA_NO_PADDING);
|
В Си проблем нет, шифрует и расшифровывает правильно. В Си ключи представленны в виде массива unsigned long int, перед отпрвкой перевожу этот массив в unsigned char Код | unsigned char *mod, *pub_ex, *pri_ex; mod = (unsigned char *) malloc(sizeof(unsigned char) * sizeof(BN_ULONG) * rsa->n->dmax); pub_ex = (unsigned char *) malloc(sizeof(unsigned char) * sizeof(BN_ULONG) * rsa->e->dmax); pri_ex = (unsigned char *) malloc(sizeof(unsigned char) * sizeof(BN_ULONG) * rsa->d->dmax); memcpy(mod, rsa->n->d, sizeof(unsigned char) * sizeof(BN_ULONG) * rsa->n->dmax); memcpy(pub_ex, rsa->e->d, sizeof(unsigned char) * sizeof(BN_ULONG) * rsa->e->dmax); memcpy(pri_ex, rsa->d->d, sizeof(unsigned char) * sizeof(BN_ULONG) * rsa->d->dmax);
|
Размер массива модуля был 0x10 в ulong, стал 0x40 в uchar А вот в апплете проблемма. Шифрует и расшифровывает совершенно не то. Режим выравнивания данных ALG_RSA_NOPAD. Использую интерфейсы: RSAPublicKey rsa_public_key; RSAPrivateKey rsa_private_key; Так заливаю ключи: n mod send B25A0000408b4c6596864b42c80792b0136e6167a09a393a26a7a17e6650d9a1bb880329feb786a487b9f905d249087327e76a4ba8d71b82719afb8bcf02e3c5badc01ebe5 e exp send B25600000401000100 d exp send B258000040b16c93fa7c39f4301c5315b7342dc6b3e9e357aeb40c0649560b7c996140394372f7f646505fee299b61601c9a8d183e9082a4e19c9b89438232e515bed203d8 Код |
private static final byte INS_CREATE_RSA = (byte)0x52; private static final byte INS_CLEAR_RSA = (byte)0x54; private static final byte INS_SET_EXPONENT_PUB = (byte)0x56; private static final byte INS_SET_EXPONENT_PRIV = (byte)0x58; private static final byte INS_SET_MODULUS = (byte)0x5A; private static final byte INS_GET_CIPHER_ENC = (byte)0x5C; private static final byte INS_GET_CIPHER_DEC = (byte)0x5E; private static final byte INS_PR_PUB_KEY = (byte)0x5F; private void processWorkKey(APDU apdu) { byte buffer[] = apdu.getBuffer(); byte ins = buffer[ISO7816.OFFSET_INS];
switch(ins) { case INS_CREATE_RSA: CreateRSAKey(apdu); break; case INS_CLEAR_RSA: ClearRSAKey(apdu); break; case INS_SET_EXPONENT_PUB: setExponent_pub(apdu); break; case INS_SET_EXPONENT_PRIV: setExponent_priv(apdu); break; case INS_SET_MODULUS: setModulus(apdu); break; case INS_GET_CIPHER_ENC: getCipher_enc(apdu); break; case INS_GET_CIPHER_DEC: getCipher_dec(apdu); break; case INS_PR_PUB_KEY: print_pub_key(apdu); break; default: ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); break; } }
RSAPublicKey rsa_public_key; RSAPrivateKey rsa_private_key; private void CreateRSAKey(APDU apdu) { byte buffer[] = apdu.getBuffer(); short lentgh = Util.getShort(buffer, ISO7816.OFFSET_P1); switch(lentgh) { case 0x512: rsa_public_key = (RSAPublicKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC, KeyBuilder.LENGTH_RSA_512, false); rsa_private_key = (RSAPrivateKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PRIVATE, KeyBuilder.LENGTH_RSA_512, false); break; case 0x1024: rsa_public_key = (RSAPublicKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC, KeyBuilder.LENGTH_RSA_1024, false); rsa_private_key = (RSAPrivateKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PRIVATE, KeyBuilder.LENGTH_RSA_1024, false); break; case 0x2048: rsa_public_key = (RSAPublicKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC, KeyBuilder.LENGTH_RSA_2048, false); rsa_private_key = (RSAPrivateKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PRIVATE, KeyBuilder.LENGTH_RSA_2048, false); break; default: ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); break; } ISOException.throwIt((short)lentgh); } private void setExponent_pub(APDU apdu) { byte buffer[] = apdu.getBuffer(); rsa_public_key.setExponent(buffer, ISO7816.OFFSET_CDATA, buffer[ISO7816.OFFSET_LC]); return; } private void setExponent_priv(APDU apdu) { byte buffer[] = apdu.getBuffer(); rsa_private_key.setExponent(buffer, ISO7816.OFFSET_CDATA, buffer[ISO7816.OFFSET_LC]); return; } private void setModulus(APDU apdu) { byte buffer[] = apdu.getBuffer(); rsa_public_key.setModulus(buffer, ISO7816.OFFSET_CDATA, buffer[ISO7816.OFFSET_LC]); rsa_private_key.setModulus(buffer, ISO7816.OFFSET_CDATA, buffer[ISO7816.OFFSET_LC]); return; } private static final short RSA_CLEAR_TRUE = (short)0x1101; private static final short RSA_NO_INIT = (short)0x1102; private void ClearRSAKey(APDU apdu) { byte buffer[] = apdu.getBuffer(); if(rsa_public_key.isInitialized()) { rsa_public_key.clearKey(); ISOException.throwIt(RSA_CLEAR_TRUE); }else{ ISOException.throwIt(RSA_NO_INIT); } } Cipher cipher_pub; Cipher cipher_priv; private static byte encrypt[]; private static byte decrypt[]; private static byte length; private void getCipher_enc(APDU apdu) { byte buffer[] = apdu.getBuffer(); encrypt = new byte[buffer[ISO7816.OFFSET_LC]]; decrypt = new byte[buffer[ISO7816.OFFSET_LC]]; length = buffer[ISO7816.OFFSET_LC]; if(cipher_pub == null) cipher_pub = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false); cipher_pub.init(rsa_public_key, Cipher.MODE_ENCRYPT); cipher_pub.doFinal(buffer, ISO7816.OFFSET_CDATA, buffer[ISO7816.OFFSET_LC], encrypt, ZEROS); sendData(apdu, encrypt, ZEROS, buffer[ISO7816.OFFSET_LC]); } private void getCipher_dec(APDU apdu) { byte buffer[] = apdu.getBuffer(); if(cipher_priv == null) cipher_priv = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false); cipher_priv.init(rsa_private_key, Cipher.MODE_DECRYPT); cipher_pub.doFinal(encrypt, ZEROS, length, decrypt, ZEROS); sendData(apdu, decrypt, ZEROS, length); } private void print_pub_key(APDU apdu) { byte buffer[] = new byte[length]; rsa_public_key.getModulus(buffer, ZEROS); sendData(apdu, buffer, ZEROS, length); } private void sendData(APDU apdu, byte data[], short offset, short size) { if (size > 255) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); Util.arrayCopyNonAtomic(data, offset, apdu.getBuffer(), ZEROS, size); apdu.setOutgoingAndSend(ZEROS, size); }
|
В чем проблемма, не одинаковой работы может быть??? Заранее спасибо. Это сообщение отредактировал(а) Jessy - 27.11.2010, 01:23
|