на стороне Java:
используйте bouncycastle для получения пары ключей, privateKey и publicKey
зашифруйте оригинальное сообщение1 с помощью privateKey, чтобы получить зашифрованное сообщение2
расшифруйте зашифрованное сообщение2 с помощью publicKey — все в порядке, успех, чтобы получить то же оригинальное сообщение1
на стороне c ++:
основанный на openssl, API «RSA_public_decrypt» и «RSA_private_encrypt»
используйте тот же publicKey (который был сгенерирован на стороне java) для расшифровки сообщения2, возврата буфера с каждым заполненным байтом 0 и возврата RSA_public_decrypt.
к тому же:
на стороне c ++, если использовать privateKey для шифрования сообщения источника orig1, чтобы получить зашифрованное сообщение3, а затем расшифровать его с помощью открытого ключа, то получится сообщение message1. но сообщение 3 не совпадает с зашифрованным сообщением 2 (сторона Java).
все вышеперечисленное использовали RSA_NO_PADDING
на стороне Java, зашифрованные больше раз, получить то же сообщение2
на стороне c ++, зашифрованные несколько раз, тоже получите такое же сообщение3. но message2 не совпадает с message3.
вопрос в том, как расшифровать на стороне c ++, чтобы получить сообщение orig1, которое зашифровано на стороне java?
Спасибо!
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");
}
Других решений пока нет …