2011-10-20 37 views
2

私のC#プログラムで文字列をデコードするのに次のコードを使用していますが、PHPで同じ文字列サーバー側を復号化できる必要もあります。 PHPに次のC#コードと同等のものはありますか?PHPでC#で3DESで暗号化された文字列を解読する方法は?

public static string DecryptString(string Message, string Passphrase) 
    { 
     byte[] Results; 
     System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 

     // Step 1. We hash the passphrase using MD5 
     // We use the MD5 hash generator as the result is a 128 bit byte array 
     // which is a valid length for the TripleDES encoder we use below 

     MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
     byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase)); 

     // Step 2. Create a new TripleDESCryptoServiceProvider object 
     TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 

     // Step 3. Setup the decoder 
     TDESAlgorithm.Key = TDESKey; 
     TDESAlgorithm.Mode = CipherMode.ECB; 
     TDESAlgorithm.Padding = PaddingMode.PKCS7; 

     // Step 4. Convert the input string to a byte[] 
     byte[] DataToDecrypt = Convert.FromBase64String(Message); 

     // Step 5. Attempt to decrypt the string 
     try 
     { 
      ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor(); 
      Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length); 
     } 
     finally 
     { 
      // Clear the TripleDes and Hashprovider services of any sensitive information 
      TDESAlgorithm.Clear(); 
      HashProvider.Clear(); 
     } 

     // Step 6. Return the decrypted string in UTF8 format 
     return UTF8.GetString(Results); 

    } 
+0

ルック。 –

+0

誰かがそれを必要とする場合に備えて。 http://stackoverflow.com/a/29045516/1693635 –

答えて

3

PHPでMD5ハッシュを取得するには、$key = md5($passphrase, true)を使用してください。 2番目のパラメータは、16進数のエンコーディングではなく、生の出力を与えます。

トリプルDESを使用して暗号化/復号化するには、mcryptモジュールを使用できます。

$ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CBC); 

考慮事項:最も単純な形式で

  • トリプルDESは、192ビットキーを使用しますが、128ビットの鍵を持っています。 PHPはキーにヌルを埋め込みますが、.NETはこのようなキーを許可しません。代わりに、最初の8バイトが最後に追加されます。
  • .NETはPCKS7パディングを使用し、PHPはゼロパディングを使用します。

これらの非互換性を回避するには、標準コードをいくつか変更する必要があります。これは、post on php.netから持ち上げた:

function encryptNET3DES($key, $vector, $text){ 
    $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); 

    // Complete the key 
    $key_add = 24 - strlen($key); 
    $key .= substr($key, 0, $key_add); 

    // Padding the text 
    $text_add = strlen($text)%8; 
    for ($i=$text_add; $i<8; $i++){ 
     $text .= chr(8-$text_add); 
    } 

    mcrypt_generic_init($td, $key, $vector); 
    $encrypt64 = mcrypt_generic($td, $text); 
    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    // Return the encrypt text in 64 bits code 
    return $encrypt64; 
} 

最後に、私はphp.netからコードを復号化するbase64_encodebase64_decode()

+0

これは答えではありません – Pons

+1

@Pons本当ですか?どうして? – NullUserException

0

を使用し、/デコードbase64で文字列をエンコードします。 私.net暗号化と復号化の方法は以下の通りです: `mcrypt`モジュール(http://php.net/mcrypt)で

public class EncryptDecrypt 
{ 
    private byte[] TDES_Key = { 0x01, 0x04, 0x01, 0x01, 0x01, 0x09, 0x07, 0x08, 0x01, 0x09, 0x07, 0x08, 0x01, 0x01, 0x02, 0x04 }; 
    private byte[] tdesIV; 
    public string Encrypt(string textToEncrypt,string KeyVI) 
    { 
     tdesIV = GetLegalKey(KeyVI); 
     TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); 
     tdes.Key = TDES_Key; 
     tdes.IV = tdesIV; 
     byte[] buffer = Encoding.ASCII.GetBytes(textToEncrypt); 
     return Convert.ToBase64String(tdes.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length));/// 
    } 
関連する問題