繁体   English   中英

c#和php中的TripleDES加密不一样

[英]TripleDES encryption in c# and php is not same

PHP代码

define('SECRET', 'Your key here');
$data = 'test';

$enc = mcrypt_cbc(MCRYPT_TRIPLEDES, SECRET, $data, MCRYPT_ENCRYPT, '12345678');

$url .= urlencode($password);

C#代码

byte[] key = ec.GetBytes("Your key here");
byte[] iv = ec.GetBytes("12345678");
byte[] data = ec.GetBytes("test");
byte[] enc = new byte[0];
TripleDES tdes = TripleDES.Create();
tdes.IV = iv;
tdes.Key = key;
tdes.Mode = CipherMode.CBC;
tdes.Padding = PaddingMode.Zeros;
ICryptoTransform ict = tdes.CreateEncryptor();
enc = ict.TransformFinalBlock(data, 0, data.Length);

string szEnc = HttpContext.Current.Server.UrlEncode(
    Encoding.ASCII.GetString(enc)
    );

我的问题:PHP中的$ url和c#中的szEnc的值不相同。

问题:我的c#代码有什么问题?

很多事情都可能出错 - 但在处理stringbyte[]时,我看到了很多编码(即非加密)问题。

永远不要假设他们会转换成任何东西,包括ASCII。

Encoding.ASCII.GetString(enc)

如果你有不可打印的字符,NUL ...那么这将不是返回字符串的一部分,也不会被url编码。 这对于PHP来说是真的,但并不意味着它在每种情况下都遵循相同的规则。

另外我不能告诉你什么代码:

ec.GetBytes("Your key here");

会做 ?!? 如果您使用的是Unicode编码器,那么它将不会与ASCII编码器相同。

除了编码之外,还要检查您使用的PaddingMode是否与PHP使用的匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM