加密:使用vb.net,我得到的结果与php不同



我有这个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,另请参阅此处

最新更新