2016-04-27 150 views
3

我解密在C#的消息,该消息被在PHP中使用以下代码加密: -PHP Triple DES加密和兼容C#解密

public function __construct($sEncryptionKey) 
{ 
    $this->link = mcrypt_module_open('tripledes', '', 'ecb', ''); 
    $this->sInitializationVector = mcrypt_create_iv(mcrypt_enc_get_iv_size($this->link), MCRYPT_RAND); 
    $this->iKeySize = mcrypt_enc_get_key_size($this->link); 
    $sEncryptionKey = substr(md5($sEncryptionKey), 0, $this->iKeySize); 
    mcrypt_generic_init($this->link, $sEncryptionKey, $this->sInitializationVector); 
} 

public function encrypt($sDataToEncrypt) 
{ 
    return base64_encode(mcrypt_generic($this->link, $sDataToEncrypt)); 
} 

,我使用下面解密函数在c#解密: -

public string Decrypt(string toDecrypt, string key, bool useHashing) 
{      
    byte[] keyArray; 
    byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);  
    if (useHashing) 
    { 
     MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); 
     keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); 
     hashmd5.Clear(); 
    } 
    else 
    { 
     keyArray = UTF8Encoding.UTF8.GetBytes(key); 
    } 

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();    
    tdes.Key = keyArray;         
    tdes.Mode = CipherMode.ECB;     
    tdes.Padding = PaddingMode.Zeros; 

    ICryptoTransform cTransform = tdes.CreateDecryptor(); 
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);        
    tdes.Clear(); 
    var strValue = UTF8Encoding.UTF8.GetString(resultArray);  
    return UTF8Encoding.UTF8.GetString(resultArray); 
} 

我试着用一些变化和取得以下成果: -

1)PaddingMode.PKCS7没有散列=“指定的关键不是这个算法有效的大小”

2.)PaddingMode.PKCS7 with hashing =“Bad Data”。

3.)PaddingMode.Zeros with no hashing =“指定的键不是此算法的有效大小。”

4)PaddingMode.Zeros与哈希=“8fq6IGs”一些不知名的人物

我认为第4'一会的工夫,但不知道我做错了。

回答

0

找到了解决办法,需要做的MD5散列的变化,下面是完整的代码,如果有人停留在同样的情况: -

public string Decrypt(string toDecrypt, string key, bool useHashing) 
{ 
    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); 
    byte[] keyArray; 
    byte[] toEncryptArray = Convert.FromBase64String(toDecrypt); 
    string keyArrayStr = ""; 
    if (useHashing) 
    { 
     MD5 md5 = MD5CryptoServiceProvider.Create(); 
     byte[] dataMd5 = md5.ComputeHash(Encoding.Default.GetBytes(key)); 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < dataMd5.Length; i++) 
      sb.AppendFormat("{0:x2}", dataMd5[i]); 

     keyArrayStr = sb.ToString().Substring(0, tdes.Key.Length); 
     keyArray = UTF8Encoding.UTF8.GetBytes(keyArrayStr); 
    } 
    else 
    { 
     keyArray = UTF8Encoding.UTF8.GetBytes(key); 
    } 

    tdes.Key = keyArray; 
    tdes.Mode = CipherMode.ECB; 
    tdes.Padding = PaddingMode.Zeros; 

    ICryptoTransform cTransform = tdes.CreateDecryptor(); 
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); 
    tdes.Clear(); 
    var strValue = UTF8Encoding.UTF8.GetString(resultArray); 
    return UTF8Encoding.UTF8.GetString(resultArray); 
}