Eine Geschichte, die mir sehr gut gefallen hat, als ich mit Ruby Triple DES gemacht habe

Was du machen willst

Wenn Sie die im CBC-Modus von TripleDES verschlüsselten Daten an den anderen Server anfordern, werden die Daten auf die gleiche Weise beantwortet. Entschlüsseln Sie sie daher.

Ich war also völlig unwissend über dieses TripleDES. Als ich es googelte, war es schwierig, unerwartete Informationen in Ruby-Artikeln zu finden. Ich habe verschieden gesucht und bin auf diese Seite gekommen. http://timolshansky.com/2011/10/23/ruby-triple-des-encryption.html

In der Tat funktioniert es, wenn ich den hier geschriebenen Code ausführe. Es war jedoch eine lange Zeit von hier.

Das Anfordern an den anderen Authentifizierungsserver funktioniert nicht

Unabhängig davon, wie oft Sie andere Parameter mit dem erhaltenen Schlüssel überprüfen, treten keine Fehler auf. Gununu ...

Ich schäme mich, Ihnen den Code (eine andere Sprache) zu zeigen, den die andere Partei für die Verschlüsselung verwendet ... Oh? Am Anfang des verschlüsselten Bytes hängt etwas, oder?

Ein weiterer Schlüssel namens Initialisierungsvektor

Tatsächlich wird bei dieser Verschlüsselungsmethode (des-ede3-cbc) zusätzlich zum privaten Schlüssel der ** Initialisierungsvektor ** wie ein echter Schlüssel für die Verschlüsselung verwendet. Ich habe lange gebraucht, um das zu bemerken. Der Grund dafür ist, dass die in ↑ aufgelisteten Seiten und andere umlaufende Seiten eine Methode namens 'pkcs5_keyivgen' verwenden. Der Punkt ist, eine Instanz zu erstellen-> den Schlüssel und den Initialisierungsvektor mit pkcs5_keyivgen-> zu verschlüsseln und zu entschlüsseln, aber dies bedeutet, dass der gleiche Initialisierungsvektor verwendet wird. So kann es entschlüsselt werden.

Die Bedingung ist diesmal jedoch ** Verschlüsselung zur Hand-> Entschlüsselung auf dem Server der anderen Partei, sodass die andere Partei nicht nur den privaten Schlüssel, sondern auch die Informationen zum Initialisierungsvektor ** kennen muss. (Ist es eine TripleDES-Spezifikation, einen Initialisierungsvektor am Anfang zu setzen? Ich habe das nicht verstanden, selbst wenn ich es gegoogelt habe)

Implementierung

Also, hier ist, was ich tatsächlich versucht habe. Diesmal sind die ersten 8 Bytes der Initialisierungsvektor.

class TripleDES
  class << self
    IV_LENGTH = 8
    SECRET_KEY = 'your__awesome_Secret_Key'

    def get_cipher
      cipher = OpenSSL::Cipher.new('des-ede3-cbc')
      cipher.key = SECRET_KEY
      cipher
    end

    def encrypt(plain_string)
      cipher = get_cipher
      cipher.encrypt

      #Initialisierungsvektor generieren
      iv = OpenSSL::PKCS5.pbkdf2_hmac(SecureRandom.alphanumeric(10), SecureRandom.alphanumeric(10), 2, IV_LENGTH, 'sha1')
      cipher.iv = iv

      output = cipher.update(plain_string)
      output << cipher.final

      #Setzen Sie einen Initialisierungsvektor vor den generierten Code
      iv + output
    end

    def decrypt(encrypted_byte_string)
      cipher = get_cipher
      cipher.decrypt

      #Extrahieren Sie den Initialisierungsvektor bzw. den Text
      iv = encrypted_byte_string.byteslice(0, IV_LENGTH)
      cipher.iv = iv
      target_bytes = encrypted_byte_string.byteslice(IV_LENGTH, encrypted_byte_string.chars.count)

      output = cipher.update(target_bytes)
      output << cipher.final
    end
  end
end

Beiseite

