2017-01-20 1 views
-1

на Java стороне:RSA шифруется на Java, не может расшифровать на C++ с помощью OpenSSL API

  • использования BouncyCastle, чтобы получить пару ключей, PrivateKey и ОткрытыйКлюч

  • шифровать Orig Сообщение1 с PrivateKey, чтобы получить зашифрованного message2

  • расшифровывать зашифрованы message2 с ОткрытыйКлюч нормально, успех, чтобы получить тот же Orig Сообщение1

на C++ стороне:

  • на основе OpenSSL, "RSA_public_decrypt" и "RSA_private_encrypt" API

  • использовать один и тот же PublicKey (который генерируется на стороне Java), чтобы decryt в message2, возвращают буфер с каждым байтом, заполненным 0, и RSA_public_decrypt возвращают успех.

дополнительно:

  • на C++ стороны, если использовать PrivateKey для шифрования Orig Сообщение1, чтобы получить зашифрованный message3, а затем расшифровать его с помощью открытого ключа, успех, чтобы получить Сообщение1. но сообщение 3 не совпадает с зашифрованным сообщением2 (сторона java).

  • все выше используется RSA_NO_PADDING

  • на стороне Java, encryted несколько раз, получить ту же message2

  • на C++ стороны, шифруется несколько раз, получить то же message3 тоже. но сообщение2 не одинаково к сообщению3.

вопрос заключается в том, чтобы расшифровать на C++ сторону, чтобы получить ориг message1 которым шифруется на стороне Java?

спасибо!

+0

Java использует по умолчанию RSA/ЕЦБ/PKCS1Padding ... см пост: RSA/ECB/PKCS1Padding –

+0

К сожалению, пост: http://stackoverflow.com/questions/21066902/default-rsa-padding -in-sun-jce-oracle-jce ... Итак, при расшифровке в C++ используйте эту схему дополнений –

+0

Наверняка вы не ожидаете, что мы угадаем, что не так с вашим кодом. Отправьте свой код. Также см. [Как создать минимальный, полный и проверенный пример] (https://stackoverflow.com/help/mcve). – jww

ответ

0
it works ok, thanks for all the reply! 
here is the c code(use public key to decrypt with openssl api): 

#include <stdio.h> 
#include <openssl/pem.h> 
#include <openssl/rsa.h> 

RSA* createRSA(unsigned char * key) { 
    RSA *rsa = NULL; 
    BIO *keybio = NULL; 
    keybio = BIO_new_mem_buf(key, -1); 
    if (keybio == NULL) { 
     return 0; 
    } 
    return PEM_read_bio_RSA_PUBKEY(keybio, &rsa, NULL, NULL); 
} 

int main() { 
    char encrypted_data[] = {0x62,0xe2,0xe6,0xfd,0xca,0x69,0x39,0x2f,0x0f,0x07,0x3c,0x27,0xd7,0x49,0x2c,0xd6,0x6e,0xec,0xa0,0xdd,0x7c,0xa9,0xce,0x0a,0xad,0x4a,0x68,0xa2,0x2c,0x99,0xec,0xe9,0xa0,0x3c,0x72,0x66,0xf9,0xb1,0x59,0x11,0x7e,0x64,0x87,0x22,0xa7,0x4a,0x66,0xe2,0x8b,0x51,0xa5,0x6a,0x93,0x92,0x3f,0x57,0xae,0xea,0xfa,0xe7,0x6b,0x1b,0xae,0x8f}; 
    char publicKey[]="-----BEGIN PUBLIC KEY-----\n"\ 
        "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJVdq5JlvtxJT4CqwEceW4M4AKFbDmJE\n"\ 
        "H2K0a4aXmeHqedlsQgRePVCDgiiCC7kr1DEkP3+9uOUHDUtvIIoE4VsCAwEAAQ==\n"\ 
        "-----END PUBLIC KEY-----\n"; 
    unsigned char decrypted[1024]= {0}; 
    int decrypted_length = RSA_public_decrypt(sizeof(encrypted_data), encrypted_data, decrypted, createRSA(publicKey), RSA_NO_PADDING); 
    if(decrypted_length == -1) { 
     return -1; 
    } 
    printf("decrypted by openssl:\n"); 
    for(int i=0; i<decrypted_length; i++) { 
     printf("%02x ",(unsigned char)decrypted[i]); 
    } 
    printf("\n"); 
} 
Смежные вопросы