Предварительно сгенерированные открытые / закрытые ключи 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,

Другие вопросы по тегам