【问题标题】:Convert Java AES encryption to PHP将 Java AES 加密转换为 PHP
【发布时间】:2017-05-10 09:01:58
【问题描述】:

我需要使用带有特定参数的 AES 加密,但提供的唯一示例是 Java。我需要将所有内容都移至 PHP,但我不确定该怎么做。

在 Java 中,加密类直接将 iv/salt 参数作为字节数组。类似的东西:

byte[] iv = {(byte) 0xCB, (byte) 0x35, (byte) 0xF3, (byte) 0x52, (byte) 0x1A, (byte) 0xF7, (byte) 0x38, (byte) 0x0B, (byte) 0x75, (byte) 0x03, (byte) 0x8E, (byte) 0xE0, (byte) 0xEF, (byte) 0x39, (byte) 0x98, (byte) 0xC7};

AlgorithmParameterSpec params = new IvParameterSpec(iv);

但是 PHP 需要一个字符串作为输入,所以我尝试做类似的事情:

private $salt = ['a7', '70', '1f', 'f6', '5e', 'd3', '29', '8f'];
private $iv = ['cb', '35', 'f1', '52', '1b', 'f7', '33', '0b', '75', '03', '8e', 'e0', 'cf', '39', '98', 'c7'];


    public function __construct()
{

    $iv = implode(array_map("hex2bin", $this->iv));
    $this->iv = $iv;

    $salt = implode(array_map("hex2bin", $this->salt));
    $this->salt = $salt;

}

public function encrypt($unencryptedString)
{

    $key = hash_pbkdf2('sha1', $this->passPhrase, $this->salt, $this->iterationCount, $this->keyLen, true);
    var_dump($key);
    $hash = openssl_encrypt($unencryptedString, 'AES-128-CBC', $key,  OPENSSL_RAW_DATA, $this->iv);

    $encoded = base64_encode($hash);

    return $encoded;

}

我想我没有像在 Java 上那样使用 iv/salt 参数,这就是为什么它不会产生同样的东西。有什么建议吗?

【问题讨论】:

    标签: java php encryption cryptography


    【解决方案1】:

    基础知识(你做得很好!)

    您应该始终使用标准库进行 PHP 加密。

    我知道我们不应该提出建议,但我认为加密有点例外,您应该使用久经考验的库。

    使用openssl 扩展或libsodium

    使用这两种方法的答案都链接在这里。

    How to encrypt plaintext with AES-256 CBC in PHP using openssl()?

    How to encrypt / decrypt AES with Libsodium-PHP

    有问题?

    就您的实现而言,我认为$iv$key 对于hex2bin() 的输入格式不正确

    $iv = ['0xA7', '0x71', '0x1F', '0xF5', '0x5D', '0xD2', '0x28', '0x8F'];
    array_map("hex2bin", $iv);
    
    // outputs Warning: hex2bin(): Input string must be hexadecimal string
    

    【讨论】:

    • 嗨,卢克,感谢您的反馈。我已经在使用 openssl 扩展,只是不确定如何正确输入参数...这些示例使用随机键作为示例。
    • 感谢更新,这是一个很好的起点。我更新了 iv/salt 值,使所有内容都为小写。
    • 我可以在这里找到十六进制值的匹配项:numbermonk.com/hexadecimal/203/en 但 PHP 一直显示相同的错误,知道吗?
    • 0xA7 我认为应该只是00A7 - 我认为0x 表示法是为了让人们知道编码是hex
    【解决方案2】:

    遵循@Luke 的建议:

    删除 0x 并在所有 iv/salt 值中使用小写似乎可以做到这一点。

    private $salt = ['a7', '71', '1f', 'f5', '5d', 'd2', '28', '8f'];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2018-08-16
      • 2021-09-13
      • 2012-03-28
      • 2011-02-26
      相关资源
      最近更新 更多