C # 3des шифрование, как узнать, когда это не удается? - PullRequest
2 голосов
/ 24 февраля 2011

Я использую этот код для шифрования / дешифрования строк между c # и php:

class encryption
{
    public string SimpleTripleDes(string Data)
    {
        byte[] key = Encoding.ASCII.GetBytes("passwordDR0wSS@P6660juht");
        byte[] iv = Encoding.ASCII.GetBytes("password");
        byte[] data = Encoding.ASCII.GetBytes(Data);
        byte[] enc = new byte[0];
        TripleDES tdes = TripleDES.Create();
        tdes.IV = iv;
        tdes.Key = key;
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.Zeros;
        ICryptoTransform ict = tdes.CreateEncryptor();
        enc = ict.TransformFinalBlock(data, 0, data.Length);
        return ByteArrayToString(enc);
    }

    public string SimpleTripleDesDecrypt(string Data)
    {
        byte[] key = Encoding.ASCII.GetBytes("passwordDR0wSS@P6660juht");
        byte[] iv = Encoding.ASCII.GetBytes("password");
        byte[] data = StringToByteArray(Data);
        byte[] enc = new byte[0];
        TripleDES tdes = TripleDES.Create();
        tdes.IV = iv;
        tdes.Key = key;
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.Zeros;
        ICryptoTransform ict = tdes.CreateDecryptor();
        enc = ict.TransformFinalBlock(data, 0, data.Length);
        return Encoding.ASCII.GetString(enc);
    }

    public static string ByteArrayToString(byte[] ba)
    {
        string hex = BitConverter.ToString(ba);
        return hex.Replace("-", "");
    }

    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;
    }
}

Теперь я хотел бы знать, когда расшифровка не удалась, когда она не удалась, она показываетокно сообщения с таким текстом:

Could not find any recognizable digits

Я мог бы просто сравнить это с расшифрованной строкой bu, будет ли этот текст "ошибки" одинаковым на всех компьютерах, даже если они .net lib с другого языка?*

1 Ответ

1 голос
/ 24 февраля 2011

«Ошибка расшифровки» может означать много вещей.

  1. Вы расшифровываете механизм TransformFinalBlock () выдает исключение, потому что вы указали неверный ключ или IV
  2. Вы указали верный, но неверный IV - этоможно позаботиться, потому что вы знаете их правильные значения и то, как они защищены.
  3. вы ввели правильный ключ, IV, но неверный шифротекст (или подделанный).

1 - алгоритмическая ошибкаи может быть обработан.

К сожалению, для 2 и 3, не сравнивая дешифрованный текст с оригинальным открытым текстом, трудно понять, «не удалось ли расшифровать», если вы не введете некоторые дополнительные меры для проверки несанкционированного доступа - хеш является единственным ответом длятот.В обоих случаях результат может быть противоречивым.

Обнаружение подделки маловероятно как для потоковых, так и блочных шифров, поскольку они не предназначены для этой цели.Вы должны использовать комбинацию ctyptographic методов для создания подобной инфраструктуры.

Если у вас есть библиотека .NET, предназначенная для выдачи конкретного сообщения, не имеет значения, на каком языке (я предполагаю, что вы говоритеCLS-совместимый язык, C #, VB.NET и т. д.), на котором он был написан и на каком компьютере он работает, поведение должно быть согласованным.

РЕДАКТИРОВАТЬ: Блочные шифры всегда добавляют заполнениена ваш открытый текст независимо от метода сцепления, используемого для получения следующего полного размера блока перед шифрованием.Расшифровка должна удалить заполнение, но вы можете ожидать, что строка заканчивается одним или несколькими нулями.Будьте осторожны с этим и рассмотрите возможность сохранения длины ваших данных.

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