• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1993
  • Last Modified:

Crypt CBC with DES3 (from python)

I am trying to convert the folowing python code to perl..
------------------------------------------------------
from Crypto.Cipher import DES3

CALC_3DES = 0x6603
iv = 'testtest'
key = 'testtesttesttest'
nonce = 'testtest'
obj = DES3.new(key, DES3.MODE_CBC, iv)
ciph = obj.encrypt(nonce)
print ciph
------------------------------------------------------
But i get a diffrent output with this:
------------------------------------------------------
use Crypt::CBC;
$iv = 'testtest';
$key = 'testtesttesttest';

$cipher = Crypt::CBC->new(
              -cipher      => DES_EDE3,
                        -key         => $key,
                        -iv          => $iv,
                        -header      => 'none');

$ciphertext = $cipher->encrypt("testtest");
print $ciphertext;
------------------------------------------------------
any ideas?
0
mattaustin
Asked:
mattaustin
  • 2
  • 2
1 Solution
 
mattaustinAuthor Commented:
I think it has something do to with CALC_3DES = 0x6603, but i dont know what that is or how to use it...?
0
 
clockwatcherCommented:
The following seems to work for me:

use MIME::Base64;
use Crypt::CBC;
$iv = "testtest";
$key = "testtesttesttest";
$key = $key.substr($key,0,24-length($key)) if length($key) < 24;  # perl 3DES forces you to use a 112 bit key -- python appears to wrap it

$cipher = Crypt::CBC->new(
                -cipher => DES_EDE3,
                -key    => $key,
                -iv     => $iv,
                -header => 'none',
                -padding => 'null',
                -literal_key => 1
                );

$result = encode_base64($cipher->encrypt("testtest"));
print $result;
print $cipher->decrypt(decode_base64($result)),"\n";

-----
Here's the python side (your script slightly modified to include base64 to get a printable output to compare):

#!/usr/bin/python

from Crypto.Cipher import DES3
import base64

iv = "testtest"
key = "testtesttesttest"
obj = DES3.new(key, DES3.MODE_CBC, iv)

enc = base64.b64encode(obj.encrypt("testtest"))
print enc

dec = DES3.new(key, DES3.MODE_CBC, iv)
print dec.decrypt(base64.b64decode(enc))
0
 
mattaustinAuthor Commented:
Thank you, But how exactly did you figure that out?  Did i miss something in a doc or something?
0
 
clockwatcherCommented:
The python documentation blows to put it mildly.   I just did a bit of experimentation and set some flags based on the Crypt::CBC documentation (http://search.cpan.org/~lds/Crypt-CBC-2.22/CBC.pm) that made sense to set based on the results I was seeing from the python encrypt.  If you have the choice, I'd change your python key to be 24 bytes.   I don't know if it's common practice to reuse the first 8 of the key for the final encrypt (just guessed that it was-- makes sense that it is) but to be on the safe side I'd go with the full key.
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now