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乐于帮助。对你来说很好,因为它迫使密切的开源开发者实施更安全的方法! –