TripleDESCryptoService — «Неверные данные»

#c# #encryption #tripledes

#c# #шифрование #утроение

Вопрос:

когда я пытаюсь расшифровать свой зашифрованный ключ, я получаю сообщение об ошибке, в котором говорится, что это неправильные данные / неточные данные. Некоторое время пытался искать без какого-либо результата. Это и код шифрования, и код дешифрования. Indata — это MAC-адрес для шифрования, а indata для дешифрования считывается из текстового файла.

 public string encryptMAC(string indata)
    {
        byte[] resultCrypt;
        UTF8Encoding utf8 = new UTF8Encoding();

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

        byte[] encrypt = utf8.GetBytes(indata);

        try
        {
            ICryptoTransform encryptor = tdes.CreateEncryptor();
            resultCrypt = encryptor.TransformFinalBlock(encrypt, 0, encrypt.Length);
        }
        finally
        {
            tdes.Clear();
        }

        return Convert.ToBase64String(resultCrypt);
    }

        public string decryptMAC(string indata)
    {
        byte[] resultDecrypt;
        UTF8Encoding utf8 = new UTF8Encoding();

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

        byte[] decrypt = Convert.FromBase64String(indata);

        try
        {
            ICryptoTransform decryptor = tdes.CreateDecryptor();
            resultDecrypt = decryptor.TransformFinalBlock(decrypt, 0, decrypt.Length);
        }
        catch (CryptographicException ex)
        {
            Console.WriteLine(ex);
        }
        finally
        {
            tdes.Clear();
        }

        return utf8.GetString(decrypt);
    }
 

Комментарии:

1. Я добавил ключ из MD5Crypto, но какой IV?

Ответ №1:

TripleDESCryptoServiceProvider сгенерирует для вас ключ. Если вы не установите его самостоятельно или не получите его во время шифрования, вы не сможете расшифровать зашифрованный текст.

Я предлагаю вам добавить ключ к вашим методам и использовать его для шифрования и дешифрования:

 public string encryptMAC(string indata, byte[] key)
{
    byte[] resultCrypt;
    UTF8Encoding utf8 = new UTF8Encoding();

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

    byte[] encrypt = utf8.GetBytes(indata);

    try
    {
        ICryptoTransform encryptor = tdes.CreateEncryptor();
        resultCrypt = encryptor.TransformFinalBlock(encrypt, 0, encrypt.Length);
    }
    finally
    {
        tdes.Clear();
    }

    return Convert.ToBase64String(resultCrypt);
}

public string decryptMAC(string indata, byte[] key)
{
    byte[] resultDecrypt = new byte[0];
    UTF8Encoding utf8 = new UTF8Encoding();

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

    byte[] decrypt = Convert.FromBase64String(indata);

    try
    {
        ICryptoTransform decryptor = tdes.CreateDecryptor();
        resultDecrypt = decryptor.TransformFinalBlock(decrypt, 0, decrypt.Length);
    }
    catch (CryptographicException ex)
    {
        Console.WriteLine(ex);
    }
    finally
    {
        tdes.Clear();
    }

    return utf8.GetString(resultDecrypt);
} 

Имейте в виду, что DES имеет небольшой набор слабых ключей, поэтому вы должны использовать TripleDESCryptoServiceProvider для генерации ключа для вас, который будет отфильтровывать эти слабые ключи. Вы можете сгенерировать действительный ключ с помощью (new TripleDESCryptoServiceProvider()).Key .

Комментарии:

1. Я внес ваши изменения, и когда я вызываю метод, какие входные данные должны быть в ключе? Я попытался преобразовать hidden в byte, но это говорит о том, что размер ключа недоступен для этого алгоритма

2. Я добавил пример к своему ответу.

3. Я изменил, это так, когда я вызываю метод decryptMAC(MACAdress, new TripleDESCryptoServiceProvider()).key); Хотя в этой строке снова появились неточные данные: resultDecrypt = decryptor. TransformFinalBlock(расшифровать, 0, расшифровать. Длина); Спасибо за ответы 🙂

4. Вы должны использовать один и тот же ключ для шифрования и дешифрования. Сгенерируйте ключ, присвоите его переменной и передайте эту переменную как методам шифрования, так и дешифрования.

5. Ну, вы должны вернуть правильный массив байтов ( resultDecrypt и нет decrypt )