2017-10-10 165 views
0

我正在使用以下要求處理需要使用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

回答

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)的第四個參數以獲得未編碼的輸出。

+0

感謝您的回覆。而且,對不起,是的,他們確實要求AES-256加密(請參閱編輯)。 – AnchovyLegend

+0

值得明確指出的是,你不應該使用mcrypt,因爲它已被棄用,並且還沒有被多年積極維護。 – Sammitch

+0

解密怎麼樣?我需要爲此提供相同的矢量嗎? – AnchovyLegend