web-dev-qa-db-fra.com

SHA256withRSA que fait-il et dans quel ordre?

Je suis un débutant total en ce qui concerne la cryptographie et ce genre de choses. Je ne connais pas (et je ne veux pas) les détails du SHA256 et du RSA. Je "sais" ce qu'ils font, pas comment ils le font, et pour l'instant c'est suffisant.

Je me demande ce que l'algorithme "SHA256withRSA" (si vous pouvez l'appeler ainsi) fait réellement et dans quel ordre. Par exemple, hache-t-il les données avec SHA256 puis les chiffre-t-il à l'aide de RSA ou vice-versa, ou autre chose?

La raison pour laquelle je demande, c'est parce que je veux faire l'équivalent Java:

Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey); //privateKey == a key extracted from a .p12 file

dans Objective-C sur iOS. Et je n'arrivais pas à trouver quelque chose qui fasse exactement cela, donc je demande, puis-je simplement hacher les données (SHA256) puis les chiffrer (RSA) (ou vice-versa) et obtenir le même comportement?

Quelle est la solution suggérée pour faire ce genre de chose?

Je vous remercie!

EDIT: J'ai omis de mentionner que je signe les données en utilisant une clé privée obtenue en faisant:

KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(new FileInputStream(new File(filename)), password.toCharArray());
PrivateKey privateKey = (PrivateKey)keystore.getKey(alias, password.toCharArray());

Où le nom de fichier est par exemple: "/somewhere/mykey.p12".

19
Whyser

"SHA256withRSA" implémente le remplissage PKCS # 1 v1.5 et l'exponentiation modulaire avec le nom formel RSASSA-PKCS1-v1_5 après avoir calculé le hachage sur les données à l'aide de SHA256.

Donc, l'ordre général est:

  1. hachage;
  2. remplissage du hachage pour la génération de signature;
  3. exponentiation modulaire utilisant l'exposant privé et le module.

Le rembourrage utilisé pour le cryptage et la génération de signature est différent, donc l'utilisation du cryptage peut entraîner des signatures erronées.


Le schéma de remplissage PKCS # 1 v1.5 a été remplacé par PSS. Pour les nouveaux protocoles, il est conseillé d'utiliser à la place le schéma PSS. Pour RSA, il existe une norme publique très lisible. Cette norme a également été utilisée comme base pour RFC 3447: Normes de cryptographie à clé publique (PKCS) # 1: Spécifications de cryptographie RSA version 2.1 (qui est essentiellement une copie).


En ce qui concerne le rembourrage dans iOS, veuillez vérifier cette réponse par Thomas Pornin. Fondamentalement, vous devez créer le hachage SHA-256, préfixer un bloc de données statique (défini dans les spécifications PKCS # 1), puis utiliser SecKeyRawSign en utilisant kSecPaddingPKCS1.

Pour votre commodité, le bloc de données défini PKCS # 1 qui doit être préfixé en notation hexadécimale pour SHA-256 (il peut être un peu difficile à trouver dans les documents standard, c'est dans les notes de section 9.2 =):

30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20

Remarques:

  • Les étapes ci-dessus n'incluent pas la conversion d'octets en entier et vice versa. Le résultat des opérations RSA brutes est généralement converti en un codage big endian non signé avec la même taille du module en octets (qui est généralement la même que la taille de clé, car la taille de clé est déjà un multiple de 8). Ces conversions sont appelées I2OSP et OS2IP dans les RFC.
18
Maarten Bodewes