Si vous demandez les données cryptées en mode CBC de tripleDES à l'autre serveur, les données seront répondues de la même manière, donc décryptez-les.
Donc, j'étais complètement ignorant de ce tripleDES, donc quand je l'ai cherché sur Google, il était difficile de trouver des informations inattendues dans les articles Ruby. J'ai cherché diversement et suis arrivé à cette page. http://timolshansky.com/2011/10/23/ruby-triple-des-encryption.html
En fait, lorsque j'exécute le code écrit ici, cela fonctionne. Cependant, il était loin d'ici.
Peu importe le nombre de fois que vous vérifiez d'autres paramètres à l'aide de la clé que vous avez reçue, il n'y aura pas d'erreur. Gununu ...
J'ai honte de vous montrer le code (une autre langue) que l'autre partie utilise pour le chiffrement ... Oh? Quelque chose est attaché au début de l'octet chiffré, non?
En fait, dans cette méthode de chiffrement (des-ede3-cbc), en plus de la clé privée, ** vecteur d'initialisation ** est utilisé comme une vraie clé de chiffrement. Il m'a fallu du temps pour le remarquer. La raison en est que les pages listées dans ↑ et les autres pages qui circulent utilisent une méthode appelée «pkcs5_keyivgen». Le but est de créer une instance-> définir la clé et le vecteur d'initialisation avec pkcs5_keyivgen-> crypter et décrypter, mais cela signifie que le même vecteur d'initialisation est utilisé. Ainsi, il peut être décrypté.
Cependant, la condition cette fois est ** cryptage à portée de main -> décryptage sur le serveur de l'autre partie, donc l'autre partie doit connaître non seulement la clé privée mais aussi les informations du vecteur d'initialisation **. (Est-ce une spécification tripleDES pour mettre un vecteur d'initialisation au début? Je n'ai pas compris cela même si je l'ai googlé)
Alors, voici ce que j'ai réellement essayé. Cette fois, les 8 premiers octets sont le vecteur d'initialisation.
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
#Générer un vecteur d'initialisation
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
#Mettre un vecteur d'initialisation avant le code généré
iv + output
end
def decrypt(encrypted_byte_string)
cipher = get_cipher
cipher.decrypt
#Extraire respectivement le vecteur d'initialisation et le texte
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
Je n'ai pas remarqué pendant un moment que pkcs5_keyivgen avait correctement écrit une méthode obsolète. Lol https://docs.ruby-lang.org/ja/latest/method/OpenSSL=3a=3aCipher/i/pkcs5_keyivgen.html
Ceci est plus détaillé. C'est vrai, pkcs5_keyivgen ne peut pas obtenir iv. https://techmedia-think.hatenablog.com/entry/20110527/1306499951
J'espère que ce sera un indice pour ceux qui le mettront en œuvre à l'avenir. J'étais accro après un long moment ...
Recommended Posts