2
下面的代碼是一個簡單的.NET代碼片段,其輸入爲test
,它返回p+cTm2VODfvQnreAl02wUQ==
作爲輸出。將.net aes256加密代碼轉換爲php
Dim aesEncryptObj As New System.Security.Cryptography.RijndaelManaged()
Dim encoder As System.Text.ASCIIEncoding = New System.Text.ASCIIEncoding()
Dim tempKey As Byte() = encoder.GetBytes("00000011111111111111111111111111")
aesEncryptObj.Key = tempKey
aesEncryptObj.BlockSize = 128
aesEncryptObj.Mode = System.Security.Cryptography.CipherMode.ECB
aesEncryptObj.Padding = System.Security.Cryptography.PaddingMode.PKCS7
aesEncryptObj.GenerateIV()
Dim EncryptedBytes As Byte()
Dim encryptor As System.Security.Cryptography.ICryptoTransform = aesEncryptObj.CreateEncryptor(aesEncryptObj.Key, aesEncryptObj.IV)
Using msEncrypt As New System.IO.MemoryStream()
Using csEncrypt As New System.Security.Cryptography.CryptoStream(msEncrypt, encryptor, System.Security.Cryptography.CryptoStreamMode.Write)
Using swEncrypt As New System.IO.StreamWriter(csEncrypt)
swEncrypt.Write(txtInput.Text)
End Using
EncryptedBytes = msEncrypt.ToArray()
End Using
End Using
txtOutput.Text = Convert.ToBase64String(EncryptedBytes)
現在,這裏是PHP代碼:
const ENCRYPT_METHOD = 'aes-256-ecb';
$aesKey = pack('H*', '00000011111111111111111111111111');
$ivSize = openssl_cipher_iv_length(ENCRYPT_METHOD);
$plainText = "test";
$iv = openssl_random_pseudo_bytes($ivSize);
$cipherText = openssl_encrypt(
$plainText,
ENCRYPT_METHOD,
$aesKey,
OPENSSL_RAW_DATA,
$iv
);
$encryptedText = $iv . $cipherText;
echo base64_encode($encryptedText);
它返回1W3UvYVNKWEoFrpPZPd+Qw==
從.NET一個不同。我已經嘗試了aes-256-ecb和aes-128-ecb,結果總是與.NET不同。
據我所知,openssl_encrypt
默認做PKCS7填充,是嗎?你能看到PHP給出不同結果的原因嗎?
謝謝您對該問題的完整分析。我將進一步調查並在當天晚些時候接受答案。 –
你釘了它!我知道ECB模式並不安全,但是我正在使用一個封閉源設備向我發送加密數據。這將是接下來要做的事 - 當通信協議驗證完全實施時,要求改變模式。再次感謝你,你保存了我的一天,因爲我幾乎沒有.NET知識,是的,我們很可能會使用CBC。 –
@StanimirStoyanov樂於幫助。對你來說很好,因爲它迫使密切的開源開發者實施更安全的方法! –