Ich habe eine Weile nicht bemerkt, dass pkcs5_keyivgen eine veraltete Methode richtig geschrieben hat. Lol https://docs.ruby-lang.org/ja/latest/method/OpenSSL=3a=3aCipher/i/pkcs5_keyivgen.html

Dies ist detaillierter. Das ist richtig, pkcs5_keyivgen kann nicht iv bekommen. https://techmedia-think.hatenablog.com/entry/20110527/1306499951

Ich hoffe, es wird ein Hinweis für diejenigen sein, die es in Zukunft implementieren werden. Ich war nach langer Zeit süchtig danach ...

Recommended Posts

Eine Geschichte, die mir sehr gut gefallen hat, als ich mit Ruby Triple DES gemacht habe
Nachdem ich das Montyhall-Problem mit Ruby überprüft hatte, war es eine Geschichte, die ich gut verstehen konnte und die ich nicht gut verstand
Beachten Sie, dass ich süchtig nach Stapelverarbeitung mit Spring Boot war
Eine Geschichte, nach der ich süchtig war, als ich einen Schlüssel bekam, der automatisch auf MyBatis ausprobiert wurde
Java: Eine Geschichte, in der ich mich unwohl fühlte, als mir beigebracht wurde, Strings ohne Grund mit Gleichen zu vergleichen.
Eine Geschichte, die ich mit Java nur schwer herausfordern konnte
Eine Geschichte, der ich mit der automatischen Starteinstellung von Tomcat 8 unter CentOS 8 zweimal verfallen war
Ich habe mit Ruby einen riskanten Würfel gemacht
Zusammenfassung von Ruby Silver für einen Monat bestanden
Studieren bei CodeWar (Ruby) ④ case ~ when
Machen Sie ein Tippspiel mit Ruby
Hinweise zur HTTP-Kommunikation mit Java (OkHttp)
Ich habe mit Ruby einen riskanten Würfel gemacht
Eine Geschichte, die mir sehr gut gefallen hat, als ich mit Ruby Triple DES gemacht habe
Bei der Einführung von JOOQ in Spring Boot wurde eine Geschichte behandelt, die behandelt wurde, weil bei Liquidbase ein Fehler aufgetreten ist
4 technische Bücher, die ich leider als Neuling hätte lesen müssen
Ich habe mit Ruby On Rails ein Portfolio erstellt
Wovon ich süchtig war, als ich eine Spring Boot-Anwendung mit VS Code entwickelte
[Zusammenfassung] Was ich bemerkt und getan habe, als mir gesagt wurde, dass das Oracle JDK bezahlt wurde
Eine Seite, die leicht zu verstehen war, als ich anfing, Spring Boot zu lernen
Die Geschichte, Sprint-Boot mit Kubernetes (GKE) auszuführen und keine Verbindung zu CloudSQL herzustellen
[Ruby] Ich habe einen Crawler mit Anemone und Nokogiri gemacht.
[Ruby] Missverständnis, dass ich das Modul verwendet habe [Anfänger]
Ein problematischer Hinweis beim Versuch, nginx mit Remote-Containern von vscode zu verwenden
Wie man Arrays mit Java stapelweise initialisiert, wusste ich als Anfänger nicht
Eine Geschichte, die eine Pause einlegte, wenn sie Linked List mit einem leichten Gefühl benutzte
Eine Geschichte, die mich während des Komponententests von der impliziten Typkonvertierung von ActiveRecord abhängig machte
Eine Geschichte, die Turbolinks durch schlechte Dinge verwirrt wurde
Eine Geschichte, von der ich dachte, ich hätte mein Leben nicht weggeworfen
Ich habe mit Gem in Ruby nach einem Webframework gesucht
Ich habe einen MOD erstellt, der sofort ein Fahrzeug mit Minecraft anruft
Die Geschichte, nach der ich beim Einrichten von STS süchtig war
Als ich mit MPAndroidChart ein Balkendiagramm erstellt habe, war die Beschriftung der x-Achse aus irgendeinem Grund falsch ausgerichtet
Als ich versuchte, ein Composer-Update im Docker-Container durchzuführen, wurde ich wütend auf proc_open (): fork failed