2016-04-27 4 views
3

私はC#でメッセージを解読しています: -PHPトリプル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 = "指定されたキーはこのアルゴリズムの有効なサイズではありません。"いくつかの未知の文字のハッシュ=「8fq6IGs」と

4)PaddingMode.Zerosは

私は4'th 1が動作すると思うが、私が間違っているのかわかりません。解決策を見つけた

答えて

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); 
} 
関連する問題