Making Perl Crypt::CBC work with PHP mcrypt_cbc()

Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

Threaded View
First of all, I know this is a PHP news group, so my question may not
be completely appropriate here since it involves some perl.

I have read this post that dealt with a similar problem that I am
having now: ...

Summary of my problem:
I need to have a perl script that encrypts a string, write the output
to a file,
and then have a PHP script read the file, and decrypts it.  I took most
of the code from this URL:

Below is my perl code used to encrypt

use MIME::Base64;
use Crypt::CBC;
my $key = '012345678901234567890123456789';
my $iv  = '12345678';
my $text = 'This is my plain text';
$cipher = Crypt::CBC->new({'literal_key' => 0,
                           'key'         => $key,
                           'cipher'      => 'Blowfish',
                           'iv'          => $iv,
                           'padding'     => 'null',
                           'prepend_iv'  => 0});
$encrypted = $cipher->encrypt($text);
$encoded = encode_base64($encrypted);
open(FILE, ">encrypt.txt");
print FILE $encoded;

And here's my PHP script used to decrypt:

$key = '012345678901234567890123456789';
$iv  = '12345678';
$lines = file('encrypt.txt');
$encoded = '';
foreach ($lines as $line) {
    $encoded .= $line;

$encrypted = base64_decode($encoded);
$decrypted = mcrypt_cbc(MCRYPT_BLOWFISH, $key, $bin_encrypted,
echo "decrypted : [$decrypted]";

But the decryption doesn't seem to work... If I printed out the base64
encoded strings, they match.  So I suspect it's something that I did
not do correctly either in the encryption or decryption of the message.

Any help is appreciated.

Re: Making Perl Crypt::CBC work with PHP mcrypt_cbc()

Answer my own question...

The perl Crypt::CBC documentation states that the '-regenerate_key' and
'-prepent_iv' are deprecated, that's why I used '-literal_key' instead
of '-regenerate_key'.

However, when I switch back to use the old '-regenerate_key', I got a
different error:

If specified by -literal_key, then the key length must be equal to the
chosen cipher's key length of 56 bytes at ./ line 9

So I changed my key to something like this in both perl and PHP:

my $long_key = "01234567890123456789012345678901234567890123456789"
my $key = substr($long_key, 0, 56);

And while decrypting on the PHP end, I needed to use rtrim() on the
decrypted string.

After these changes everything is working.

Site Timeline