【问题标题】:TripleDES encryption in c# and php is not samec#和php中的TripleDES加密不一样
【发布时间】:2011-12-11 08:52:24
【问题描述】:

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# 代码有什么问题?

【问题讨论】:

  • / 在 C# 代码中,8 在 PHP 代码中。请在此处提问时复制并粘贴您的代码,而不是重新输入。
  • 抱歉我的打字错误。但我的问题没有解决
  • 现在你已经完全忽略了8不要重新输入。复制。和。粘贴。 :)
  • 只需使用查找和替换来编辑您的数据

标签: c# php encryption interop cryptography


【解决方案1】:

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

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

Encoding.ASCII.GetString(enc)

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

我也不能告诉你代码是什么样的:

ec.GetBytes("Your key here");

会吗?!?如果您使用的是 Unicode 编码器,那么它不会为您提供与 ASCII 编码器相同的功能。

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

【讨论】:

  • 感谢您的回答。我使用 1252 编码而不是 ASCII 并且我的问题解决了。感谢您的任何回答。
猜你喜欢
  • 2011-06-09
  • 2023-03-25
  • 1970-01-01
  • 2019-12-17
  • 2011-01-28
  • 1970-01-01
  • 2016-12-04
  • 2014-07-07
  • 1970-01-01
相关资源
最近更新 更多