2017-08-22 3 views
0

Je suis en train de convertir du code Python en Ruby. Voici un extrait du code Python:Dans ruby, comment faire un cryptage DES avec padding PKCS5

# -*- coding: UTF-8 -*- 
import pyDes 
import base64 
des3Key = '1234567887654321' 
iv = des3Key[0:8] 
data = r'abc' 
k = pyDes.triple_des(des3Key,pyDes.CBC,iv,pad=None,padmode=pyDes.PAD_PKCS5) 
d = k.encrypt(data) 
print base64.b64encode(d) 
#q8qN6El3X8A= 

Code Mon Ruby:

require 'digest' 
require 'openssl' 
require 'base64' 

data = 'abc' 

key = '1234567887654321' 
iv = key[0..7] 
# cipher = OpenSSL::Cipher::Cipher.new('DES-EDE3') 
cipher = OpenSSL::Cipher::Cipher.new('DES-EDE3-CBC') # or any other algorithm? 

cipher.encrypt 
cipher.pkcs5_keyivgen(key, iv) 
output = cipher.update(data) 
output << cipher.final 
p Base64.encode64(output).gsub(/\n/, "") 
# y7TPhjBQO78= 

Le résultat rubis pas algorithme .Qui python égal dois-je choisir?

+1

Un triple DES doit avoir 24 octets et non 16 caractères. En outre, les clés cryptographiques doivent être indiscernables du bruit aléatoire, ce qui signifie qu'elles ne peuvent pas être composées uniquement de chiffres ou même d'alphanumériques. Ils doivent être choisis au hasard peut contenir n'importe quelle valeur d'octet possible. –

+2

** N'utilisez pas Triple DES de nos jours. ** Il ne fournit au mieux que 112 bits de sécurité même si vous utilisez la plus grande taille de clé de 192 bits. Si une taille de clé plus courte est utilisée, elle ne fournit que 56 ou 57 bits de sécurité. AES serait plus rapide (les processeurs ont un ensemble d'instructions AES-NI spécial) et encore plus sûr avec la taille de clé la plus faible de 128 bits. Il y a aussi une limite pratique sur la taille maximale du texte chiffré avec 3DES. Voir [Comparaison de sécurité de 3DES et AES] (https://security.stackexchange.com/q/26179/45523). –

+1

La IV doit être imprévisible (lire: aléatoire). N'utilisez pas de IV statique, car cela rend le chiffrement déterministe et donc non sémantiquement sécurisé. Un attaquant qui observe des textes chiffrés peut déterminer quand le même préfixe de message a été envoyé auparavant. L'IV n'est pas un secret, vous pouvez donc l'envoyer avec le texte chiffré. Habituellement, il est simplement préfixé au texte chiffré et découpé avant le déchiffrement. –

Répondre

2

Il y a deux problèmes ici. Tout d'abord, n'utilisez pas pkcs5_keyivgen, il s'agit d'une fonction ancienne et obsolète pour dériver une clé et iv à partir d'un mot de passe. Vous devez définir ces directement sur l'objet Cipher:

cipher.key = key 
cipher.iv = iv 

En second lieu, dans votre code Python la clé est de 16 octets, ce qui signifie que vous utilisez deux clés (ou l'option 2 saisie) Triple DES. Le code Python détermine automatiquement l'utilisation en fonction de la longueur de la clé utilisée. Dans les bindings Ruby OpenSSL, vous devez spécifier explicitement ce que vous voulez utiliser. des-ede3-cbc est trois clés (ou l'option de saisie 1). Vous devez utiliser des-ede-cbc comme nom de chiffrement:

cipher = OpenSSL::Cipher.new('des-ede-cbc') 
+0

merci, cela a fonctionné. –