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

带填充的AES 256加密PHP

长孙阳焱
2023-03-14

我对我当前尝试访问的API的加密有以下要求:

    < li>PKCS7填充方法 < li>CBC加密模式 < li>AES密钥大小256,块大小128

每次我提交带有加密的API时,API似乎都有问题(不幸的是没有产生错误)。

$Data = "GOOD!";
$aesKey = "1234567812345678";

$EncryptedData = encrypt($aesKey,$Data);
$DecryptedData = decrypt($aesKey,$EncryptedData);

echo "Orignal Data : ". $Data;
echo "<br/>";
echo "After encryption = ". $EncryptedData;
echo "<br/>";
echo "After decryption = " .$DecryptedData;

function encrypt($aesKey, $dataToEncrypt) {
    $output = false;
    $iv = '{{{{{{{{{{{{{{{{';
    $output = openssl_encrypt($dataToEncrypt, 'AES-128-CBC', $aesKey,
    OPENSSL_RAW_DATA, $iv);
    $output = base64_encode($output);
    return $output;
}

function decrypt($aesKey, $dataTodecrypt) {
    $output = false;
    $iv = '{{{{{{{{{{{{{{{{';
    $dataTodecrypt = base64_decode ($dataTodecrypt);
    $dataTodecrypt = $output = openssl_decrypt($dataTodecrypt, 'AES-128-CBC',
    $aesKey, OPENSSL_RAW_DATA, $iv);
    return $output;
}

问题:

  • PKCS7填充方法到底是什么,可以用php实现?
  • AES 256很好,但是块大小到底是什么意思?
  • IV到底是做什么的?

共有2个答案

冯阳华
2023-03-14

PKCS7填充方法到底是什么,可以用php实现?

我不确定“填充”是您在这里的意思。虽然PKCS#7格式确实依赖于填充,但您提供的示例与非对称加密和提到的PKCS#7消息传递语法的ASN.1格式完全无关。

AES 256很好,但是块大小到底意味着什么呢?

块大小是加密密码(如 AES-256)对每个排列进行操作的位大小。

IV究竟做什么?

IV 是初始化向量的缩写,对于某些对称加密密码实现,它也可以称为随机数。

两者都用于帮助加强生成的密文。您可以将它们视为类似于不可逆哈希算法的盐。

您应该避免重复使用相同的IV。

关于你的例子;opensslencrypt()的文档说明了以下函数用法:

string openssl_encrypt ( string $data , string $method , string $password [, int $options = 0 [, string $iv = "" ]] )

您对纯文本的加密看起来很准确(而我会选择 AES-256-GCM 与 AES-128-CBC 作为算法,块大小

$output = openssl_encrypt($dataToEncrypt, 'AES-128-CBC', $aesKey,
    OPENSSL_RAW_DATA, $iv);

在没有测试的情况下,我假设您得到的是一个有效的base64编码值。

openssl_decrypt()方法的手册规定了以下用法:

string openssl_decrypt ( string $data , string $method , string $password [, int $options = 0 [, string $iv = "" ]] )

虽然技术上您的实现是正确的;我建议如下(注意$dataTodecrypt=$output=openssl_decrypt()的双重赋值):

$output = openssl_decrypt(base64_decode($dataTodecrypt), 'AES-128-CBC', $aesKey, OPENSSL_RAW_DATA, $iv);
韩喜
2023-03-14

AES 256很好,但是块大小到底意味着什么呢?

AES具有128位的固定块大小。分组密码只适用于特定大小的一个块。模式操作扩展了分组密码,使其能够处理多个块,而填充使其可以处理不是块大小的倍数的明文。

AES-128-CBC是指密钥大小为128位的AES和CBC操作模式。如果您想使用AES-256,那么您需要告诉OpenSSL:AES-256-CBC。此外,您需要使用实际为256位长的密钥。您当前的密钥只有128位长。

PKCS7填充方法到底是什么,可以用php实现?

openssl_encrypt()已经为您执行PKCS#7填充,openssl_decrypt()为您删除它。

IV究竟做什么?

随机IV使密文随机化,这意味着用相同的密钥加密相同的明文,但不同的IV产生不同的密文,这与随机噪声或其他用不同的IV进行的相同加密无法区分。

请记住,每次迭代都必须随机生成IV。否则,只观察密文的攻击者可能会发现您多次加密了同一明文。

请记住,AES密钥应该具有很高的噪声和高熵。“12345…”看起来更像一个密码。如果您想使用密码,那么您需要从该密码导出密钥。PBKDF2是一个具有随机盐和大量迭代的好主意。

 类似资料:
  • 问题内容: 我的任务是编写一个涉及加密的小型Java控制台应用程序。我对加密不熟悉,因此我必须先阅读一些内容。到目前为止,给出的高级要求是应使用AES-256生成一次性密钥来加密文件。 之后,应使用收件人的公共密钥(RSA-2048)来加密该AES-256一次性密钥。然后将加密的文件和加密的一次性AES-256密钥压缩并发送给收件人。 从我对读取的加密和解密的了解中,除了算法(RSA,AES等)之

  • 我的任务是编写一个涉及加密的小型Java控制台应用程序。我对加密不熟悉,所以我必须先读一读。到目前为止,给出的高级要求是AES-256应该用于生成一个一次性密钥来加密文件。 之后,应使用收件人的公钥(RSA-2048)加密该AES-256一次性密钥。加密的文件和加密的一次性AES-256密钥然后将被拉链并发送给收件人。 根据我对加密和解密的理解,除了算法(RSA、AES等)之外,还有一些叫做模式和

  • 我正在尝试将aes-128-cbc加密与openssl一起使用,我希望密钥需要32位。但是,我注意到当我输入密钥长度为18时,openssl不会给我错误。 但是,如果我在密钥后添加0,直到它是32位,我仍然会得到相同的结果。 有文档说OpenSSL给键添加了填充吗? 编辑:我需要在代码中重现此行为。我得到了密钥,但不能保证密钥是多少位数。

  • 这应该是一个简单的问题,但我无法从openssl文档中找到任何示例或答案。 我想加密128位,应该适合一个加密块。 所以我调用,然后呢? 我是否调用(加密 128 位块)和(即使没有更多要加密的内容)? 还是只有?还是只有?

  • 我正在尝试将java代码转换为NodeJs代码。这有点复杂,因为定制的格式包括密码和salt。 在main方法中有一个例子。 以下是我的java代码: 我正在尝试下面这样的JS代码,但不知道我做错了什么: 它抛出一个错误: 谢谢

  • 要求: 我有一个Ruby on rails应用程序,我需要执行以下操作。 以下字符串应使用3DES算法和工作密钥加密。ABJGTU9的加密值将是vV51P0OGXt0= 工作密钥为 A5157A0D77B24AEA868AD73288366826 以下文献中提到的3DES算法使用以下步骤进行数据加密: i.使用CBC密码模式和PKCS7填充的密钥的左侧部分加密数据。ii.使用CBC密码模式和无填充