我如何使用 php 生成 AES-256 对称密钥

Posted

技术标签:

【中文标题】我如何使用 php 生成 AES-256 对称密钥【英文标题】:how do i generate a AES-256 symmetric key using php 【发布时间】:2016-04-25 23:06:24 【问题描述】:

我确实环顾四周 - 并在谷歌上到处寻找这个问题的直接和明确的答案,但一无所获。所以这里简单明了的是或否会很棒......

我被要求创建一个“AES-256 对称(也称为“会话”)密钥” - 不是加密,只是密钥 - 用于在肥皂消息标头中签署数据。要求是密钥是 256“大小”... 是的,我知道...

我知道 MCRYPT_RIJNDAEL_128 大小 32 实际上是 php 中的 AES-256 密码。我读了所有这些。

我知道有人问我是否有适用于他们的 java 实现。我必须使用 php。我有以下代码: `

$keysize = mcrypt_module_get_algo_key_size(MCRYPT_RIJNDAEL_128);
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '',MCRYPT_MODE_CBC, '');
$keysize = 32;
while (strlen($key) < $keysize) $key =  mcrypt_create_iv(mcrypt_enc_get_iv_size ($td),MCRYPT_RAND);  

这确实给了我一个原始的“钥匙”。

问题:“AES-256 会话/对称密钥”上方的原始密钥是否可用于签署肥皂安全标头?

在使用原始密钥进行签名后,它会使用来自公共证书的密钥(使用 rsa-oaep-mgf1p)进行加密,并嵌入到标头中(EncryptedKey 标记)。它必须在另一端解密并用于验证签名标头的摘要......然后 gandalf 出现......

我之所以问,是因为对方(使用 java)告诉我“对称密钥的生成方式有问题”,但没有明确解释它有什么问题以及如何纠正错了。

有人可以帮忙吗?我会很感激的......

谢谢。

【问题讨论】:

可能是这样,但是这段代码太复杂了。 好的。所以随机字节()或openssl_random_pseudo_bytes()更好?!另外 - 没有任何迹象表明这一点,但因为我必须加密密钥 - 我必须在加密之前对其进行 base64_encode 吗?我在肥皂安全上找到的代码加密了原始密钥。只是确保我可以有足够的信息。谢谢。 是的,这两种选择在代码方面更好,因为您不必使用循环。我没有使用 SOAP 加密的经验,所以不知道生成密钥后如何使用它。 【参考方案1】:

你的方法没问题。但更简单的方法是

random_bytes(32)

openssl_random_pseudo_bytes(32)

如果你的 php 版本低于 7.0。

您可能还想生成一个 16 字节的 IV

random_bytes(16)

【讨论】:

我要strongly discourage openssl_random_pseudo_bytes。

以上是关于我如何使用 php 生成 AES-256 对称密钥的主要内容,如果未能解决你的问题,请参考以下文章

python Crypto AES-256-ECB 与PHP之间完成加解密

如何在 Android 中使用自己的密钥进行 AES-256 加密?

如何在 PHP 中进行 AES256 解密?

在目标 c 中,如何使用 md5 作为密钥进行 AES256 加密?

Android 中的 AES 密钥生成

使用 PBKDF2 和 AES256 进行加密和解密 - 需要实际示例 - 如何获取派生密钥