我如何使用 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 加密?