首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AES 256加密PHP填充

AES 256加密PHP填充
EN

Stack Overflow用户
提问于 2015-10-28 22:52:06
回答 2查看 12.8K关注 0票数 5

对于我目前试图访问的API,我得到了以下加密要求:

  • PKCS7填充法
  • CBC加密模式
  • AES键大小256,块大小128

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

代码语言:javascript
复制
$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很好,但是块大小到底意味着什么呢?
  • 静脉输液到底是做什么的?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-28 23:09:47

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。否则,只观察到密文的攻击者可能会发现您对同一明文进行了多次加密。

请记住,AES密钥应该是相当嘈杂的高熵。“12345…”看上去更像是密码。如果要使用密码,则需要从该密码派生密钥。PBKDF2是一个很好的主意,有一个随机盐和大量的迭代。

票数 9
EN

Stack Overflow用户

发布于 2015-10-28 23:18:18

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

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

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

块大小是加密密码的比特大小,就像AES-256一样,对每个置换进行操作。

静脉输液到底是做什么的?

IV是初始化向量的缩写,或者是一些对称加密密码实现的缩写,它也可以称为纳塞

这两种方法都用于帮助增强结果的密码文本。您可以认为它们类似于不可逆散列算法的

你应该避免重复使用相同的静脉输液。

关于您的示例,加密()的文档说明了以下函数的用法:

代码语言:javascript
复制
string openssl_encrypt ( string $data , string $method , string $password [, int $options = 0 [, string $iv = "" ]] )

您对纯文本的加密看起来很准确(虽然我会选择AES-256-GCM和AES-128-CBC作为算法、块大小和模式):

代码语言:javascript
复制
$output = openssl_encrypt($dataToEncrypt, 'AES-128-CBC', $aesKey,
    OPENSSL_RAW_DATA, $iv);

未经测试,我假设您得到的是一个有效的base64编码值。

解密()方法的手册说明了以下用法:

代码语言:javascript
复制
string openssl_decrypt ( string $data , string $method , string $password [, int $options = 0 [, string $iv = "" ]] )

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

代码语言:javascript
复制
$output = openssl_decrypt(base64_decode($dataTodecrypt), 'AES-128-CBC', $aesKey, OPENSSL_RAW_DATA, $iv);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33402956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档