使用AES加密SOAP信封

问题描述:

我正在使用以下要求处理需要使用SOAP信封进行AES加密的项目。使用AES加密SOAP信封

  • 加密密钥: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,想知道如果我的实现满足填充,块大小和矢量需求?

我很欣赏任何建议,提前致谢!

+2

AES是MCRYPT_RIJNDAEL_128,不是256混淆......这可能有助于https://gist.github.com/lkorth/4061732这是一种混乱的事情,这就是为什么我删除了我的答案。 – ArtisticPhoenix

第一:您的密钥不适合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)的第四个参数以获得未编码的输出。

+0

感谢您的回复。而且,对不起,是的,他们确实要求AES-256加密(请参阅编辑)。 – AnchovyLegend

+0

值得明确指出的是,你不应该使用mcrypt,因为它已被弃用,并且还没有被多年积极维护。 – Sammitch

+0

解密怎么样?我需要为此提供相同的矢量吗? – AnchovyLegend