C#和PHP加密兼容性 - 使用PKCS7的3DES ECB

时间:2015-06-29 12:34:45

标签: c# php encryption pkcs#7 3des

我有一个共同的问题,但网络中的各种解决方案似乎都不适合我。

我有C#代码,用PKCS7加密3DES-ECB。我必须在PHP中做同样的事情,但我得到了不同的结果。

这是我的C#代码:

        public string Encrypt(string toEncrypt, string key)
    {
        byte[] keyArray;
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
        System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            //Always release the resources and flush data
            // of the Cryptographic service provide. Best Practice
            hashmd5.Clear();            
        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();

        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = tdes.CreateEncryptor();
        byte[] resultArray =
          cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        tdes.Clear();
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }

我在php中做了很多尝试......这只是其中之一:

function apiEncode($data)
{    
  $key = "6702BC24DD0527E7";

  //Pad for PKCS7
  $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
  $len = strlen($data);
  $pad = $blockSize - ($len % $blockSize);
  $data .= str_repeat(chr($pad), $pad);

  //Encrypt data
  $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');
  return base64_encode($encData);
}

我使用随机密钥,您可以在php示例代码中找到它。

当输入为" 00010 "时,C#代码返回" FcXBCikZU64 = "而php给了我" FIg + xqod9iY = "。

为什么呢?我想我已经完成了我在博客/教程/等中发现的所有内容......那么,我的问题是什么?

更新:

我已添加,但仍然是坏消息......

$ key。= substr($ key,0,8);

function apiEncode($data)
{    
  $key = "6702BC24DD0527E7";

  //Pad for PKCS7
  $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
  $len = strlen($data);
  $pad = $blockSize - ($len % $blockSize);
  $data .= str_repeat(chr($pad), $pad);

  $key .= substr($key,0,8); // append the first 8 bytes onto the end

  //Encrypt data
  $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); //, $iv);
  return base64_encode($encData);
}

现在输出 hbJpiCNmXz8 = ...仍然不是我需要的......

UPDATE2 :问题在于,在c#方面,我制作了一个哈希,我不知道如何在php中执行此操作..查看代码" tabbed&# 34;,是我在c#侧做哈希的地方..我怎么能在php中做呢?

解决方案

function apiEncode($data)
{    
  //Pad for PKCS7
  $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
  $len = strlen($data);
  $pad = $blockSize - ($len % $blockSize);
  $data .= str_repeat(chr($pad), $pad);

  $key = "6702BC24DD0527E7";
  $key = md5($key,TRUE);
  $key .= substr($key,0,8);
  //Encrypt data
  $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');
  return base64_encode($encData);
}

 $crypt = apiEncode("00010");     
    echo "CRYPT: $crypt";

2 个答案:

答案 0 :(得分:2)

PHP代码:

$key = "6702BC24DD0527E7";
$key = md5($key,TRUE);
$key .= substr($key,0,8);

C#代码是" ok"原样。

" OK"这是一个重要的词。我可能会使用SHA256并将其修剪为24个字节:

C#:

SHA256Managed sha256 = new SHA256Managed();
keyArray = sha256.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
Array.Resize(ref keyArray, 24);
//Always release the resources and flush data
// of the Cryptographic service provide. Best Practice
sha256.Clear(); 

和PHP:

$key = "6702BC24DD0527E7";
$key = hash("sha256",$key,TRUE);
$key = substr($key,0,24);

仍然是"小写OK" ...通常你应该使用AES和各种块链接模式之一,如CBC(需要IV),密码应该是&# 34; strenghtened"使用算法,如PBKDF2(需要PHP> = 5.5)

答案 1 :(得分:0)

好的,解决了这个问题。看this link,我写了一切。