Кодирование DES с ключом безопасности C#

Я знаю, что это, вероятно, общий вопрос, но я нигде не могу найти ответ. Итак, у меня есть ключ байтового массива и значение байтового массива, и мне нужно создать новый 8-байтовый массив, который был зашифрован с помощью DES в С#.


person Emir Kljucanin    schedule 18.01.2011    source источник
comment
google не работает сегодня?   -  person Darin Dimitrov    schedule 18.01.2011
comment
Нет, это не вниз, но я нигде не могу найти, как это сделать. У меня есть ключ и значения и новый массив, который зашифрован значением с этим ключом, но я не могу получить те же результаты в своем коде.   -  person Emir Kljucanin    schedule 18.01.2011
comment
@Darin Эй, вот что я сказал!   -  person Linus Kleen    schedule 18.01.2011
comment
@Darin, @gore, единственный ТАК пост в этих результатах Google не является прямым обманом. Так что здесь вполне уместный вопрос.   -  person Henk Holterman    schedule 18.01.2011
comment
Обратите внимание, что во многих режимах шифрования зашифрованный текст длиннее открытого текста.   -  person CodesInChaos    schedule 18.01.2011


Ответы (2)


Вот ваш пример кода. Не забудьте заполнить конечные нули случайными данными, запомнить записанные байты и параметры DES: Key, IV.

С наилучшими пожеланиями ;)

using System.Security.Cryptography;
using System.IO;
namespace hash
{
    public static class Program
    {
        static void Main(string[] args)
        {
            byte[] data = new byte[10000];
            DES des = DES.Create();
            int bytesWritten = 0;
            data = Encode(data, des, out bytesWritten);
        }

        private static byte[] Encode(byte[] data, DES des, out int bytesWritten)
        {
            using (var input = new MemoryStream(data))
            using (var output = new MemoryStream())
            using (var csp = new DESCryptoServiceProvider())
            using (var encStream = new CryptoStream(output, csp.CreateEncryptor(des.Key, des.IV), CryptoStreamMode.Write))
            {
                int length = 0;
                byte[] buffer = new byte[256];
                bytesWritten = 0;
                while ((length = input.Read(buffer, 0, 256)) > 0)
                {
                    if (length < 256)
                    {
                        byte[] pad = new byte[256];
                        using (var rng = RNGCryptoServiceProvider.Create())
                        {
                            rng.GetBytes(pad);
                            for (int i = 0; i < 256 - length; i++)
                            {
                                buffer[length + i] = pad[i];
                            }
                        }
                        encStream.Write(buffer, 0, length);
                        bytesWritten += length;
                        break;
                    }
                    encStream.Write(buffer, 0, 256);
                    bytesWritten += length;
                }
                return output.ToArray();
            }
        }
    }
}
person Artur Mustafin    schedule 18.01.2011
comment
Отлично: вы добавили предложения с использованием и без чрезмерной вложенности! Многие люди забывают об этом или допускают последовательное использование... - person Eamon Nerbonne; 28.01.2011
comment
@EamonNerbonne: Надеюсь, когда-нибудь это будет отмечено как правильный ответ;) - person Artur Mustafin; 02.10.2011

Это то, что я искал :D:D...спасибо :D

   private static byte[] Encrypt(byte[] value, byte[] key)
    {
        DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider
                                                      {
                                                          Mode = CipherMode.ECB,
                                                          Padding = PaddingMode.None
                                                      };

        MemoryStream memoryStream = new MemoryStream();

        CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(key, key), CryptoStreamMode.Write);

        cryptoStream.Write(value, 0, value.Length);
        cryptoStream.Close();

        return memoryStream.ToArray();
    }
person Emir Kljucanin    schedule 19.01.2011
comment
Во-первых, вы всегда должны заботиться об объеме памяти в своем коде, поэтому вы должны использовать оператор using в объектах FW, реализованных с интерфейсом IDisposable, это верно, потому что, если класс FW использует интерфейс IDisposable, в 99% случаев это будут использоваться неуправляемые ресурсы, такие как дескрипторы (также встречались дескрипторы памяти), ресурсы и т. д. В некоторых случаях вы можете сообщить зависимому объекту принудительно закрыть() при выходе из определенного потока, но это скорее исключение, чем правило. Во-вторых, пожалуйста, не переписывайте мой код, который я уже написал. А в криптографии меньше кода не значит лучше ;) - person Artur Mustafin; 20.01.2011
comment
@ Артур, хотя ваша точка зрения о IDisposable верна, люди могут писать подобные ответы. - person Marc Gravell; 20.01.2011
comment
@Marc Gravell: Все в порядке, я думаю о других вещах, я уже изучил все советы и приемы, такие как кража ответов, переписывание, неверный ответ, пронирование и другие грязные вещи, которые делают люди;) Иногда это выглядит очень глупо, когда кучка идиотов отдает дань уважения высоко оцененному, но неверному ответу другого пользователя. Странно, иногда даже монстры индустрии (Эрик) не понимают, даже не упоминают в своих ответах самые простые вещи ;) - person Artur Mustafin; 21.01.2011