我有这个php代码
$plain_text = "abc";
$salt = "123";
echo $encrypted_text = openssl_encrypt($plain_text, "AES-128-ECB", $salt);
// result: kR/1uaFarptS5+n951MVsQ==
我在vb.net上尝试了几种方法(类和函数(,但每次使用这种语言加密的结果都与上面使用php不同。例如这个:
Public Function AES_Encrypt (ByVal input As String, ByVal pass As String) As String
Dim AES As New System.Security.Cryptography.RijndaelManaged
Dim Hash_AES As New System.Security.Cryptography.MD5CryptoServiceProvider
Dim encrypted As String = ""
Try
Dim hash (31) As Byte
Dim temp As Byte () = Hash_AES.ComputeHash (System.Text.ASCIIEncoding.ASCII.GetBytes (pass))
Array.Copy (temp, 0, hash, 0, 16)
Array.Copy (temp, 0, hash, 15, 16)
AES.Key = hash
AES.Mode = Security.Cryptography.CipherMode.ECB
Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor
Dim Buffer As Byte () = System.Text.ASCIIEncoding.ASCII.GetBytes (input)
encrypted = Convert.ToBase64String (DESEncrypter.TransformFinalBlock (Buffer, 0, Buffer.Length))
Return encrypted
Catch ex As Exception
End Try
End Function
sEnc = AES_Encrypt("abc", "123")
Console.WriteLine(sEnc)
'result: Z3hCHcS0b2zJ7fEod3jcrw==
请使用vb.net(没有C#(,我如何才能得到结果;kR/1uaFarptS5+n951MVsQ==";该文本的加密";abc";以及盐";123〃;使用算法";AES-128-ECB";?
由于PHP代码中的规范AES-128-ECB
,AES-128在ECB模式下使用,即密钥长16字节。但是,由于只应用了一个3字节大的密钥(123
(,PHP使用0x00
值填充到16字节的必要大小。请注意,如果键太长,它将被截断。
在VB代码中,使用了一个32字节的键。由于在.NET中,密钥大小决定AES变体,因此应用AES-256。此外,传递的密钥不是直接使用的,而是通过摘要MD5从传递的值中派生出实际的密钥。
为了让VB代码返回PHP代码的结果,PHP代码的逻辑必须在VB代码中实现:
。。。'将哈希(31(标注为字节'Dim-temp As Byte((=Hash_AES.ComputerHash(System.Text.ASCIIEEncoding.ASCI.GetBytes(pass(('数组.Copy(临时,0,哈希,0,16('数组.副本(temp,0,hash,15,16('AES.Key=哈希Dim键填充(15(为字节Dim键=System.Text.ASCIIEEncoding.ASCII.GetBytes(通过(Array.Copy(key,0,keyPadded,0,Math.Min(16,key.Length((AES.Key=键盘填充…
几句话:
- 在PHP代码中,密钥被称为
$salt
。这是一种误导,因为盐有不同的含义 - 欧洲央行的模式通常是不安全的
- AES-128使用一个16字节的密钥。
123
不是一个强密钥(但可能这只是一个伪值( - 如果
123
不代表密钥,而是从中派生密钥的密码,那么通常不应该使用MD5,而应该使用专门设计的算法,如PBKDF2或Argon2,另请参阅此处