Я попытался зашифровать текст в as3crypto через демонстрационное приложение.
теперь я пытаюсь расшифровать зашифрованный текст через php, но кажется, что текст не дешифрован должным образом. Кто-нибудь знает, как правильно расшифровать его через PHP? или я делаю это неправильно? пожалуйста, просветите меня …
вот сценарий:
зашифруйте это в http://crypto.hurlant.com/demo/ :
шифрование: AES
режим: CBC
прокладка: нет
Ключ: 11918f8bcd112e92744125008722050c
текст: Lorem ipsum dolor sit amet, consectetur adipiscing elit. В ut massa nec purus laoreet posuere quis vitae tortor.
инициализировать вектор: оставьте его пустым
нажмите зашифровать. выберите base64 и скопируйте шифрованный текст.
создайте скрипт php, который имеет эти коды и запускает его:
$ cipher = MCRYPT_RIJNDAEL_128;
$ mode = MCRYPT_MODE_CBC;
$ key = "11918f8bcd112e92744125008722050c";
$ cipher = "PLACE CIPHER TEXT HERE …";
$ data = base64_decode ($ cipher);
echo mcrypt_decrypt ($ cipher, $ key, $ data, $ mode);
проблема, вероятно, лежит в вашем ключе. Пока вы можете передать шестнадцатеричную строку в as3crypto, и она будет знать, что с ней делать, mcrypt_decrypt
будет интерпретировать каждый символ, поскольку это основное значение ASCII (например, a = 97) вместо его шестнадцатеричного значения (a = 10). Используйте метод hex2bin для преобразования шестнадцатеричной строки в строку байтов, и ваше дешифрование должно работать нормально.
Кроме того, проблема может основываться на разных идеях стандартного IV (вектор инициализации) между as3crypto и php. Поскольку вы используете режим CBC, вы должны указать IV, как хорошую практику безопасности. также помните о потенциальных ловушках, подобных тем, у которых есть ваш ключ, указав шестнадцатеричную строку в as3 и нужно преобразовать ее в php.
Это будет работать:
PHP-код:
//notice that $key and $iv length must be 16 chars long! ex: 1234567890123456 function decrypt($data,$key,$iv) { $decr= mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($data), MCRYPT_MODE_CBC, $iv); return $decr; }
И вот код AS3
//notice that $key and $iv length must be 16 chars long! ex: 1234567890123456 private function encrypt(input:String,decrKey:String,decrIV:String):String { var inputBA:ByteArray=Hex.toArray(Hex.fromString(input)); var key:ByteArray = Hex.toArray(Hex.fromString(decrKey)); var pad:IPad = new NullPad(); var aes:ICipher = Crypto.getCipher("aes-cbc", key, pad); var ivmode:IVMode = aes as IVMode; ivmode.IV = Hex.toArray(Hex.fromString(decrIV)); aes.encrypt(inputBA); return Base64.encodeByteArray( inputBA); }