2011-06-27 1 views
0

J'essaie de faire en sorte que as3crypto fonctionne bien avec Gibberish ou EzCrypto en mode AES-128. Quelle que soit la combinaison de paramètres que j'utilise, je ne peux tout simplement pas en obtenir un pour déchiffrer l'autre, et j'ai généralement un message "bad decrypt" dans ruby. Chaque environnement contenu peut déchiffrer les données qu'il a lui-même cryptées, mais il ne semble pas pouvoir déchiffrer l'autre. Est-ce que quelqu'un a réussi à faire travailler les deux ensemble?Utiliser as3crypto pour travailler avec ruby ​​(Gibberish/EzCrypto)

est ici l'une des variantes que j'essayées:

Du côté Actionscript, en utilisant 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== 

Et du côté rubis, en utilisant du charabia:

// 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==") 

J'ai essayé toutes sortes d'approches différentes, tout en produisant soit l'exception ci-dessus ou "bad encrypt"

+0

pourquoi ne vous postez pas les parties pertinentes du code que vous avez utilisé, afin que les gens peuvent avoir un coup d'oeil? – Mat

Répondre

0

Enfin compris moi-même. La chose est à la fois Gibberish et EzCrypto ne semble pas fournir un moyen de spécifier un IV, ce qui est nécessaire lors de l'utilisation de aes-cbc. L'astuce consiste à extraire l'iv des 16 premiers octets de la donnée cryptée produite par as3crypto.

Voici le code AS3, qui a également changé un peu:

// 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)); 

La partie rubis utilise un bijou appelé encryptor pour alimenter le iv. vous pouvez également utiliser OpenSSL directement, il est assez simple:

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" 
+0

Etes-vous sûr que la partie AS3 se compile bien? as3crypto MD5 n'a pas de fonction de cryptage statique, aussi, j'ai essayé de faire: var md5: MD5 = nouveau MD5(); \t \t \t \t \t \t \t \t \t \t \t \t var src: ByteArray = Hex.toArray ("password"); \t \t \t \t \t \t var digérer: ByteArray = md5.hash (src); \t \t \t \t \t \t \t key.writeUTFBytes (Hex.fromArray (condensé)); – simo

+0

Mais, cela n'a pas fonctionné, j'ai eu l'erreur: TypeError: Erreur # 1009: Impossible d'accéder à une propriété ou méthode d'une référence d'objet nul. \t at com.hurlant.crypto :: Crypto $/getCipher() [D: \ mes projets \ dcaclab \ activation \ src \ com \ hurlant \ crypto \ Crypto.as: 106] – simo

+0

Pouvez-vous s'il vous plaît partager votre code final pour ce ? C'est très utile, et nous l'apprécierons tous :-) – simo

Questions connexes