gpt4 book ai didi

c# - 如何在 PHP 中解密在 C# 中使用 3DES 加密的字符串?

转载 作者:行者123 更新时间:2023-11-30 22:34:25 25 4
gpt4 key购买 nike

我正在使用以下代码解码我的 C# 程序中的字符串,但我还需要能够使用 PHP 在服务器端解密相同的字符串。以下 C# 代码在 PHP 中是否有等效项?

public static string DecryptString(string Message, string Passphrase)
{
byte[] Results;
System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

// Step 1. We hash the passphrase using MD5
// We use the MD5 hash generator as the result is a 128 bit byte array
// which is a valid length for the TripleDES encoder we use below

MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));

// Step 2. Create a new TripleDESCryptoServiceProvider object
TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();

// Step 3. Setup the decoder
TDESAlgorithm.Key = TDESKey;
TDESAlgorithm.Mode = CipherMode.ECB;
TDESAlgorithm.Padding = PaddingMode.PKCS7;

// Step 4. Convert the input string to a byte[]
byte[] DataToDecrypt = Convert.FromBase64String(Message);

// Step 5. Attempt to decrypt the string
try
{
ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
}
finally
{
// Clear the TripleDes and Hashprovider services of any sensitive information
TDESAlgorithm.Clear();
HashProvider.Clear();
}

// Step 6. Return the decrypted string in UTF8 format
return UTF8.GetString(Results);

}

最佳答案

要在 PHP 中获取 MD5 哈希值,请使用 $key = md5($passphrase, true) .第二个参数为您提供原始输出而不是其十六进制编码。

要使用 Triple DES 加密/解密,您可以使用 mcrypt模块。最简单的形式:

$ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CBC);

注意事项:

  • Triple DES 使用 192 位 key ,但您有一个 128 位 key 。 PHP 用空值填充键,但 .NET 不允许这样的键。相反,它将前 8 个字节附加到末尾。
  • .NET 使用 PCKS7 填充,PHP 使用零填充。

要解决这些不兼容问题,您必须对标准代码进行一些修改。这是从 post on php.net 中提取的:

function encryptNET3DES($key, $vector, $text){
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');

// Complete the key
$key_add = 24 - strlen($key);
$key .= substr($key, 0, $key_add);

// Padding the text
$text_add = strlen($text)%8;
for ($i=$text_add; $i<8; $i++){
$text .= chr(8-$text_add);
}

mcrypt_generic_init($td, $key, $vector);
$encrypt64 = mcrypt_generic($td, $text);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

// Return the encrypt text in 64 bits code
return $encrypt64;
}

最后,要编码/解码 base64 字符串,请使用 base64_encodebase64_decode()

关于c# - 如何在 PHP 中解密在 C# 中使用 3DES 加密的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7837480/

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