Blowfish Cipher Tutorials - Herong's Tutorial Examples - v2.03, by Herong Yang
PHP Mcrypt Blowfish Block Cipher
This section provides a tutorial example on how to write Blowfish block cipher by calling the PHP Mcrypt function, mcrypt_encrypt() in ECB mode. Each input data block will be encrypted independently.
If we call the PHP Mcrypt mcrypt_encrypt() function with Blowfish algorithm in ECB mode, we are actually performing blowfish encryption on input data blocks one at a time independently.
So I wrote a simple Blowfish block cipher as listed blow:
<?php #- Blowfish-Block-Cipher.php #- Copyright (c) 2018 HerongYang.com, All Rights Reserved. $key = hex2bin('0000000000000000'); $cleartext = hex2bin('0000000000000000'); $ciphertext = hex2bin('4ef997456198dd78'); if (count($argv)>1) $key = hex2bin($argv[1]); if (count($argv)>2) $cleartext = hex2bin($argv[2]); if (count($argv)>3) $ciphertext = hex2bin($argv[3]); // mcrypt_ecb() was DEPRECATED in PHP 5.5.0, and REMOVED in PHP 7.0.0 // $result = // mcrypt_ecb(MCRYPT_BLOWFISH, $key, $cleartext, MCRYPT_ENCRYPT); // mcrypt_encrypt() has been DEPRECATED as of PHP 7.1.0 $result = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $cleartext, MCRYPT_MODE_ECB); $validation = $result==$ciphertext; print("key bytes clear bytes cipher bytes\n"); print(bin2hex($key).' '.bin2hex($cleartext).' '.bin2hex($ciphertext) ."\n"); print('Test Result: '.bin2hex($result)."\n"); print('Validation: '.$validation."\n"); ?>
Before running any tests, let me check the version of my PHP installation:
C:\herong>php -version PHP 7.0.2 (cli) (built: Jan 6 2016 13:05:11) ( ZTS ) Copyright (c) 1997-2015 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
Test 1: Run it without argument. The default test will be performed. The result should match the expected ciphertext:
C:\herong>php Blowfish-Block-Cipher.php key bytes clear bytes cipher bytes 0000000000000000 0000000000000000 4ef997456198dd78 Test Result: 4ef997456198dd78 Validation: 1
Test 2: Run it again with another test vector. The result should match the expected ciphertext:
C:\herong>php Blowfish-Block-Cipher.php \ FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 51866FD5B85ECB8A key bytes clear bytes cipher bytes ffffffffffffffff ffffffffffffffff 51866fd5b85ecb8a Test Result: 51866fd5b85ecb8a Validation: 1
Test 3: Run it with 2 repeating blocks. The result should show 2 repeating ciphertext blocks, because ECB cipher mode does not chain clocks:
C:\herong>php Blowfish-Block-Cipher.php FFFFFFFFFFFFFFFF \ FFFFFFFFFFFFFFFFffffffffffffffff \ 51866FD5B85ECB8A51866fd5b85ecb8a key bytes clear bytes cipher bytes ffffffffffffffff ffffffffffffffffffffffffffffffff 51866fd5b85ecb8a51866fd5b85ecb8a Test Result: 51866fd5b85ecb8a51866fd5b85ecb8a Validation: 1
Table of Contents
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
►PHP Mcrypt Extension for Blowfish
►PHP Mcrypt Blowfish Block Cipher
Mycrypt Blowfish Block Chaining Cipher
"ncfb/nofb" for Block Chaining Ciphers
Performing CFB Operation Manually