Blowfish Cipher Tutorials - Herong's Tutorial Examples - v2.04, by Herong Yang
Crypt::CBC Encryption with Literal Keys
A tutorial Perl example is provided to show how to use Crypt::CBC to perform encryption with a literal key and an IV specified by the user.
By reading the CBC (Cipher Block Chaining) algorithm, we know that it needs 3 pieces of information to perform encryption:
By reading the Crypt::CBC manual page, I see several options to manage the secret key and the IV:
The first option, user specified secret key and IV, is easier to understand, so let's try it first.
According to the Crypt::CBC manual page, we need to provide the following parameters when calling the new() method to use the user specified secret key and IV option:
To help us understanding the Literal Key option, I wrote the following example Perl script, Crypt-CBC-Blowfish-Literal-Key.pl:
#- Crypt-CBC-Blowfish-Literal-Key.pl
#- Copyright (c) 2015 HerongYang.com, All Rights Reserved.
#-
use Crypt::CBC;
$algorithm = "Blowfish";
my ($keyHex, $ivHex, $plainHex) = @ARGV;
print("Crypt::CBC Literal Key Test - output in Hex:\n");
$keyHex = "1122334455667788990011223344556677889900".
"1122334455667788990011223344556677889900".
"11223344556677889900112233445566"
unless $keyHex;
$ivHex = "0000000000000000" unless $ivHex;
$plainHex = "0123456789abcdef" unless $plainHex;
$keyStr = pack("H*", $keyHex);
$ivStr = pack("H*", $ivHex);
$plainStr = pack("H*", $plainHex);
print(" Secret Key ($keyHex)\n");
print(" IV ($ivHex)\n");
print(" Plaintext ($plainHex)\n");
print("Creating Crypt::CBC with Literal Key...\n");
$cipher = Crypt::CBC->new(
-cipher => $algorithm,
-literal_key => 1,
-key => $keyStr,
-iv => $ivStr,
-header => 'none',
-padding => 'none'
);
print("Encrypting plaintext...\n");
$cipherStr = $cipher->encrypt($plainStr);
$cipherHex = unpack("H*", $cipherStr);
print(" Ciphertext ($cipherHex)\n");
print("Decrypting ciphertext...\n");
$decryptStr = $cipher->decrypt($cipherStr);
$decryptHex = unpack("H*", $decryptStr);
print(" Decrypted text ($decryptHex)\n");
$passStr = $cipher->passphrase();
$passHex = unpack("H*", $passStr);
print(" Pass Phrase ($passHex)\n");
$ivStr = $cipher->iv();
$ivHex = unpack("H*", $ivStr);
print(" IV ($ivHex)\n");
If you run this example script 2 times in a command window, you will get:
C:\Herong>perl Crypt-CBC-Blowfish-Literal-Key.pl
Crypt::CBC Literal Key Test - output in Hex:
Secret Key (1122334455667788990011223344556677889900
1122334455667788990011223344556677889900
11223344556677889900112233445566)
IV (0000000000000000)
Plaintext (0123456789abcdef)
Creating Crypt::CBC with Literal Key...
Encrypting plaintext...
Ciphertext (c52f3b26ae7dfd39)
Decrypting ciphertext...
Decrypted text (0123456789abcdef)
Pass Phrase (1122334455667788990011223344556677889900
1122334455667788990011223344556677889900
11223344556677889900112233445566)
IV (0000000000000000)
C:\Herong>perl Crypt-CBC-Blowfish-Literal-Key.pl
Crypt::CBC Literal Key Test - output in Hex:
Secret Key (1122334455667788990011223344556677889900
1122334455667788990011223344556677889900
11223344556677889900112233445566)
IV (0000000000000000)
Plaintext (0123456789abcdef)
Creating Crypt::CBC with Literal Key...
Encrypting plaintext...
Ciphertext (c52f3b26ae7dfd39)
Decrypting ciphertext...
Decrypted text (0123456789abcdef)
Pass Phrase (1122334455667788990011223344556677889900
1122334455667788990011223344556677889900
11223344556677889900112233445566)
IV (0000000000000000)
The output seems to be correct:
Table of Contents
Installing Crypt::CBC 2.33 with ActivePerl
►Crypt::CBC Encryption with Literal Keys
Crypt::CBC Literal Key Error Cases
Crypt::CBC Encryption with Crypt::Blowfish Objects
Crypt::CBC Operation Simulation
Crypt::CBC Encryption Verification
Blowfish CBC 2-Block Test Vectors
Crypt::CBC Prepending IV to Ciphertext
Crypt::CBC Encryption with Salted Keys
Crypt::CBC Salted Key Test Cases
Crypt::CBC Secret Key and IV Algorithm
Crypt::CBC Encryption with Random Salt
Crypt::CBC Padding Option Tests
Crypt::CBC Blowfish Encryption Summary
OpenSSL "enc -bf-ecb" for Blowfish/ECB Encryption
OpenSSL "enc -bf-cbc" for Blowfish/CBC Encryption
OpenSSL "enc -bf-cfb" for Blowfish/CFB Encryption
OpenSSL "enc -bf-ofb" for Blowfish/OFB Encryption