AES in perl, Datenaustausch mit Javascript

01/08/2013 - 11:51 von Markus Steinborn | Report spam
Hallo,

ich möchte in Javascript AES verschlüsseln und in perl entschlüsseln
sowie das ganze umgekehrt. Fangen wir mit der ersten Richtung an:

Für die Javascript-Verschlüsselung habe ich die CryptJS-Bibliothek
genommen, siehe http://code.google.com/p/crypto-js/ und folgendes
Beispiel funktioniert:

<script src="aes.js"></script>
<script>
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");

alert(encrypted.key);
alert(encrypted.iv);
alert(encrypted.salt);
alert(encrypted.ciphertext);


alert(encrypted.toString()); // Eigentlich will ich diese Ausgabe
wieder entschlüsseln, aber fangen wir mit den getrennten Bestandteilen an...


</script>




Gut, um das in Perl zu entschlüsseln ist mein Versuch:

#! /usr/bin/perl

use MIME::Base64;
use Crypt::CBC;

// Folgende Werte sind aus der Ausgabe von dem Javascript.Teil uebernommen

$keyHex =
"a4430c9c6ad9b88836b7277193cc21c56e5503f6f0dbf3e777a31be7d42765f8";
$ivHex = "b99974a9ff1f39af888bc378015c37d1";

$ciphertextHex = "ab001d77079ba21885e483d42fdacbd448b257c1b05216ea";

$iv = pack("H*", $ivHex);
$ciphertext = pack("H*", $ciphertextHex);
$key = pack("H*", $keyHex);

$cipher = Crypt::CBC->new(
-key => $key,
-cipher => "Crypt::OpenSSL::AES",
-iv => $iv,
-header => "none",
);

$cipher->start("D");
$plaintext = $cipher->decrypt($ciphertext);
$cipher->finish;

print "$plaintext";



leider ist $plaintext leer. Wo ist der Fehler? Ich finde nàmlich keinen
Fehler in der Vorgehensweise.

Wo ist das Problem?


Vielen Dank im Voraus

Markus
 

Lesen sie die antworten

#1 Christian Winter
01/08/2013 - 20:13 | Warnen spam
Am 01.08.2013 11:51, schrieb Markus Steinborn:
ich möchte in Javascript AES verschlüsseln und in perl entschlüsseln
sowie das ganze umgekehrt. Fangen wir mit der ersten Richtung an:

Für die Javascript-Verschlüsselung habe ich die CryptJS-Bibliothek
genommen, siehe http://code.google.com/p/crypto-js/


[...schnipp...]
$cipher = Crypt::CBC->new(
-key => $key,
-cipher => "Crypt::OpenSSL::AES",
-iv => $iv,
-header => "none",
);

$cipher->start("D");
$plaintext = $cipher->decrypt($ciphertext);



Das ist doppelt gemoppelt. Entweder du ruft start() auf und danach
crypt(), oder du verwendest decrypt() làsst start() weg.

$cipher->finish;


dito.

print "$plaintext";

leider ist $plaintext leer. Wo ist der Fehler? Ich finde nàmlich keinen
Fehler in der Vorgehensweise.



AES ist der Algorithmus dahinter, aber damit das ganze in beide
Richtungen funktioniert, müssen auch die Rahmenparameter (Block mode,
Padding etc.) stimmen. Da denke ich ist der Hund begraben, AFAIK
nimmt OpenSSL per Default CFB her wàhrend CryptoJS CBC verwendet.
Also musst du dem einen oder anderen beibringen, einen anderen
Block mode zu verwenden.

-Christian

Ähnliche fragen