我有这个PHP脚本,我们需要转换为C#来解码API post请求的结果,但是我遇到了C#实现的问题。
我们在运行PHP脚本XXXX-XXXX-XXXX
时得到的结果很好但是得到了不同的错误。
值为:
encodedText = "U8Q+m2zpFMLa/3gYILHx5w=="
key = "examplesecret"
keyHash = "6315046b2c085bbeeab87c65"
Php脚本:
<?php
$secret = 'examplesecret';
$encrypted_code = 'U8Q+m2zpFMLa/3gYILHx5w==';
// Base64
// Decode
$encrypted_code = base64_decode( $encrypted_code );
// Create decryption module
$cipher = mcrypt_module_open( 'tripledes', '', 'ecb', '' );
$keysize = mcrypt_enc_get_key_size( $cipher ); // = 24
// Generate key
$hash = md5( $secret );
$key = substr( $hash, 0, $keysize );
// Initialise decrypter
$iv = mcrypt_create_iv( mcrypt_enc_get_iv_size( $cipher ),
MCRYPT_DEV_RANDOM );
mcrypt_generic_init( $cipher, $key, $iv );
// Decrypt code
$decrypted = mdecrypt_generic( $cipher, $encrypted_code );
// Output decrypted code
echo $decrypted;
?>
C#脚本
public static string Decrypt(string encodedText, string key)
{
TripleDESCryptoServiceProvider desCryptoProvider = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5Provider = new MD5CryptoServiceProvider();
byte[] byteHash;
byte[] byteBuff;
byteHash = hashMD5Provider.ComputeHash(Encoding.UTF8.GetBytes(key));
desCryptoProvider.Key = byteHash;
desCryptoProvider.Padding = PaddingMode.None;
desCryptoProvider.Mode = CipherMode.ECB; //CBC, CFB
byteBuff = Convert.FromBase64String(encodedText);
var byteHex = BitConverter.ToString(byteBuff).Replace("-", " ");
string plaintext = Encoding.UTF8.GetString(desCryptoProvider.CreateDecryptor().TransformFinalBlock(byteHex, 0, byteHex.Length));
return plaintext;
}
答案 0 :(得分:2)
我看到的一些事情:
$key
;但是只需要在C#中获取MD5的输出,它们是否相同? (例如,如果PHP的值是一个十六进制字符串,那么MD5的16个字节是32个字符,它被转换为24个字符,是一个12字节(96位)的值;在C#中它是#s;&#39; s 16字节)TripleDES.Create()
优先于new TripleDESCryptoServiceProvider()
,MD5.Create()
优先于new MD5CryptoServiceProvider()
;并将变量键入TripleDES和MD5。但问题最可能的罪魁祸首是,您并未在两种语言中生成相同的密钥。