我对当前尝试访问的API的加密有以下要求:
每次我使用加密提交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;
}
问题:
答案 0 :(得分:5)
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的相同加密无法区分。 Wikipedia可以很好地描述这实际上是做什么的。
请记住,每次迭代都必须随机生成IV。否则,只观察密文的攻击者可能会发现您多次加密相同的明文。
请记住,AES密钥应该在高熵的情况下非常嘈杂。 “12345 ......”看起来更像是一个密码。如果要使用密码,则需要从该密码派生密钥。 PBKDF2是随机盐和大量迭代的好主意。
答案 1 :(得分:-1)
PKCS7填充方法究竟是什么,可以用php实现?
我不确定&#39;填充&#39;这是你在这里的意思。虽然PKCS#7格式确实依赖于padding,但您提供的示例与asymmetric encryption和ASN.1所提及的PKCS#7消息传递语法格式完全无关。 / p>
AES 256很好,但块大小究竟是什么意思?
Block size是加密密码的位大小,如AES-256,对每个排列进行操作。
IV究竟做了什么?
IV是initialization vector的缩写,或者对于某些对称加密密码实现,它也可以称为nonce。
两者都用于帮助加强生成的密文。您可以将它们视为与salt类似的非可逆散列算法。
你应该避免重复使用相同的IV。
关于你的榜样; openssl_encrypt()的文档说明了以下函数用法:
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);