RSA_private_encrypt échoue toujours

J’apprends à utiliser la bibliothèque OpenSSL dans mon programme. Ici, dans le code, je génère une clé privée et immédiatement je crypte un message en utilisant cette clé. Mais toujours ça échoue. Aidez-moi gentiment.

private_key = RSA_generate_key(RSA_KEY_LENGTH, RSA_3, NULL, NULL); if (RSA_check_key(private_key) < 1) { printf("generate_key: key generation failed\n"); exit(-1); } unsigned char msg[25]; unsigned char cipher[128]; strcpy((char*)msg, "hello"); int ret = RSA_private_encrypt(25, msg, cipher, private_key, RSA_PKCS1_OAEP_PADDING); if (ret < 0) { printf("encryption in key generation failed\n"); printf ("%s\n", ERR_error_string (ERR_get_error (), (char *) cipher)); exit (-1); } 

Cela échoue toujours et c’est l’erreur que j’obtiens avec ERR_error_ssortingng.

 error:04066076:lib(4):func(102):reason(118) 

erreur: 04066076: lib (4): func (102): raison (118)

Vous pouvez utiliser errstr d’OpenSSL pour vous donner des messages d’erreur significatifs (dans la plupart des cas):

 $ openssl errstr 0x04066076 error:04066076:rsa routines:RSA_EAY_PRIVATE_ENCRYPT:unknown padding type 

Même si vous avez restreint le RSA_PKCS1_OAEP_PADDING à RSA_PKCS1_OAEP_PADDING / RSA_PKCS1_PADDING , vous devez toujours utiliser RSA_PKCS1_OAEP_PADDING avec le cryptage RSA. Votre prochaine tâche consiste donc à déterminer ce qui ne va pas avec votre code.

Voici une bonne entrée de blog expliquant pourquoi vous devriez éviter le rembourrage PKCS 1.5 pour le cryptage RSA: Deux mauvaises années pour l’indussortinge des jetons cryptographiques .

Voir la documentation:

man RSA_private_encrypt

 RSA_private_encrypt() signs the flen bytes at from (usually a message digest with an algorithm identifier) using the private key rsa and stores the signature in to. to must point to RSA_size(rsa) bytes of memory. padding denotes one of the following modes: RSA_PKCS1_PADDING PKCS #1 v1.5 padding. This function does not handle the algorithmIdentifier specified in PKCS #1. When generating or verifying PKCS #1 signatures, RSA_sign(3) and RSA_verify(3) should be used. RSA_NO_PADDING Raw RSA signature. This mode should only be used to implement cryptographically sound padding modes in the application code. Signing user data directly with RSA is insecure. 

Je ne sais pas d’où vous venez RSA_PKCS1_OAEP_PADDING, mais les seuls rembourrages pris en charge sont répertoriés ci-dessus.

J’ai trouvé la raison de ce problème. En fait, la méthode de remplissage RSA_PKCS1_OAEP_PADDING ne fonctionne pas pour moi dans mes machines centos et ubuntu. Une fois que je l’ai changé en RSA_PKCS1_PADDING, cela a bien fonctionné. Mais je ne sais pas pourquoi cela se produit.