[RUBY] Qu'est-ce que la vérification de signature RSA et pourquoi?

Cet article est comme un rappel que je me suis demandé comment la vérification de la signature RSA serait effectuée à l'aide de la bibliothèque OpenSSL de Ruby et que j'ai écrit le code. Il ne s'agit pas d'une explication détaillée du cryptage à clé publique ou du cryptage RSA.

Le fait de signer la méthode de chiffrement à clé publique semble être que le message est chiffré avec la clé privée. (Il y a aussi une histoire selon laquelle il est correct de ** déchiffrer ** le message avec la clé privée lors de la signature avec le chiffrement RSA. C'est ce que le créateur de RSA a dit.) Ici, la signature est vérifiée par ** décryptage ** (public_decrypt) avec la clé publique, donc la signature est définie comme ** cryptée ** avec la clé privée.

Maintenant, créons une signature et vérifions la signature à l'aide de Ruby.

require 'openssl'

#Créer une clé
rsa = OpenSSL::PKey::RSA.generate 2048

#message
M = "Signer la confirmation de la procédure de vérification"

#Spécification de la fonction de hachage
digest = OpenSSL::Digest::SHA256.new

#Signature
sig = rsa.sign(digest, M)
=> "#I\xE1\xE9\xE3\x95\xCE\xE2U\x8EwU\xF49a\f\xE7\x11\xF5\xC5|H\xF0\xB1\x9Ct\xE5\xB3\x93Tj\xD2\xFC,\x0F1+\xB9\x88p\xEEe\x99#\xCC\xB3\x81\x98U\x01Uc\xC3*\x92\v\xD3(\xE9~&@{\xA1S\x83\v\x83\xFF\xDF\xB8\x82r\xC8\x85|\xC1^\x9F>\xDAc\x17\x9A\xEB\xA8\x1E\xA8\xA4v\xC0\xA3\x98f\xFF\x87^\xFB9#\x98l\xE1\xA9\xB5g-\a\xC3\xAD\x17&\x8C\x84\xAD\x06\xB7\x04c\xA9\xB4{w\x15\xDB\f\xCFQ\x91\xF8t\x16\x8A\x8A\xBC\xB2\xC5H\xD1\xC8p}\xC7\xD6\a\x0F'm\xDB\tT\xDF4\xAAv\xF1\xD4\x14\x86\xD0\x82?\xA6\xB8\xC8\x91\xA8Su\x81Yc9\x83\x94$\x96I\xC9%\xE3\x82\xD6\xB6j\xD1\xB9\xDB\xE0\xD80=v\xBD\n\xDC\xFB:\xC9\x01\xA6\xF3\xC2\xBAT\xAE\x98\xE7B\x10\xE7$\x12_\xEC\x1Ar\x86B\xDEC<:nfV\x12z\xC8%Ng\xF0\xCF\xAA\xD2\x94\xC1\xC0\x1C\x9D,>\xF7+\x83s\xCBX)!\x90)W\xF0\xEA"

#Vérification des signes
rsa.verify(digest, sig, M)

La signature a été créée et vérifiée ci-dessus.

・ ・ ・ ・ ・ ・

Qu'est-ce que la vérification? J'ai pensé.

J'ai fait référence à cet article et à l'image du blog dans l'article.

Vérification des signes

Si vous suivez la procédure, il semble que vous puissiez vérifier la signature avec Ruby's OpenSSL. (En fait, je pense que nous devons faire plus de traitement comme l'article de référence.)

Expérimentons réellement avec le code.

#Décrypter la signature
decrypted = rsa.public_decrypt(sig)
=> "010\r\x06\t`\x86H\x01e\x03\x04\x02\x01\x05\x00\x04 Un\x1A\x02^\xDE\x11Q\x9C~\xD3c\xE7H}6\x88\xAF\x1E\xC5\xAC7#\xB6\xC4@\"_]\xB9W\x10"

#Puisqu'il s'agit d'une clé de 2048 bits, elle prend 32 octets
m_hash = decrypted[-32, 32]
=> "Un\x1A\x02^\xDE\x11Q\x9C~\xD3c\xE7H}6\x88\xAF\x1E\xC5\xAC7#\xB6\xC4@\"_]\xB9W\x10"

#Valeur de hachage du message
digest.digest(M)
=> "Un\x1A\x02^\xDE\x11Q\x9C~\xD3c\xE7H}6\x88\xAF\x1E\xC5\xAC7#\xB6\xC4@\"_]\xB9W\x10"

m_hash == digest.digest(M)
=> true

La signature déchiffrée et le message haché correspondaient. La vérification a réussi.

Vérifions également le modèle d'échec de vérification.

m_hash == digest.digest("La vérification échouera")
=> false

Il a échoué comme prévu.

Il semble que ce type de traitement soit effectué lors de la vérification de la signature «verify».

J'espère que cela sera utile pour ceux qui ont les mêmes questions que moi.

Ceux qui sont forts dans ce domaine sont invités à signaler et à demander des corrections.

Recommended Posts

Qu'est-ce que la vérification de signature RSA et pourquoi?
Qu'est-ce que les microservices et les frameworks de microservices
Qu'est-ce que Java et l'environnement de développement (MAC)
Qu'est-ce que Cubby
Qu'est-ce qui est nul? ]
Qu'est-ce que 'java
Qu'est-ce que Keycloak
Qu'est-ce que maven?
Qu'est-ce que Jackson?
Qu'est-ce que Jenkins
Qu'est-ce que ArgumentMatcher?
Qu'est-ce que IM-Juggling?
Qu'est-ce que les paramètres
Qu'est-ce que SLF4J?
Qu'est-ce que Java <>?
Qu'est-ce que Gradle?
Qu'est-ce que POJO
Qu'est-ce que 'java
Qu'est-ce que centOS
Qu'est-ce que RubyGem?
Qu'est-ce que before_action?
Qu'est-ce que Docker
Qu'est-ce que Byte?
Qu'est-ce que Tomcat
Vérifiez l'existence de has_many et appartient_to-optional: Qu'est-ce qui est vrai?
[Rails] Quelle est la différence entre la redirection et le rendu?
[JAVA] Quelle est la différence entre interface et abstract? ?? ??
Quelle est la différence entre ignorer et en attente? [RSpec]
Qu'est-ce que l'assemblage Maven?
Qu'est-ce qu'un constructeur
Qu'est-ce que vue cli
Qu'est-ce qu'une interface
Qu'est-ce que le moi de Ruby?
Qu'est-ce que le codage en dur?
Qu'est-ce qu'un flux
Qu'est-ce que l'attr_accessor de Ruby?
Qu'est-ce que l'encapsulation Java?
Qu'est-ce qu'une permission refusée?
Qu'est-ce que le contrôle d'instance?
Qu'est-ce qu'un initialiseur?
Qu'est-ce que Spring Tools 4
Qu'est-ce que l'orientation objet?
Qu'est-ce que le @VisibleForTesting de Guava?
Qu'est-ce qu'un modèle MVC?
Qu'est-ce qu'une annotation?
Qu'est-ce que la technologie Java?
Qu'est-ce que Java API-java
Qu'est-ce que @ (variable d'instance)?
Qu'est-ce que l'artefact de Gradle?
Qu'est-ce que l'audit JPA?
Pourquoi preventDefault est nécessaire
[Java] Qu'est-ce que flatMap?
Qu'est-ce qu'un servlet?
Qu'est-ce que le développement Web?