Dieser Artikel erinnert mich daran, dass ich mich gefragt habe, wie die Überprüfung der RSA-Signatur mithilfe der OpenSSL-Bibliothek von Ruby durchgeführt werden soll, und habe den Code geschrieben. Es ist keine detaillierte Erklärung der Verschlüsselung mit öffentlichem Schlüssel oder der RSA-Verschlüsselung.
Das Signieren der Verschlüsselungsmethode mit öffentlichem Schlüssel scheint darin zu bestehen, dass die Nachricht mit dem privaten Schlüssel verschlüsselt wird. (Es gibt auch eine Geschichte, dass es richtig ist, die Nachricht mit dem privaten Schlüssel beim Signieren mit RSA-Verschlüsselung zu entschlüsseln. Das hat der Ersteller von RSA gesagt.) Hier wird die Signatur durch ** Entschlüsseln ** (public_decrypt) mit dem öffentlichen Schlüssel überprüft, sodass die Signatur als ** mit dem privaten Schlüssel verschlüsselt ** definiert wird.
Jetzt erstellen wir eine Signatur und überprüfen die Signatur mit Ruby.
require 'openssl'
#Schlüssel erstellen
rsa = OpenSSL::PKey::RSA.generate 2048
#Botschaft
M = "Bestätigung des Bestätigungsverfahrens unterschreiben"
#Hash-Funktionsspezifikation
digest = OpenSSL::Digest::SHA256.new
#Unterzeichnung
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"
#Zeichenüberprüfung
rsa.verify(digest, sig, M)
Die Signatur wurde oben erstellt und überprüft.
・ ・ ・ ・ ・ ・
Was um alles in der Welt ist Verifikation? Ich dachte.
Ich habe auf [diesen Artikel und das Bild des Blogs im Artikel] verwiesen (https://qiita.com/bobunderson/items/d48f89e2b3e6ad9f9c4c).
Zeichenüberprüfung
Wenn Sie dem Verfahren folgen, können Sie die Signatur anscheinend mit Rubys OpenSSL überprüfen. (Eigentlich denke ich, wir müssen mehr verarbeiten als im Referenzartikel.)
Lassen Sie uns tatsächlich mit dem Code experimentieren.
#Signatur entschlüsseln
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"
#Da es sich um einen 2048-Bit-Schlüssel handelt, werden 32 Bytes benötigt
m_hash = decrypted[-32, 32]
=> "Un\x1A\x02^\xDE\x11Q\x9C~\xD3c\xE7H}6\x88\xAF\x1E\xC5\xAC7#\xB6\xC4@\"_]\xB9W\x10"
#Nachrichten-Hash-Wert
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
Die entschlüsselte Signatur und die Hash-Nachricht stimmten überein. Die Überprüfung war erfolgreich.
Überprüfen wir auch das Überprüfungsfehlermuster.
m_hash == digest.digest("Die Überprüfung schlägt fehl")
=> false
Es ist wie erwartet fehlgeschlagen.
Es scheint, dass diese Art der Verarbeitung in der Signaturüberprüfung "verify" erfolgt.
Ich hoffe, es ist hilfreich für diejenigen, die die gleichen Fragen wie ich haben.
Diejenigen, die in diesem Bereich stark sind, können gerne darauf hinweisen und Korrekturen anfordern.
Recommended Posts