Sta*_*nov 2 .net php encryption aes php-openssl
下面的代码是一个简单的.NET代码段,test在输入上它p+cTm2VODfvQnreAl02wUQ==作为输出返回.
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)
Run Code Online (Sandbox Code Playgroud)
现在,这是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);
Run Code Online (Sandbox Code Playgroud)
它的返回值1W3UvYVNKWEoFrpPZPd+Qw==与.NET的不同.我已经尝试了aes-256-ecb和aes-128-ecb,结果总是与.NET的不同.
据我所知,openssl_encrypt默认情况下做PKCS7填充,是吗?你能看出PHP给出不同结果的原因吗?
您的代码无效,因为:
GetBytes在.NET中返回该字符串的字节值.也就是说,您将获得长度为32(AES-256)的字节数组.但是,pack在PHP中使用H*十六进制字符串进行解码,这将为您提供长度为16的密钥(AES-128).这整个时间你不仅使用两个不同的密钥加密,而且使用两种不同的密钥大小.修复上述内容将使您的代码工作,但它实际上远非安全,不应使用. 如果您想使代码安全,您需要:
GenerateIV方法是好的.