hassan faghihi Ответов: 3

Кодировка для шифрования


Привет,

я разработчик C# ,
я нахожу много вещей о шифровании, но все они выбирают то шифрование, которое им нравится

то, что я ищу, - это 2 вещи:
1. какая лучшая кодировка для шифрования, которая поддерживает все кодировки
2.do все алгоритмы шифрования поддерживают все кодировки? и хорошо ли это, что я позволяю пользователю выбрать нужную ему кодировку, как только он использует алгоритм? или мне придется ограничить выбор?


кроме того, я хочу посмотреть, какая кодировка лучше всего подходит для шифрования сохраненного файла..

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

Примечание: я использовал все симметричное и асимметричное шифрование, предоставленное в библиотеке VS.
хорошо знать обо всех них по одному : / sry причиняют вам неприятности

Oshtri Deka

Я немного запутался в первой части вашего вопроса, не могли бы вы перефразировать его?

3 Ответов

Рейтинг:
22

OriginalGriff

Шифрование не смотрит на кодирование-оно работает на потоке байтов и вообще не предполагает никакого кодирования. Если вы подумаете об этом, то это единственный способ, которым он может работать, если только алгоритм шифрования не скажет: "это двоичный исполняемый файл, относитесь к нему по-другому", что было бы контрпродуктивно. Просто передайте методу шифрования массив байтов и позвольте ему продолжить работу - таким образом, вы можете сделать любое раскодирование и перекодирование без того, чтобы шифрование все испортило.


Рейтинг:
2

hassan faghihi

1. Итак, если я преобразую строку в utf, я просто делаю больший массив байтов? и все же он работает так же для метода?

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


RaviRanjanKr

Предложение :- вы можете использовать кнопку "есть вопрос" или "комментарий", чтобы отбросить свое сообщение и получить немедленный ответ вместо публикации в качестве ответа.

Рейтинг:
18

Andreas Gieriet

Привет Хасан,

Это то, что вы ищете?


  • Вы можете обменяться АЛГ и связанных вспомогательных функций, чтобы соответствовать вашим потребностям.
  • Если у вас есть массив байтов вместо строки C#, вы можете оставить преобразования Юникода в массив байтов.
  • Если вам не нужно печатное представление, оставьте части base64 подальше.


Смотреть также: Простое шифрование и дешифрование данных на языке Си#.

Овации

Энди

/// <summary>
/// Encryption utilities for string encryption.
/// This is using know-how obtained from
/// http://www.codeproject.com/KB/security/DotNetCrypto.aspx
/// (no license restrictions apply).
/// </summary>
public class StringEncryption
{
    /// <summary>Salt: some static byte array, e.g. your name</summary>
    private static readonly byte[] salt = new byte[] { ... };

    /// <summary>Encrypt a string and return it as hex encocded.</summary>
    /// <param name="plainText">plain text to encrypt</param>
    /// <param name="password">password</param>
    /// <returns>encrypted text as base64 string (without new lines)</returns>
    public static string Encrypt(string plainText, params byte[] password)
    {
        using (var ms = new MemoryStream())
        {
            using (var alg = Rijndael.Create())
            using (var pwd = new Rfc2898DeriveBytes(password, salt, 1000))
            using (var cs = new CryptoStream(ms, GetEncryptor(alg, pwd),
                                                 CryptoStreamMode.Write))
            {
                byte[] plainBytes = Encoding.Unicode.GetBytes(plainText);
                cs.Write(plainBytes, 0, plainBytes.Length);
            }
            byte[] encodedBytes = ms.ToArray();
            string base64string = Convert.ToBase64String(encodedBytes,
                                            base64FormattingOptions.None);
            return base64string;
        }
    }
    /// <summary>
    /// Decrypt a base64 encocded and encrypted string and return it as plain text.
    /// </summary>
    /// <param name="encryptedText">base64 encoded and encrypted text</param>
    /// <param name="password">password</param>
    /// <returns>decrypted text</returns>
    public static string Decrypt(string encryptedText, params byte[] password)
    {
        using (var ms = new MemoryStream())
        {
            using (var alg = Rijndael.Create())
            using (var pwd = new Rfc2898DeriveBytes(password, salt, 1000))
            using (var cs = new CryptoStream(ms, GetDecryptor(alg, pwd),
                                                 CryptoStreamMode.Write))
            {
                byte[] decodedBytes = Convert.FromBase64String(encryptedText);
                cs.Write(decodedBytes, 0, decodedBytes.Length);
            }
            byte[] decryptedBytes = ms.ToArray();
            string plainText = Encoding.Unicode.GetString(decryptedBytes);
            return plainText;
        }
    }

    private static ICryptoTransform GetEncryptor(SymmetricAlgorithm algorithm,
                                                 DeriveBytes pwd)
    {
        return algorithm.CreateEncryptor(pwd.GetBytes(32), pwd.GetBytes(16));
    }
    private static ICryptoTransform GetDecryptor(SymmetricAlgorithm algorithm,
                                                 DeriveBytes pwd)
    {
        return algorithm.CreateDecryptor(pwd.GetBytes(32), pwd.GetBytes(16));
    }
}


RaviRanjanKr

5+