Une histoire dans laquelle j'étais vraiment quand j'ai fait triple DES avec ruby

Chose que tu veux faire

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.

La demande à l'autre serveur d'authentification ne fonctionne pas

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?

Une autre clé appelée vecteur d'initialisation

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é)

la mise en oeuvre

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

De côté

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

Une histoire dans laquelle j'étais vraiment quand j'ai fait triple DES avec ruby
Après avoir vérifié le problème de Montyhall avec Ruby, c'était une histoire que je pouvais bien comprendre et que je ne comprenais pas bien
Notez que j'étais accro au traitement par lots avec Spring Boot
Une histoire à laquelle j'étais accro lors de l'obtention d'une clé qui a été automatiquement essayée sur MyBatis
Java: Une histoire qui m'a mis mal à l'aise quand on m'a appris à comparer des chaînes avec des égaux sans raison.
Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
J'ai fait une mort risquée avec Ruby
Résumé d'avoir passé un mois avec Ruby Silver sans expérience en arts libéraux
Étudier à CodeWar (ruby) ④ cas ~ quand
Faites un jeu de frappe avec ruby
Remarques sur la communication HTTP avec Java (OkHttp)
J'ai fait une mort risquée avec Ruby
Une histoire dans laquelle j'étais vraiment quand j'ai fait triple DES avec ruby
Lors de l'introduction de JOOQ dans Spring Boot, une histoire qui a été traitée parce qu'une erreur s'est produite autour de Liquidbase
4 livres techniques que je regrette d'avoir dû lire quand j'étais un nouveau venu
J'ai fait un portfolio avec Ruby On Rails
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
[Résumé] Ce que j'ai remarqué et fait quand on m'a dit que le JDK Oracle était payé
Un site facile à comprendre lorsque j'ai commencé à apprendre Spring Boot
Une histoire sur l'exécution de Sprint-boot avec kubernetes (GKE) et l'échec de la connexion à CloudSQL
[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.
[Ruby] Incompréhension que j'utilisais le module [Débutant]
Une note gênante lorsque vous essayez d'utiliser nginx avec des conteneurs distants de vscode
Comment initialiser par lots des tableaux avec Java que je ne savais pas quand j'étais débutant
Une histoire qui a fini par prendre une pause lors de l'utilisation de la liste liée avec une sensation de légèreté
Une histoire dans laquelle j'étais accro à la conversion de type implicite d'ActiveRecord lors du test unitaire
Une histoire que turbolinks a été confondue par de mauvaises choses
Une histoire que je pensais ne pas avoir gâché ma vie
J'ai recherché un framework web avec Gem en Ruby
J'ai créé un MOD qui appelle instantanément un véhicule avec Minecraft
L'histoire à laquelle j'étais accro lors de la création de STS
Lorsque j'ai créé un graphique à barres avec MPAndroidChart, l'étiquette de l'axe des x était mal alignée pour une raison quelconque
Quand j'ai essayé de composer une mise à jour dans le conteneur Docker, je me suis fâché avec proc_open (): fork a échoué