Предварительно сгенерированные открытые / закрытые ключи RSA, невозможно расшифровать в C (работает на python)
Я сгенерировал пару открытых / закрытых ключей с openssl
:
openssl genrsa -out private.pem 1024
openssl pkcs8 -topk8 -in private.pem -outform DER -out private.der -nocrypt
openssl rsa -in private.pem -pubout -outform DER -out public.der
Теперь после этого я создал тестовый код с Python, который шифровал и расшифровывал строки. Я взял пример прямо с PyCrypto
документация, шифрование:
string_to_encrypt = str(raw_input("Enter a string to encrypt: "))
print "Encrypting: %s" % string_to_encrypt
key = RSA.importKey(open('./public.der').read())
cipher = PKCS1_OAEP.new(key)
ciphertext = cipher.encrypt(string_to_encrypt)
и расшифровывать:
dec_key = RSA.importKey(open('./private.der').read())
d_cipher = PKCS1_OAEP.new(dec_key)
dec_message = d_cipher.decrypt(ciphertext)
Теперь это работает, как ожидалось, и затем я хотел попробовать расшифровать то же самое с помощью C
, Я передаю данные через socket
в приложение C.. но теперь я не могу вернуть сообщение в виде обычного текста, даже несмотря на то, что расшифровка не приводит к ошибкам.
Прежде чем пытаться расшифровать текст, я распечатываю данные на экран, и байты совпадают на обоих концах. Функция получения выглядит следующим образом:
char* decrypt_packet(char* encrypted_buffer, int size) {
FILE *keyfile = fopen("./private.pem", "r");
RSA *rsa_pri = PEM_read_RSAPrivateKey (keyfile, NULL, NULL, NULL);
int rsa_private_len = RSA_size(rsa_pri);
for(i; i < size;i++)
printf("%02x:",(unsigned char)encrypted_buffer[i]);
printf("\n");
char * decrypt = (char*)malloc(rsa_private_len+1);
memset(decrypt,0,rsa_private_len+1); //Zero the buffer for printing
int res = RSA_private_decrypt(rsa_private_len, (unsigned char*)encrypted_buffer, (unsigned char*)decrypt, rsa_pri , RSA_NO_PADDING);
if(res == -1) {
ERR_load_crypto_strings();
printf("ERROR: %s\n",ERR_error_string(ERR_get_error(),NULL));
}
printf("size decrypt: %i\n", res);
printf("decrypted: %s\n", decrypt);
....
Расшифровка не дает сбоя, но выводом является мусор (здесь посылается только тестовая строка "hello world"):
received buffer:
82:9d:a7:f7:3c:d6:71:12:01:31:ba:c6:a2:90:94:90:fd:69:d3:fe:14:11:2f:af:a9:8a:25:99:55:d2:84:1f:dc:e3:5e:a9:be:7b:8a:ac:cd:38:76:a2:91:ec:24:da:06:c7:8d:67:c8:15:19:73:c8:57:ce:a5:87:f0:da:db:c2:6d:5b:55:a3:ba:7e:7d:ca:6b:02:23:fd:fe:cb:b4:04:53:e2:74:c3:91:77:ee:5f:7a:61:7a:87:a6:42:37:28:c6:9c:cb:6a:46:f4:c0:bd:fe:8a:92:da:86:53:3b:5c:e2:e3:79:81:2c:32:28:9c:4c:be:0a:fa:75:7b:b2:
size decrypt: 128
decrypted: dÕf`5åiõuy<òáµÛ~G=/
Ä
Я решил использовать RSA_NO_PADDING
? Я понятия не имею, действительно ли это правильно.
Но если я использую что-то еще, функция расшифровки жалуется: RSA_padding_check_PKCS1_type_2:block type is not 02
или же RSA_padding_check_PKCS1_OAEP:oaep decoding error
Я правильно звоню RSA_private_decrypt
функция? Может быть проблема в том, что я читаю private.pem
файл в C (в Python я читал .der
файл)?
Еще одна вещь пришла на ум. Я использовал по умолчанию openssl
из Ubuntu для генерации ключей, но мое приложение на C я связываю с загруженным и скомпилированным источником. Makefile
содержит:
SOURCE_FILES = main.c client_handler.c
CC=gcc
$(CC) $(SOURCE_FILES) -o client_control_srv -lpthread -lssl -lcrypto -I/home/jlumme/openssl-1.0.1f_x86/include
Спасибо за любые советы!
1 ответ
Похоже, моя генерация ключей была испорчена.
Я восстановил ключи:
openssl genrsa -out mykey_priv.pem 1024
openssl rsa -in mykey_priv.pem -out mykey_publ.der -outform DER -pubout
и теперь он работает с тем же кодом. Как указывал CBHacking, мне также нужно было установить отступ RSA_PKCS1_OAEP_PADDING
,