【问题标题】:Encrypting SOAP envelope using AES使用 AES 加密 SOAP 信封
【发布时间】:2018-03-22 06:20:00
【问题描述】:

我正在开展一个项目,该项目需要使用以下要求对肥皂信封进行 AES 加密。

  • 加密密钥:myKey-1234567abcdef
  • AES-256 加密
  • 128 块大小
  • PKCS7 填充
  • 16位矢量(矢量附加在加密消息之前)
  • 密码块链接 (CBC)

这是我尝试过的:

$key = 'myKey-1234567abcdef';
$encryptionMethod = "AES-256-CBC";
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = substr(mcrypt_create_iv($iv_size, MCRYPT_RAND), 0, 16);
$xml = openssl_encrypt($xml,$encryptionMethod, $key, 0, $iv);

我目前收到 400 错误请求错误,并且参数常量 mcrypt 函数似乎有很多选项,想知道我的实现是否满足填充、块大小和向量的需求?

感谢任何建议,在此先感谢!

【问题讨论】:

  • AES 是 MCRYPT_RIJNDAEL_128,而不是 256 令人困惑...这可能会有所帮助gist.github.com/lkorth/4061732 这有点乱,这就是我删除答案的原因。

标签: php encryption aes


【解决方案1】:

首先:您的密钥长度不适合 AES-256。我知道您在这里使用的密钥是一个示例,但请确保您提供的密钥长度为 32 个字符(256 位)。如果不是,请让收件人澄清。

第二:您在这里不恰当地混合了 mcrypt 和 openssl 扩展。无论如何,您不应该使用 mcrypt,因为它没有维护,有时会损坏,并且将在 PHP 7.2 中完全删除。相反,将 IV 大小硬编码为 16 并使用 openssl_random_pseudo_bytes 生成它:

$iv = openssl_random_pseudo_bytes(16);
$xml = openssl_encrypt($xml, $encryptionMethod, $key, 0, $iv);

第三:默认情况下,openssl_encrypt() 将其输出编码为 Base64。收件人可能没有预料到这一点。将OPENSSL_RAW_DATA 作为第四个参数传递给openssl_encrypt()(替换0)以获得未编码的输出。

【讨论】:

  • 感谢您的回复。而且,对不起,是的,他们确实要求 AES-256 加密(见编辑)。
  • 值得明确指出,您不应该使用 mcrypt,因为它已被弃用并且多年未得到积极维护。
  • 解密呢?我需要为此提供相同的向量吗?
猜你喜欢
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
相关资源
最近更新 更多