TripleDES şifreleme PHP ve C # aynı sonuçları vermediğine

3 Cevap

C # ile şifrelemek ne zaman almak arTdPqWOg6VppOqUD6mGITjb24+x5vJjfAufNQ4DN7rVEtpDmhFnMeJGg4n5y1BN

static void Main(string[] args)
{
    Encoding byteEncoder = Encoding.Default;

    String key = "ShHhd8a08JhJiho98ayslcjh";
    String message = "Let us meet at 9 o'clock at the secret place.";

    String encryption = Encrypt(message, key, false);
    String decryption = Decrypt(encryption , key, false);

    Console.WriteLine("Message: {0}", message);
    Console.WriteLine("Encryption: {0}", encryption);
    Console.WriteLine("Decryption: {0}", decryption);
}

public static string Encrypt(string toEncrypt, string key, bool useHashing)
{
    byte[] keyArray;
    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

    if (useHashing)
    {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

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

    ICryptoTransform cTransform = tdes.CreateEncryptor();
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

    return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}

public static 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));
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

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

    ICryptoTransform cTransform = tdes.CreateDecryptor();
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

    return UTF8Encoding.UTF8.GetString(resultArray);
}

PHP ile şifrelemek alıyorum: arTdPqWOg6VppOqUD6mGITjb24+x5vJjfAufNQ4DN7rVEtpDmhFnMVM+W/WFlksR

    <?php
        $key = "ShHhd8a08JhJiho98ayslcjh";
        $input = "Let us meet at 9 o'clock at the secret place.";

        $td = mcrypt_module_open('tripledes', '', 'ecb', '');
        $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td, $key, $iv);
        $encrypted_data = mcrypt_generic($td, $input);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);

        echo base64_encode($encrypted_data);
    ?>

Nedenini anlamaya kriptografi hakkında yeterli bilmiyorum. Herhangi bir fikir? Teşekkürler.

3 Cevap

Peter hakkıdır. Eğer C # kodu PKCS # 7 kullanarak yaparken PHP sadece, sıfır ile doldurur. İşte doğru yapmanız gereken bazı kod:

function pkcs7_pad($text, $blocksize)
{
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}

$input = pkcs7_pad("Let us meet at 9 o'clock at the secret place.", 16);

Alternatif olarak, C # kodu bu koymak gerekir:

tdes.Padding = PaddingMode.Zeros;

ve ayrıca (biraz daha az güvenli olsa) çalışabilir.

Ben PHP bilmiyorum, ve ne ben dikkatle C # kodu analiz var, ancak şifreli dize çoğu gibi aynı verilerin dolgu fark belki bir? Belki PHP PaddingMode.PKCS7 C # kodu kullanılan başka bir modunu kullanır? (Ben yorum olabilir bu ... Yorum olurdu)

Bir yan not olarak: Eğer ECB kullanıyorsanız o zaman bir IV gerekmez. Aslında, Avrupa Merkez Bankası'nı kullanarak zaman bir güvenlik tehlikesi çoğu, bu yüzden gerçekten, örneğin, başka bir şey kullanmak gerekir Bir IV kullanır CBC,. IV şifre blok boyutu (3DES için 8 bayt) daha aynı boyutta bir rasgele, gizli olmayan bir değerdir. Yeni IV her ileti için yaratılmış olmalı ve şifresini parti şifreleyerek taraf kullanılan IV bilmeniz gerekir. Uygulamada, IV şifrelenmiş mesajı ile birlikte gönderilir.