使用AES

时间:2017-10-10 18:30:48

标签: php encryption aes

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

  • 加密密钥:myKey-1234567abcdef
  • AES-256加密
  • 128块大小
  • PKCS7 padding
  • 16位向量(在加密消息之前附加向量)
  • Cipher Block Chaining(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函数的选项,想知道我的实现是否满足填充,块大小和向量的需求?

我感谢任何建议,提前谢谢!

1 个答案:

答案 0 :(得分: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)以获得未编码的输出。