2016-04-27 149 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); 
}