我使用以下代码来解码我的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中使用$key = md5($passphrase, true)
获取MD5哈希值。第二个参数给出原始输出,而不是十六进制编码。
要使用Triple DES加密/解密,可以使用mcrypt
模块。最简单的形式:
$ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CBC);
注意事项:
- 三重DES使用192位密钥,但你有一个128位密钥。PHP用空填充键,但是。net不允许这样的键。相反,它将前8个字节附加到末尾。
- 。. NET使用PCKS7填充,PHP使用零填充。
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_encode
和base64_decode()
我想解密代码从.net
到php
。我的.net
加解密方法如下:
public class EncryptDecrypt
{
private byte[] TDES_Key = { 0x01, 0x04, 0x01, 0x01, 0x01, 0x09, 0x07, 0x08, 0x01, 0x09, 0x07, 0x08, 0x01, 0x01, 0x02, 0x04 };
private byte[] tdesIV;
public string Encrypt(string textToEncrypt,string KeyVI)
{
tdesIV = GetLegalKey(KeyVI);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = TDES_Key;
tdes.IV = tdesIV;
byte[] buffer = Encoding.ASCII.GetBytes(textToEncrypt);
return Convert.ToBase64String(tdes.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length));///
}