Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
Ребят, такое дело. У меня есть публичный ключ длиной 128 байт. Мне нужно этим ключом зашифровать некие данные. И тут встала проблема. Как известно, в RSA публичный ключ состоит из двух частей: 1) E (рандомное число, которое должно быть взаимопростым с произведением (p-1)*(q-1)) 2) N (N=p*q) И вопрос в том, как мне узнать какая часть 128-байтного ключа N, а какая E? Просто я достал несколько реализаций RSA на срр и во всех нужно использовать не публичный ключ целиком, а как раз E и N по отдельности :\ Как мне их определить по публичному ключу? И последнее, никто не знает наиболее простой реализации RSA под msvc 6.0? Crypto API не предлагать)) Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 10:59 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
nopПросто я достал несколько реализаций RSA на срр и во всех нужно использовать не публичный ключ целиком, а как раз E и N по отдельности :\ Как мне их определить по публичному ключу?а что, в этих реализациях эти е и н не определяются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 11:23 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
nop ...Просто я достал несколько реализаций RSA... Какую библиотеку вы используете и почему? Пробовали OpenSSL, Cryptix, PGP ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 13:21 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
cryptlib не пользовались такой? typedef struct { /* Status information */ int isPublicKey; /* Whether this is a public or private key */ /* Public components */ unsigned char n[ CRYPT_MAX_PKCSIZE ]; /* Modulus */ int nLen; /* Length of modulus in bits */ unsigned char e[ CRYPT_MAX_PKCSIZE ]; /* Public exponent */ int eLen; /* Length of public exponent in bits */ /* Private components */ unsigned char d[ CRYPT_MAX_PKCSIZE ]; /* Private exponent */ int dLen; /* Length of private exponent in bits */ unsigned char p[ CRYPT_MAX_PKCSIZE ]; /* Prime factor 1 */ int pLen; /* Length of prime factor 1 in bits */ unsigned char q[ CRYPT_MAX_PKCSIZE ]; /* Prime factor 2 */ int qLen; /* Length of prime factor 2 in bits */ unsigned char u[ CRYPT_MAX_PKCSIZE ]; /* Mult.inverse of q, mod p */ int uLen; /* Length of private exponent in bits */ unsigned char e1[ CRYPT_MAX_PKCSIZE ]; /* Private exponent 1 (PKCS) */ int e1Len; /* Length of private exponent in bits */ unsigned char e2[ CRYPT_MAX_PKCSIZE ]; /* Private exponent 2 (PKCS) */ int e2Len; /* Length of private exponent in bits */ } CRYPT_PKCINFO_RSA; вот структура с описанием ключей. Как видите, тоже n и e. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 23:20 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
Никто с cryptlib не работал? int main(int argc, char* argv[]) { char *buffer = "hello world!\0"; CRYPT_ALGO_TYPE cryptAlgo = CRYPT_ALGO_RSA; CRYPT_CONTEXT cryptContext; CRYPT_KEYSET cryptKeyset; cryptInit(); cryptCreateContext( &cryptContext, CRYPT_UNUSED, CRYPT_ALGO_RSA ); cryptSetAttributeString( cryptContext, CRYPT_CTXINFO_LABEL,"AAAAAAAAAAAAAA", 14 ); cryptGenerateKey( cryptContext ); printf("buffer: %s\n",buffer); cryptEncrypt( cryptContext, buffer, strlen(buffer) ); printf("buffer: %s\n",buffer); cryptEnd(); return 0; } на экран выводит: buffer: hello world! buffer: hello world! Есть идеи, почему текст не зашифровывается? :\ Что я не так делаю? Ниодна из функций ошибок не возвращает - проверял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2006, 10:11 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
2 nop Откуда вы взяли этот пример? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2006, 13:27 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
эээ да как вам сказать, смотрел исходники "test", который идёт вместе c cryptlib. Там просто тестируются все поддерживаемые протоколы по очереди. И понахватал оттуда. А что в примере что-то неправильно? :\ Вы работали когда-нибудь с cryptlib? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2006, 20:10 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
Я сегодня впервые смотрел на эту библиотечку. Честно говоря, пока выводов никаких. Вам могу предложить, вывести более детальную информацию на экран после вызовов cryptCreateContext, cryptSetAttributeString, cryptGenerateKey . Обратите внимание, все они возвращают код ошибки в виде status и проверяются через предикат cryptStatusOK. Пример из envelope.c: Код: plaintext 1. 2. Повторите эти проверки. Пробуйте, публикуйте протокол работы. Я думаю, что ошибка тривиальна. Скорее всего она - в неверной последовательности операций и.т.п. P.S. Убедитесь, что char - это байт, а strlen() возвращает не нулевое значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2006, 22:05 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
Спасибо за подсказку, я поставил проверки у каждой функции, в итоге сама cryptEncrypt() возвращает ошибку -3. Я посмотрел в заголовках, вот описание ошибок: /* No error in function call */ #define CRYPT_OK 0 /* No error */ /* Error in parameters passed to function */ #define CRYPT_ERROR_PARAM1 -1 /* Bad argument, parameter 1 */ #define CRYPT_ERROR_PARAM2 -2 /* Bad argument, parameter 2 */ #define CRYPT_ERROR_PARAM3 -3 /* Bad argument, parameter 3 */ #define CRYPT_ERROR_PARAM4 -4 /* Bad argument, parameter 4 */ #define CRYPT_ERROR_PARAM5 -5 /* Bad argument, parameter 5 */ #define CRYPT_ERROR_PARAM6 -6 /* Bad argument, parameter 6 */ #define CRYPT_ERROR_PARAM7 -7 /* Bad argument, parameter 7 */ То есть -3 означает, что ошибка в 3-ем аргументе. Там передаётся длина данных, которые хотим зашифровать. Я посмотрел сорсы функции cryptEncrypt, вот что там увидил: C_RET cryptEncrypt( C_IN CRYPT_CONTEXT cryptContext, C_INOUT void C_PTR buffer, C_IN int length ) { static const COMMAND_INFO cmdTemplate = \ { COMMAND_ENCRYPT, COMMAND_FLAG_NONE, 1, 1 }; static const ERRORMAP errorMap[] = \ { ARG_O, ARG_S, ARG_N, ARG_LAST }; COMMAND_INFO cmd; int status; /* Perform basic client-side error checking. In theory we should also check for writeability since the encryption does an in-place update, however when we're hashing data it's valid for the data to be read- only so we only check for readability. In addition when hashing we could be doing a hash-wrapup call so we allow a zero length and only check the buffer if the length is nonzero */ if( !isHandleRangeValid( cryptContext ) ) return( CRYPT_ERROR_PARAM1 ); if( length < 0 ) return( CRYPT_ERROR_PARAM3 ); .............. видите как, но длина то у меня точно положительная. Я даже свои числа пробовал подставлять, пробовал длину в отдельную переменную заносить и её передавать, всё равно эта ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2006, 14:55 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
Всё-таки проверки в cryptEncrypt() я все прохожу: if( !isHandleRangeValid( cryptContext ) ) return( CRYPT_ERROR_PARAM1 ); if( length < 0 ) return( CRYPT_ERROR_PARAM3 ); Ошибка появляется где-то в дебрях cryptlib :\ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2006, 15:33 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
Тут надо почесать репу... Опубликуйте обновленную версию вашего исходника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2006, 16:14 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
int main(int argc, char* argv[]) { char *buffer; int status; CRYPT_ALGO_TYPE cryptAlgo = CRYPT_ALGO_RSA; CRYPT_CONTEXT cryptContext; CRYPT_KEYSET cryptKeyset; cryptInit(); buffer = (char *)malloc(300); memset(buffer,'\x00',300); memcpy(buffer,"hello world!",sizeof("hello world!")); status = cryptCreateContext( &cryptContext, CRYPT_UNUSED, CRYPT_ALGO_RSA ); if(cryptStatusError(status)) { printf( "cryptCreateContext() failed with error code %d.\n", status ); exit(EXIT_FAILURE); } status = cryptSetAttributeString( cryptContext, CRYPT_CTXINFO_LABEL,"AAAAAAAAAAAAAA", 14 ); if(cryptStatusError(status)) { printf( "cryptSetAttributeString() failed with error code %d.\n", status ); exit(EXIT_FAILURE); } status = cryptGenerateKey( cryptContext ); if(cryptStatusError(status)) { printf( "cryptGenerateKey() failed with error code %d.\n", status ); exit(EXIT_FAILURE); } printf("buffer: %s, len: %i\n",buffer, strlen(buffer)); status = cryptEncrypt( cryptContext, buffer, 50); if(cryptStatusError(status)) { printf( "cryptEncrypt() failed with error code %d.\n", status ); exit(EXIT_FAILURE); } printf("buffer: %s\n",buffer); cryptEnd(); return 0; } Ошибку -3 выводит на cryptEncrypt... Хотя всё делаю как также как у них в сорсах, в мануалах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2006, 10:35 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
ОК. Ознакомился. Только щас занят сильно. Посмотрю завтра утром. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2006, 17:58 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
ну что, есть идеи? :\ Может мне действительно какой-нибудь другой либлой воспользоваться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 16:40 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
Как вы компилировали саму библиотеку ? Честно говоря, у меня сейчас под рукой только Борланды, и есть некоторые проблемы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2006, 13:20 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
отлично скомпилилась, даже без варнингов, на старом MSVC 6.0 Могу скинуть в скомпилированном виде, если надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2006, 14:53 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
в общем спасибо за помощь, я решил как нормальный человек заюзать openssl ) Без проблем вставил к себе в программу, без проблем шифрую сообщения, но не могу заюзать свой публичный ключ)) Вы не работали с openssl? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2006, 00:32 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
nopв общем спасибо за помощь, я решил как нормальный человек заюзать openssl ) Без проблем вставил к себе в программу, без проблем шифрую сообщения, но не могу заюзать свой публичный ключ)) Вы не работали с openssl? Прошу прощения, что долго не отвечал. Был сильно загружен. Очень хорошо, что вы выбрали OpenSSL. Она более открыта и шире документирована. С OpenSSL пришлось столкнутся, работая с Оракл. (она входит в комплект). Сильно глубоко ее я не использовал. CryptLib по моему мнению страдает остутствием внимания общественности а так... ничего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2006, 16:02 |
|
||
|
проблемы с RSA
|
|||
|---|---|---|---|
|
#18+
Nop может я не в тему. вот в инструкции к пейпалу по использованию опенссл. если это тот опенссл как у Вас, то надо переконверить затребованный предположительно публичный ключ (API Credential sertificate) в другой формат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2006, 00:57 |
|
||
|
|

start [/forum/topic.php?fid=16&gotonew=1&tid=1346765]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
11ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 237ms |
| total: | 421ms |

| 0 / 0 |
