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

J

josh.kuo

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

I have read this post that dealt with a similar problem that I am
having now:
http://groups.google.com/group/comp...3?lnk=st&q=Crypt::CBC&rnum=5#5beccf25a7150533

Summary of my problem:
I need to have a perl script that encrypts, 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:

http://us2.php.net/manual/en/function.mcrypt-cbc.php

Below is my perl code used to encrypt

<perl>
#!/usr/bin/perl
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;
close(FILE);
</perl>

And here's my PHP script used to decrypt:

<?php
$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,
MCRYPT_DECRYPT, $iv);
echo "decrypted : [$decrypted]";
exit();
?>

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.
 
J

josh.kuo

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 ./blow.pl 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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top