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.
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?
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)
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
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