有谁知道as3crypto lib中aes256-cbc密码的php等价物是什么? 我需要在as3和php中获得相同的结果,因为我的应用需要as3< - > php数据交换。
这是我的as3课程:
import flash.display.Sprite;
import flash.utils.ByteArray;
import com.hurlant.crypto.symmetric.ICipher;
import com.hurlant.crypto.symmetric.IVMode;
import com.hurlant.crypto.symmetric.IMode;
import com.hurlant.crypto.symmetric.NullPad;
import com.hurlant.crypto.symmetric.PKCS5;
import com.hurlant.crypto.symmetric.IPad;
import com.hurlant.util.Base64;
import com.hurlant.util.Hex;
import com.hurlant.crypto.Crypto;
public class CryptoCode extends Sprite
{
private var type:String='aes256-cbc';
private var key:ByteArray;
public function CryptoCode()
{
init();
}
private function init():void
{
key = Hex.toArray(Hex.fromString('secret'));// can only be 8 characters long
//trace(encrypt('rower'));
//trace(decrypt(encrypt('TEST TEST'));
}
public function encrypt(txt:String = ''):String
{
var data:ByteArray = Hex.toArray(Hex.fromString(txt));
var pad:IPad = new PKCS5;
var mode:ICipher = Crypto.getCipher(type, key, pad);
pad.setBlockSize(mode.getBlockSize());
mode.encrypt(data);
return Base64.encodeByteArray(data);
}
public function decrypt(txt:String = ''):String
{
var data:ByteArray = Base64.decodeToByteArray(txt);
var pad:IPad = new PKCS5;
var mode:ICipher = Crypto.getCipher(type, key, pad);
pad.setBlockSize(mode.getBlockSize());
mode.decrypt(data);
return Hex.toString(Hex.fromArray(data));
}
}
和php类
class Crypt {
var $key = NULL;
var $iv = NULL;
var $iv_size = NULL;
function Crypt()
{
$this->init();
}
function init($key = "")
{
$this->key = ($key != "") ? $key : "";
$this->algorithm = MCRYPT_DES;
$this->mode = MCRYPT_MODE_ECB;
$this->iv_size = mcrypt_get_iv_size($this->algorithm, $this->mode);
$this->iv = mcrypt_create_iv($this->iv_size, MCRYPT_RAND);
}
function encrypt($data)
{
$size = mcrypt_get_block_size($this->algorithm, $this->mode);
$data = $this->pkcs5_pad($data, $size);
return base64_encode(mcrypt_encrypt($this->algorithm, $this->key, $data, $this->mode, $this->iv));
}
function decrypt($data)
{
return $this->pkcs5_unpad(rtrim(mcrypt_decrypt($this->algorithm, $this->key, base64_decode($data), $this->mode, $this->iv)));
}
function pkcs5_pad($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
function pkcs5_unpad($text)
{
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text)) return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
return substr($text, 0, -1 * $pad);
}
}
它与simple-des-ecb一起正常工作 - Php和Flash输出相同的字符串,但aes256-cbc提供不同的字符串。
我遵循了这个例子Flash Encryption PHP Decryption,但我需要aes265-cbc而不是simple-des-ecb。
任何人都可以帮助我吗?
答案 0 :(得分:2)
快速互联网搜索提供了这个金块:
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
$plaintext, MCRYPT_MODE_CBC, $iv);
这直接来自mcrypt_encrypt
代码示例,我在前一段时间重写过。
请注意,MCRYPT_RIJNDAEL_128
与AES相同。您需要提供256位(32字节)的密钥才能将其用作AES-256。 MCRYPT_RIJNDAEL_128
中的128是块大小,AES-256中的256是密钥大小。
请注意,现在6年未维护的PHP版本 - mcrypt库不提供开箱即用的PKCS#7填充。因此,请检查以下stackoverflow块:
How to add/remove PKCS7 padding from an AES encrypted string?
答案 1 :(得分:2)
如果你想要一个好的php版本使用AES-256和CBC + hashMac(基于mash的消息验证代码,请随意检查我的小代码片段(实现为yiiframework插件,但只需查看aes256.php类信息)。
它允许您使用带有私钥的AES-256加密/解密字符串,从而避免一些攻击 https://github.com/lucbonnin/aes256_yii_extension