带填充的AES 256加密PHP

Sop*_*des 3 php encryption cryptography

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

  • PKCS7填充方法
  • CBC加密模式
  • 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;
}
Run Code Online (Sandbox Code Playgroud)

问题:

  • 究竟什么是PKCS7填充方法并且可以用php实现?
  • AES 256很好,但块大小究竟是什么意思?
  • IV究竟做了什么?

Art*_* B. 6

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是随机盐和大量迭代的好主意.