TripleDES шифрование в C # и PHP не то же самое - PullRequest
0 голосов
/ 10 декабря 2011

код 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)
    );

Моя проблема: значение $ url в PHP и szEnc в c # не одно и то же.

Вопрос: что не так в моем коде c #?

1 Ответ

2 голосов
/ 11 декабря 2011

Многое может пойти не так - но я видел довольно много проблем с кодированием (то есть, не криптографией) при работе с string и byte[].

Никогда не предполагайте, что они преобразуются вчто угодно, включая ASCII.

Encoding.ASCII.GetString(enc)

Если у вас непечатаемые символы, NUL ..., тогда не будет частью возвращаемой строки и не будет кодироваться в URL.Это истинно для PHP, но это не значит, что оно следует одному и тому же правилу в каждом случае.

Также я не могу сказать вам, как будет выглядеть код:

ec.GetBytes("Your key here");

?!?Если вы используете кодировщик Unicode, то он не даст вам того же, что и кодировщик ASCII.

Помимо кодирования также проверьте, что PaddingMode, который вы используете, соответствует тому, который используется PHP.

...