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