当前位置: 首页 > 知识库问答 >
问题:

PHP 从 MCRYPT_MODE_ECB 切换到 AES-256-ECB

萧和同
2023-03-14

我正在重写代码以与PHP 7.2兼容

public function encryptPasswordOld($password, $salt)
{
    $key = md5($salt);
    $result = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $password, MCRYPT_MODE_ECB);
    return base64_encode($result);
}

根据我的研究,新代码应该是这样的

public function encryptPasswordNew($password, $salt)
{
    $method = 'AES-256-ECB';
    $ivSize = openssl_cipher_iv_length($method);
    $iv = openssl_random_pseudo_bytes($ivSize);
    $key = md5($salt);
    $result = openssl_encrypt($password, $method, $key, OPENSSL_RAW_DATA, $iv);
    return base64_encode($result);
}

但我尝试了openssl_encrypt选项的每一种组合:openssl_RAW_DATAopenssl_RAW_DATA|openssl _ZERO_PADDINGOPENSL_ZERO-PADDING

共有1个答案

康元凯
2023-03-14

尝试在加密之前对值使用 PKCs5padding 。即

请记住,块大小应基于 8 字节,即 8/16/24 等。

function pkcs5_pad($text, $blocksize)
{
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr(0), $pad);
}

并且加密选项应该是OPENSSL _ RAW _ DATA | OPENSSL _ ZERO _ PADDING,即

openssl_encrypt(pkcs5_pad($value, 16), 'aes-256-ecb', $aes_key, 3, '')
 类似资料:
  • 关于AES有很多问题,但我有以下问题。我目前正在使用以下 AES 实现来加密数据 结果是32字节(256位)。所以我使用的是AES-256。这个实现对我来说太慢了。我如何切换到AES-128?我不需要任何填充或操作模式或密钥散列。 提前谢谢你。

  • 我需要使用AES-256-CBC和PKCS7填充加密用户和密码,以连接到它不是我的.NET服务器应用程序。 首先,我使用Diffie-Hellman算法获得了公共服务器密钥,遵循本网站上的说明: https://doc.developer.milestonesys.com/mipsdkmobile/index.html?base=content_0.html 从服务器获取公钥的代码是: 一旦我拿到

  • 使用最新的RNCryptor源代码并尝试将加密数据发送到PHP脚本。 RNCryptor将IV打包到标头部分中,标头部分附加到实际加密数据中。 我不熟悉在PHP中处理二进制数据,我使用以下解包函数是否正确? 注意:加密数据是在传输前从cocoa编码的Base64。 上面的PHP脚本返回如下数据... 阵列([版本]= 我怎样才能在PHP MCrypt函数中使用它呢? 谢谢。 编辑 为了回应drew

  • 我对我当前尝试访问的API的加密有以下要求: < li>PKCS7填充方法 < li>CBC加密模式 < li>AES密钥大小256,块大小128 每次我提交带有加密的API时,API似乎都有问题(不幸的是没有产生错误)。 问题: PKCS7填充方法到底是什么,可以用php实现? AES 256很好,但是块大小到底是什么意思? IV到底是做什么的?

  • 如何使用PHP安全地生成适用于AES 256哈希数据的密钥? 我尝试过谷歌搜索,找到了大量关于如何使用PHP使用AES 256加密数据的信息,但是所有这些示例都使用了现有的预生成密钥,而我需要在PHP中生成密钥。

  • 问题内容: 我有下面的Java代码来加密使用64个字符的密钥的字符串。我的问题是这将是AES-256加密吗? 以下是结合了divanov和laz建议的代码。 问题答案: 是的,它将是64个字符,即32个字节和256位,并且256位的任何序列都可以用作AES-256密钥。 我建议您使用DatatypeConverter.parseHexBinary(或您选择的库中的类似实用程序)将十六进制字符串转换