[RUBY] Was ist die Überprüfung der RSA-Signatur und warum?

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

Was ist die Überprüfung der RSA-Signatur und warum?
Was sind Microservices und Microservices Frameworks?
Was ist Java und Entwicklungsumgebung (MAC)
Was ist Cubby?
Was ist null? ]]
Was ist java
Was ist Schlüsselumhang?
Was ist Maven?
Was ist Jackson?
Was ist Jenkins?
Was ist ArgumentMatcher?
Was ist IM-Jonglieren?
Was ist params
Was ist SLF4J?
Was ist Java <>?
Was ist Gradle?
Was ist POJO?
Was ist java
Was ist centOS?
Was ist RubyGem?
Was ist before_action?
Was ist Docker?
Was ist Byte?
Was ist Tomcat?
Überprüfen Sie, ob has_many vorhanden ist und zu optional gehört: Was ist wahr?
[Rails] Was ist der Unterschied zwischen Redirect und Rendering?
[JAVA] Was ist der Unterschied zwischen Schnittstelle und Zusammenfassung? ?? ??
Was ist der Unterschied zwischen Überspringen und Ausstehend? [RSpec]
Was ist Maven Assembly?
Was ist ein Konstruktor?
Was ist vue cli
Was ist eine Schnittstelle?
Was ist Rubys Selbst?
Was ist harte Codierung?
Was ist ein Stream?
Was ist Rubys attr_accessor?
Was ist Java-Kapselung?
Was ist die Erlaubnis verweigert?
Was ist Instanzsteuerung?
Was ist ein Initialisierer?
Was ist Spring Tools 4?
Was ist Objektorientierung?
Was ist Guavas @VisibleForTesting?
Was ist ein MVC-Modell?
Was ist eine Anmerkung?
Was ist Java-Technologie?
Was ist Java API-Java?
Was ist @ (Instanzvariable)?
Was ist Gradles Artefakt?
Was ist JPA-Prüfung?
Warum PreventDefault benötigt wird
[Java] Was ist flatMap?
Was ist ein Servlet?
Was ist Webentwicklung?