gpt4 book ai didi

php - 将.net aes256加密代码转换为php

转载 作者:行者123 更新时间:2023-12-02 15:20:51 25 4
gpt4 key购买 nike

下面的代码是一个简单的 .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)

现在,这是 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);

它返回与 .NET 不同的 1W3UvYVNKWEoFrpPZPd+Qw==。我尝试了 aes-256-ecb 和 aes-128-ecb,结果总是与 .NET 的不同。

据我所知,openssl_encrypt 默认情况下会进行 PKCS7 填充,对吗?你能看出 PHP 给出不同结果的原因吗?

最佳答案

您的代码无法运行,因为:

    .NET 中的
  • GetBytes 返回该字符串的字节值。也就是说,您将得到一个长度为 32 (AES-256) 的字节数组。然而,PHP 中的 pack 使用 H* 解码十六进制字符串,这将为您提供长度为 16 (AES-128) 的 key 。整个过程中,您不仅使用两个不同的 key 进行加密,而且还使用两个不同的 key 大小

修复上述问题将使您的代码正常工作,但它远非真正安全,不应该使用。如果您想让代码安全,您需要:

  • 停止使用 ECB 模式。如果可以,请使用 GCM 模式,否则使用 CBC。您很可能最终会使用 CBC。如果这样做,您需要将 IV 添加到密文中,以便解密方可以检索它并在解密时使用它。 IV 不需要保密,只需是随机的,因此使用 OpenSSL 随机字节和 GenerateIV 方法很好。
  • 由于您可能会使用 CBC 模式,因此您需要应用 HMAC 来确保完整性。否则任何人都可以修改你的密文而你却不会知道。应用 HMAC 时,始终先加密然后-mac。请记住应用 HMAC 之前添加您的 IV。
  • 最后,我认为您实际上并不打算这样做,但永远不要使用字符串的 ASCII 值作为键。如果您想从密码短语创建 key ,您应该应用 KDF。 PBKDF2 可能是最合适的,并且在 PHP 和 .NET 中都有实现。

关于php - 将.net aes256加密代码转换为php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41011403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com