MCRYPT в .Net - PullRequest
       28

MCRYPT в .Net

2 голосов
/ 24 июня 2009

У меня есть алгоритм расшифровки PHP на одном конце и алгоритм шифрования .Net на другом. Я использую mcrypt_decrypt для расшифровки в PHP-коде и ищу эквивалент mcrypt_encrypt в .Net. В частности, PHP-код, который я хочу преобразовать в .Net, выглядит следующим образом:

$cipher_alg = MCRYPT_RIJNDAEL_128;
$iv = mcrypt_create_iv ( mcrypt_get_iv_size ( $cipher_alg, MCRYPT_MODE_ECB ), MCRYPT_RAND );

$encrypted_string = mcrypt_encrypt ( $cipher_alg, $sessionkey, $string, MCRYPT_MODE_CBC, $iv );
$hex_encrypted_string = bin2hex ( $encrypted_string );

Есть ли эквивалент. 1006 * в .Net?

Ответы [ 2 ]

3 голосов
/ 24 июня 2009

Я опубликовал решение в своем блоге .

Вот выдержка:

    private static string CreateEncryptedString(string myString, string hexiv, string key)
    {
        RijndaelManaged alg = new RijndaelManaged();
        alg.Padding = PaddingMode.Zeros;
        alg.Mode = CipherMode.CBC;
        alg.BlockSize = 16 * 8;
        alg.Key = ASCIIEncoding.UTF8.GetBytes(key);
        alg.IV = StringToByteArray(hexiv);
        ICryptoTransform encryptor = alg.CreateEncryptor(alg.Key, alg.IV);

        MemoryStream msStream = new MemoryStream();
        CryptoStream mCSWriter = new CryptoStream(msStream, encryptor, CryptoStreamMode.Write);
        StreamWriter mSWriter = new StreamWriter(mCSWriter);
        mSWriter.Write(myString);
        mSWriter.Flush();
        mCSWriter.FlushFinalBlock();

        var EncryptedByte = new byte[msStream.Length];
        msStream.Position = 0;
        msStream.Read(EncryptedByte, 0, (int)msStream.Length);

        return ByteArrayToHexString(EncryptedByte);

    }

    public static byte[] StringToByteArray(String hex)
    {
        int NumberChars = hex.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }

    public static string ByteArrayToHexString(byte[] ba)
    {
        StringBuilder hex = new StringBuilder(ba.Length * 2);
        foreach (byte b in ba)
            hex.AppendFormat("{0:x2}", b);
        return hex.ToString();
    }

Есть одна вещь, которую стоит отметить. Размер ключа должен быть 16. Это означает, что параметр ключа должен быть строкой из 16 символов. В противном случае шифрование не будет работать и вызовет исключение CryptographicException.

На стороне PHP вот как вы выполняете декодирование:

$cipher_alg = MCRYPT_RIJNDAEL_128;
$decrypted_string = mcrypt_decrypt($cipher_alg, $key, 
$encrypted_string , MCRYPT_MODE_CBC, trim(hex2bin(trim($hexiv))));
1 голос
/ 24 июня 2009

Прямого эквивалента не существует, но поддерживается 128-битный Rijndael (и, вероятно, большинство других шифров, которые вы хотели бы). Подробности смотрите в классе Rijndael .

В основном часть инфраструктуры шифрования основана на том, что вы указываете соответствующий экземпляр базового класса (CryptoStream, SymmetricAlgorithm и т. Д.), А не указываете шифр по имени - но вы должны быть в состоянии делать то, что вам нужно к.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...