Модераторы: AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Java Card RSA & OpenSSL 
V
    Опции темы
Jessy
Дата 27.11.2010, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
firstone
Дата 29.11.2010, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 25.9.2007
Где: Кровью залитая Св ятая Земля

Репутация: 5
Всего: 7



Цитата(Jessy @  27.11.2010,  01:04 Найти цитируемый пост)
В Си ключи представленны в виде массива unsigned long int, перед отпрвкой перевожу этот массив в unsigned char

Может проблема связана с позицией байт в словах? В смысле Big Indian? 
--------------------
В программировании я конфуцианец. В жизни я либерал-демократ. В душе я буддист.Добавлено через 1 минуту и 9 секундА на самом деле я лентяй.
PM MAIL   Вверх
Jessy
Дата 28.9.2011, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Проблему я решил, но не помню уже как. Помню только, что биты в платформе Java Card идут в другом порядке нежели в PC. Перед отправкой их нужно было инвертировать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java Card | Следующая тема »


 




[ Время генерации скрипта: 0.1185 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.