【问题标题】:Equivalent AES 128 bit in PHPPHP中等效的AES 128位
【发布时间】:2012-03-16 18:29:06
【问题描述】:

我有这段 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)));

【问题讨论】:

  • bse64decode() 并查看手册php.net/ref.mcrypt
  • 您的术语不正确。 “使用 AES 128 位的 Base64 加密值”听起来不准确。 “使用 AES-128 编码 使用 Base64 的值 加密”是正确的说法。
  • 感谢您的评论。我用 mcrypt 和 base64_encode 尝试了一些 php 代码,但它们没有产生相同的结果
  • 您将需要使用 ECB 模式加密(不安全),这似乎转换为 mcrypt_generic。此外,您将需要 PKCS7 填充。但是,这在 mcrypt 中不可用,请参阅 stackoverflow

标签: java php encryption aes


【解决方案1】:

这就是答案。归功于@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);
}
?>

【讨论】:

  • 您正在获取 DES 的块大小,但指定了 AES 加密。这看起来不对。
  • 需要解释。
【解决方案2】:

我对将 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2015-04-10
    • 1970-01-01
    • 2019-08-17
    • 2020-04-15
    相关资源
    最近更新 更多