I wrote a blog post regarding the problem in general:
Title: Encryption Compatibility: Matching Encrypted Output on Different Systems
URL: http://blog.chilkatsoft.com/?p=123
To sum it up, these input parameters must match between encryptor and decryptor:
(1) Algorithm
(2) Mode (CBC, ECB)
(3) Key Length (128-bit, 192-bit, 256-bit)
(4) Initialization Vector
(5) Secret Key
(6) Padding Scheme (but only last block will differ if mismatched).
The article discusses each in detail, including character encoding issues if text is involved.
The intent of the article is that anyone can read it regardless of programming language
or encryption package/lib to understand the issues involved. I hope it helps...
-Matt
···
At 09:15 AM 12/5/2006, you wrote:
I've got a quick general question about encryption.
I've encrypted the same string with OpenSSL, ruby-aes, and Crypt, using
the same cipher, key, and IV (I've slightly modified Crypt to accept an
IV) and get different results for all of them.If all of the variables are the same, why would this be happening?
---- Begin Code Snippit (http://pastie.caboo.se/25895\)
require 'crypt/rijndael'
require 'base64'
require 'ruby-aes/aes'
require 'openssl'# Modify Crypt::Rijndael lib to accept an IV
module Crypt
class Rijndael
def vector() @vector; endalias orig_initialize initialize
def initialize(key, vector, keyBits = 256, blockBits = 128)
@vector = vector
orig_initialize(key, keyBits, blockBits)
endalias orig_generate_initialization_vector
generate_initialization_vector
def generate_initialization_vector( *p )
@vector || orig_generate_initialization_vector( *p )
enddef iv_length() block_size; end
end
enddef test_crypt_encryption
key = '0123456789abcdef0123456789abcdef'
rijndael = Crypt::Rijndael.new( key, 128, 128 )raise Base64.encode64( rijndael.encrypt_string( 'abcdef' ) )
# returns 'F2wpWlldcZPQlfHOBWZatk8Zq9XNHMRJiB0vC04rZEE='
enddef test_openssl_encryption
key = '0123456789abcdef0123456789abcdef'
alg = "AES-256-CBC"
iv = 'abcdefghijklmnop'aes = OpenSSL::Cipher::Cipher.new(alg)
aes.encrypt
aes.key = key
aes.iv = ivout = aes.update('abcdef')
out << aes.final
raise Base64.encode64(out)
# returns 'jQeE5X55BSwJQav1VV+w1g=='
enddef test_aes_encryption
key = '0123456789abcdef0123456789abcdef'
iv = 'abcdefghijklmnop'
raise Base64.encode64( Aes.encrypt_buffer(128, 'CBC', key, iv,
'abcdef') )
# returns 'fa3taon6wtaPGQ4KgmLrCQ=='
end--
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.409 / Virus Database: 268.15.9/571 - Release Date: 12/5/2006
--
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.409 / Virus Database: 268.15.9/571 - Release Date: 12/5/2006