2016-04-27 6 views
3

ich eine Nachricht in C# bin Entschlüsseln Diese Nachricht wird verschlüsselt in PHP Code unten verwenden: -PHP Triple-DES-Verschlüsselung und kompatible C# Entschlüsselung

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)); 
} 

Und ich bin mit unter Entschlüsselungsfunktion in C# für die Entschlüsselung: -

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); 
} 

ich habe versucht, mit einigen Änderungen und unten Ergebnisse zu erzielen: -

1.) PaddingMode.PKCS7 ohne Hashing = „angegebene Taste ist keine gültige Größe für diesen Algorithmus“

2.) PaddingMode.PKCS7 mit Hashing = "Bad Data."

3.) PaddingMode.Zeros ohne Hashing = "Der angegebene Schlüssel ist keine gültige Größe für diesen Algorithmus."

4.) PaddingMode.Zeros mit Hashing = „8fq6IGs“ unbekannten Zeichen

Ich denke 4'th ein funktionieren wird, aber nicht sicher, was ich falsch mache.

Antwort

0

eine Lösung gefunden, müssen in MD5-Hashing-Änderungen tun, unter gesamtem Code ist, wenn jemand in derselben Situation stecken: -

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); 
} 
Verwandte Themen