Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PHP中的等效AES 128位_Java_Php_Encryption_Aes - Fatal编程技术网

Java PHP中的等效AES 128位

Java PHP中的等效AES 128位,java,php,encryption,aes,Java,Php,Encryption,Aes,我有这段Java代码,它使用AES 128位将源字符串加密为Base64加密值。但是,我没有找到产生相同结果的类似PHP函数。任何帮助都将不胜感激 String key = "1234567890123456"; String source = "The quick brown fox jumped over the lazy dog"; byte[] raw = key.getBytes(); SecretKeySpec skeySpec = new Secr

我有这段Java代码,它使用AES 128位将源字符串加密为Base64加密值。但是,我没有找到产生相同结果的类似PHP函数。任何帮助都将不胜感激

    String key = "1234567890123456";
    String source = "The quick brown fox jumped over the lazy dog";

    byte[] raw = key.getBytes();
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

    // Instantiate the cipher
    Cipher cipher = Cipher.getInstance("AES");

    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

    byte[] encrypted = cipher.doFinal(source.getBytes());
    System.out.println(new String(Base64.encodeBase64(encrypted)));

这就是答案。这要归功于@owlstead和他提到的线程中原始答案的所有者

<?php
function encrypt($str, $key){
     $block = mcrypt_get_block_size('rijndael_128', 'ecb');
     $pad = $block - (strlen($str) % $block);
     $str .= str_repeat(chr($pad), $pad);
     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB));
}

function decrypt($str, $key){ 
     $str = base64_decode($str);
     $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
     $block = mcrypt_get_block_size('rijndael_128', 'ecb');
     $pad = ord($str[($len = strlen($str)) - 1]);
     $len = strlen($str);
     $pad = ord($str[$len-1]);
     return substr($str, 0, strlen($str) - $pad);
}
?>

我对将Java代码翻译成PHP的要求略有不同

Java代码:

SecretKeySpec skeySpec = new SecretKeySpec(Hex.decodeHex(key
           .toCharArray()), algorithm);
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(message.getBytes());              
return new String(Hex.encodeHex(encrypted));
PHP等价物:

$storeServerToken = 'my_token';
date_default_timezone_set('UTC');
$str = $storeServerToken . '|' . date('Y-m-d H:i:s', gmmktime());
$key = 'my_key';
return bin2hex($this->_encrypt($str, $this->_hex2bin($key)));

private function _encrypt($str, $key) {
    $block = mcrypt_get_block_size('rijndael_128', 'ecb');
    $pad = $block - (strlen($str) % $block);
    $str .= str_repeat(chr($pad), $pad);
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
}

private function _hex2bin($hexstr) {
    $n = strlen($hexstr);
    $sbin = "";
    $i = 0;
    while ($i < $n) {
        $a = substr($hexstr, $i, 2);
        $c = pack("H*", $a);
        if ($i == 0) {
            $sbin = $c;
        } else {
            $sbin.=$c;
        }
        $i+=2;
    }

    return $sbin;
}
$storeServerToken='my_token';
日期\默认\时区\设置('UTC');
$str=$storeServerToken.“|”。日期('Y-m-d H:i:s',gmmktime());
$key='my_key';
返回bin2hex($this->_encrypt($str,$this->uhex2bin($key));
私有函数加密($str,$key){
$block=mcrypt_get_block_size('rijndael_128','ecb');
$pad=$block-(strlen($str)%$block);
$str.=str_重复(chr($pad),$pad);
返回mcrypt_encrypt(mcrypt_RIJNDAEL_128,$key,$str,mcrypt_MODE_ECB);
}
私有函数_hex2bin($hexstr){
$n=strlen($hexstr);
$sbin=“”;
$i=0;
而($i<$n){
$a=substr($hexstr,$i,2);
$c=包装(“H*”,$a);
如果($i==0){
$sbin=$c;
}否则{
$sbin.=$c;
}
$i+=2;
}
返回$sbin;
}

bse64decode()
并查看手册。请看这里:您的术语不正确。“使用AES 128位的Base64加密值”听起来不准确。“使用AES-128加密并使用Base64编码的值”是正确的说法。感谢您的评论。我尝试了一些使用mcrypt和base64_encode的php代码,但它们没有产生相同的结果。您需要使用ECB模式加密(不安全),这似乎转化为
mcrypt_generic
。此外,还需要PKCS7填充。但是,这在mcrypt中不可用,请参见。您正在获取DES的块大小,但指定AES加密。这看起来不对。