2017-08-22 6 views
0

Ich versuche, einige Python-Code in Ruby zu konvertieren. Hier ist ein Ausschnitt des Python-Code:In Ruby, wie eine DES-Verschlüsselung mit PKCS5 Padding

# -*- 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= 

Mein Ruby-Code:

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= 

Der Rubin Ergebnis nicht gleich Pythons .Welche Algorithmus soll ich wählen?

+1

Ein Triple DES sollte 24 Bytes lang sein, nicht 16 Zeichen. Außerdem sollten kryptografische Schlüssel nicht von zufälligem Rauschen unterschieden werden, was bedeutet, dass sie nicht ausschließlich aus Ziffern oder sogar alphanumerischen Zeichen bestehen können. Sie sollten zufällig ausgewählt werden und einen möglichen Byte-Wert enthalten. –

+2

** Verwenden Sie Triple DES heutzutage nicht. ** Es bietet bestenfalls 112 Bit Sicherheit, selbst wenn Sie die größte Schlüsselgröße von 192 Bit verwenden. Wenn eine kürzere Schlüsselgröße verwendet wird, stellt sie nur 56 oder 57 Bits Sicherheit bereit. AES wäre schneller (Prozessoren haben einen speziellen AES-NI-Befehlssatz) und noch sicherer mit der niedrigsten Schlüsselgröße von 128 Bit. Es gibt auch eine praktische Grenze für die maximale Chiffretextgröße mit 3DES. Siehe [Sicherheitsvergleich von 3DES und AES] (https://security.stackexchange.com/q/26179/45523). –

+1

Die IV muss unvorhersehbar sein (gelesen: zufällig). Verwenden Sie keine statische IV, da dies die Chiffre deterministisch und daher nicht semantisch sicher macht. Ein Angreifer, der Chiffriertexte beobachtet, kann feststellen, wann das gleiche Nachrichtenpräfix vorher gesendet wurde. Die IV ist nicht geheim, Sie können sie also zusammen mit dem Geheimtext senden. Normalerweise wird es einfach dem Geheimtext vorangestellt und vor der Entschlüsselung abgeschnitten. –

Antwort

2

Es gibt zwei Probleme hier. Verwenden Sie zunächst nicht pkcs5_keyivgen, dies ist eine alte und veraltete Funktion zum Ableiten eines Schlüssels und iv von einem Passwort. Sie müssen diese direkt auf dem Cipher Objekt setzen:

cipher.key = key 
cipher.iv = iv 

Zweitens in Ihrem Python-Code der Schlüssel 16 Byte ist, das heißt, Sie zwei Schlüssel verwenden (oder Keying Option 2) Triple-DES. Der Python-Code bestimmt automatisch, welche Methode in Abhängigkeit von der Länge des verwendeten Schlüssels verwendet wird. In den Ruby OpenSSL-Bindungen müssen Sie explizit festlegen, welche verwendet werden soll. des-ede3-cbc ist drei Schlüssel (oder Keying-Option 1). Sie müssen des-ede-cbc als den Verschlüsselungsnamen verwenden:

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

danke, es hat funktioniert. –