Симметричный шифруют/дешифруют в.NET

Я после симметричной стандартной программы шифрования/дешифрования в C#. Я знаю, что было несколько вопросов по этой теме прежде, но большинство ответов, кажется, о философии шифрования вместо того, чтобы дать фактический код.

Обновление: я действительно хотел бы видеть некоторый код, а не просто связываюсь.Большое спасибо!

12
задан Craig Schwarze 12 September 2011 в 04:39
поделиться

5 ответов

Посмотрите на пример кода в нижней части этой страницы .

Скопируйте его здесь:

int Rfc2898KeygenIterations= 100;
int AesKeySizeInBits = 128;
String Password = "VerySecret!";
byte[] Salt = new byte[16];
System.Random rnd = new System.Random(); 
rnd.NextBytes(Salt);
byte[] rawPlaintext = System.Text.Encoding.Unicode.GetBytes("This is all clear now!");
byte[] cipherText= null;
byte[] plainText= null;
using (Aes aes = new AesManaged())
{
    aes.Padding = PaddingMode.PKCS7;
    aes.KeySize = AesKeySizeInBits;
    int KeyStrengthInBytes= aes.KeySize/8;
    System.Security.Cryptography.Rfc2898DeriveBytes rfc2898 =
        new System.Security.Cryptography.Rfc2898DeriveBytes(Password, Salt, Rfc2898KeygenIterations);
    aes.Key = rfc2898.GetBytes(KeyStrengthInBytes);
    aes.IV = rfc2898.GetBytes(KeyStrengthInBytes);
    using (MemoryStream ms = new MemoryStream())
    {
        using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
        {
            cs.Write(rawPlaintext, 0, rawPlaintext.Length);
        }
        cipherText= ms.ToArray();
    }

    using (MemoryStream ms = new MemoryStream())
    {
        using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write))
        {
            cs.Write(cipherText, 0, cipherText.Length);
        }
        plainText = ms.ToArray();
    }
}
string s = System.Text.Encoding.Unicode.GetString(plainText);
Console.WriteLine(s);
14
ответ дан 2 December 2019 в 04:53
поделиться

То, что вы хотите, являются криптосервисциссыпровидировщиками в классе Библиотеку

, подобно этому для AES

http://msdn.microsoft.com/en-us/library/system.security. Cryptography.aescryptoserviceProvider_members.aspx

2
ответ дан 2 December 2019 в 04:53
поделиться

Ну для начала ключей не являются строки, ключи являются бинарными каплями. Откровенный текст одинаково, он на самом деле не текст, опять же это двоичный BLOB.

Теперь, конечно, вы можете конвертировать строки в байтовые матрицы, используя , с помощью encoding.utf8.getbytes (сообщение) , однако при преобразовании клавиш взад и вперед, это немного сложнее, вы обычно используете . TOBASE64STRING и Convert.Frombase64string .

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

byte[] Encrypt(byte[] plainText, byte[] key, byte[] iv)

byte[] Decrypt(byte[] cipherText, byte[] key, byte[] iv)

ключ и IVS должен быть криптографически безопасным случайным числам , не Просто введите их и не используйте случайную функцию C #. Размер ключа и IV зависят от используемого алгоритма шифров и могут быть доступны свойствами на классах.

Для генерации CSRPNG вы делаете что-то вроде

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] key = new byte[algorithm.KeySizeValue / 8];
rng.GetBytes(key);
byte[] iv = new byte[algorithm.BlockSizeValue / 8];
rng.GetBytes(iv);

, вы также можете использовать класс RFC2898DeriveBytes для получения ключа и IV из пароля и соли, но опять же соль должна быть криптографически безопасным случайным числом. Вы также должны обратите внимание, когда вы создаете симметричный алгоритм защищенный ключ, а для вас генерируется IV.

Таким образом, вы можете выбрать правильное кодирование для вашего текста, будь то UTF8, ASCII или что-то еще. Ссылки имеют достаточно образцов, поэтому резка и вставление здесь довольно бессмысленно.

6
ответ дан 2 December 2019 в 04:53
поделиться

Сначала конвертируйте ваш текст, ключ и вектор инициализации в байты, используя кодировку по вашему выбору. Затем используйте тройной провайдер DES, как показано здесь:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.tripledes.aspx

Или провайдер для AES, если вы считаете, что тройной DES слишком старой школы, или что-то в этом роде.

Из любопытства, как вы планируете передать секретный ключ?

2
ответ дан 2 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: