【问题标题】:C# and PHP encryption/decryption php problem with keysizeC# 和 PHP 加密/解密 php 的 keysize 问题
【发布时间】:2011-07-06 18:45:28
【问题描述】:

问题是为什么 32 个字符的字符串在 C# .NET 中有效,但在 php mcrypt 中无效,以及如何使它们兼容? (我有一种使用 AES 的方法,3DES 保持打开状态。

我正在尝试创建一个密码学 api,它使用 Microsoft 在 .NET 中的 Crypto Api 和 PHP 的 mcrypt 来加密和解密数据。

C#应该可以加解密,PhP只需要解密。问题是我希望用户能够定义自己的密钥。为此,我对他们输入的密码进行了 md5 哈希处理。这在 C# 端完美运行,但在 PHP 中我得到了

警告:mcrypt_decrypt() [function.mcrypt-decrypt]:第 40 行 C:\xampp\htdocs\failcrypt\crypt.php 中的密钥大小对于该算法来说太大

(一个空的 "" 字符串应该可以工作,以及相当大的键。

我能找到的所有链接都有预设键,但我的必须适用于两边的任意键大小。

        echo $key."</br>";
        echo md5($key)."</br>";
        $newKey = md5($key)."</br>";
        echo strlen($newKey)."</br>";
        $decrypted = mcrypt_decrypt(MCRYPT_3DES, md5($key), base64_decode($msg), MCRYPT_MODE_ECB);
        echo $decrypted;

输出

红色(钥匙)

bda9643ac6601722a28f238714274da4(哈希)

【问题讨论】:

  • 看起来在您运输钥匙时发生了一些事情。我会闻到一个编码问题,但是你写它是一个 MD5 散列,在传输时不应该有明显的编码问题。如何将密钥字符串从 c# 传递给 PHP?
  • @hakre 密钥现在可以硬编码,只是 php 和 c# 必须能够使用相同的密钥
  • 嗯,你在问题中给出的 strlen 是错误的。我得到的是 32,而不是 37。?
  • 您回显的 strlen 包括 &lt;br /> 字符...
  • 是的,我没有注意到,但问题是如何在两边使用相同的字符串(键)。

标签: c# php cryptography


【解决方案1】:

按照您的操作方式,密钥大小永远不会是任意的。它将始终是 MD5 哈希的输出。您正在使用一种(弱)形式的基于密码的密钥派生函数 (PBKDF)。所以关键真的不是字符串“red”,而是MD5函数的输出。

 $ echo red | tr -d [:space:] | openssl dgst
 (stdin)= bda9643ac6601722a28f238714274da4

 $ echo The quick brown fox jumps over the lazy dog. | tr -d [:space:] | openssl dgst
 (stdin)= 09ecfef50e54940a3d241a10b7e70e3c

话虽如此,mcrypt_decrypt 需要原始字节作为密钥。这是工作代码:

 $key = "Use any string you want as a password.";
 $encrypted = base64_decode("OcSlUzWMgac5RxYyt+An0g==");  //This is the base64 encoded cipher text

 $newKey = hash("md5", $key, TRUE); 
 //echo base64_encode($newKey)."\n";

 $decrypted = mcrypt_decrypt(MCRYPT_3DES, $newKey, $encrypted, MCRYPT_MODE_ECB);

 echo $decrypted;

您可以通过添加盐和多次迭代来增加 PBKDF 的强度。所以不要只使用:

md5(password)

使用类似的东西

md5(salt+md5(salt+md5(salt+md5(salt+md5(salt+password)))))

你明白了。更好的是,在 C# 和 PHP 中使用PBKDF2 实现来生成相同的密钥。

【讨论】:

  • 谢谢,但你知道我如何让 C# 和 PHP 都使用任意大小的密钥吗?
  • +1 表示 PBKDF。详情请见PKCS#5
  • @ixe013 是的,我知道我正在使用哈希,问题是 php 3des 不想将哈希键作为输入,它说键太大。
  • 密钥必须是原始字节。我在答案中添加了工作代码。
猜你喜欢
  • 2011-08-29
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
相关资源
最近更新 更多