Получение as3crypto для работы с ruby ​​(Gibberish / EzCrypto) - PullRequest
0 голосов
/ 27 июня 2011

Я пытаюсь заставить as3crypto хорошо играть либо с Gibberish, либо с EzCrypto в режиме AES-128.Независимо от того, какую комбинацию настроек я использую, я просто не могу заставить одну расшифровать другую, и обычно получаю сообщение «плохая расшифровка» в ruby.Каждая содержащаяся в нем среда может дешифровать данные, которые она сама зашифровала, но одна не может расшифровать другую.Кто-нибудь смог заставить их работать вместе?

Вот один из вариантов, которые я пробовал:

На стороне Actionscript, используя as3crypto:

//define the encryption key
var key:ByteArray = Hex.toArray("password");

//put plaintext into a bytearray
var plainText:ByteArray = Hex.toArray(Hex.fromString("this is a secret!"));

//set the encryption key
var aes:AESKey = new AESKey(key);

//encrypt the text
aes.encrypt( plainText );
trace(Base64.encode(Hex.fromArray(plainText))); 
//encrypted value is N2QwZmI0YWQ4NzhmNDNhYjYzM2QxMTAwNGYzNDI1ZGUyMQ==

Ина рубиновой стороне, используя тарабарщину:

// also tried the default size (256)
cipher = Gibberish::AES.new("password",128)

// raises the following exception: OpenSSL::Cipher::CipherError: wrong final block length
cipher.dec("N2QwZmI0YWQ4NzhmNDNhYjYzM2QxMTAwNGYzNDI1ZGUyMQ==")

Я испробовал все виды разных подходов, все приводили либо к вышеприведенному исключению, либо к "плохому шифрованию"

1 Ответ

0 голосов
/ 28 июня 2011

Наконец-то разобрался сам.Дело в том, что и Gibberish, и EzCrypto, похоже, не предоставляют способ указать IV, который необходим при использовании aes-cbc.Хитрость заключается в том, чтобы извлечь iv из первых 16 байтов зашифрованных данных, которые создает as3crypto.

Вот код as3, который также немного изменился:

// there are other ways to create the key, but this works well
var key:ByteArray = new ByteArray();
key.writeUTFBytes(MD5.encrypt("password"));

// encrypt the data. simple-aes-cbc is equiv. to aes-256-cbc in openssl/ruby, if your key is
// long enough (an MD5 is 32 bytes long)
var data:ByteArray = Hex.toArray(Hex.fromString("secret"));
var mode:ICipher= Crypto.getCipher("simple-aes-cbc", key) ;
mode.encrypt(data);

// the value here is base64, 32 bytes long. the first 16 bytes are the IV, needed to decrypt
// the data in ruby
// e.g: sEFOIF57LVGC+HMEI9EMTpcJdcu4J3qJm0PDdHE/OSY=
trace(Base64.encodeByteArray(data));

Часть ruby ​​используетгем под названием encryptor для обеспечения iv.Вы также можете использовать OpenSSL напрямую, это довольно просто:

key = Digest::MD5.hexdigest("password")
// decode the base64 encoded data back to binary:
encrypted_data = Base64.decode64("sEFOIF57LVGC+HMEI9EMTpcJdcu4J3qJm0PDdHE/OSY=")
// the tricky part: extract the IV from the decoded data
iv = encrypted_data.slice!(0,16)
// decrypt!
Encryptor.decrypt(encrypted_data,:key=>key,:iv=>iv)
// should output "secret"
...