Декодирование и кодирование строк - HardCoded KEY для симметричных алгоритмов - PullRequest
1 голос
/ 17 июля 2011

Я написал следующий класс для кодирования и декодирования строковых данных (Симметричный алгоритм с одним ключом):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace MyProject.Classes
{
    public static class SymmetricEncryption
    {
        private const string MyKey = "bla bla bla";

        private static string _AlgorithmName;
        public static string AlgorithmName
        {
            get { return _AlgorithmName; }
            set { _AlgorithmName = value; }
        }

        public static string EncryptData(string ClearData)
        {
            // Convert string ClearData to byte array
            byte[] ClearData_byte_Array = Encoding.UTF8.GetBytes(ClearData);

            // Now Create The Algorithm
            SymmetricAlgorithm Algorithm = SymmetricAlgorithm.Create(AlgorithmName);
            Algorithm.Key = Encoding.UTF8.GetBytes(MyKey);

            // Encrypt information
            MemoryStream Target = new MemoryStream();

            // Append IV
            Algorithm.GenerateIV();
            Target.Write(Algorithm.IV, 0, Algorithm.IV.Length);

            // Encrypt Clear Data
            CryptoStream cs = new CryptoStream(Target, Algorithm.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(ClearData_byte_Array, 0, ClearData_byte_Array.Length);
            cs.FlushFinalBlock();

            // Output
            byte[] Target_byte_Array = Target.ToArray();
            string Target_string = Convert.ToBase64String(Target_byte_Array);
            return Target_string;
        }

        public static string DecryptData(string EncryptedData)
        {
            byte[] EncryptedData_byte_Array = Convert.FromBase64String(EncryptedData);

            // Now Create The Algorithm
            SymmetricAlgorithm Algorithm = SymmetricAlgorithm.Create(AlgorithmName);
            Algorithm.Key = Encoding.UTF8.GetBytes(MyKey);

            // Decrypt information
            MemoryStream Target = new MemoryStream();

            // Read IV
            int ReadPos = 0;
            byte[] IV = new byte[Algorithm.IV.Length];
            Array.Copy(EncryptedData_byte_Array, IV, IV.Length);
            Algorithm.IV = IV;
            ReadPos += Algorithm.IV.Length;

            // Decrypt Encrypted Data
            CryptoStream cs = new CryptoStream(Target, Algorithm.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(EncryptedData_byte_Array, ReadPos, EncryptedData_byte_Array.Length - ReadPos);
            cs.FlushFinalBlock();

            // Output
            byte[] Target_byte_Array = Target.ToArray();
            string Target_string = Encoding.UTF8.GetString(Target_byte_Array);
            return Target_string;
        }


    }
}

и использование, как показано ниже:

protected void Page_Load(object sender, EventArgs e)
{
    SymmetricEncryptionUtility.AlgorithmName = "TripleDES";
    Response.Write(SymmetricEncryptionUtility.EncryptData("1234-4567-8910-2345"));
}

У меня есть некоторые проблемы сMyKey -> как мы можем жестко закодировать ключ для симметричных алгоритмов и использовать его в верхнем классе?

ОШИБКИ верхних кодов, как показано ниже:

    Server Error in '/' Application.

    Specified key is not a valid size for this algorithm. 
    Description: An unhandled exception occurred during the

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

    Exception Details:

System.Security.Cryptography.CryptographicException: указанный ключ не является допустимым размером для этого алгоритма.

как я могу исправить эту ошибку?

заранее спасибо

Ответы [ 2 ]

4 голосов
/ 17 июля 2011

Вы можете использовать System.Security.Cryptography.Rfc2898DeriveBytes для безопасного создания правильного количества байтов для вашего ключа на основе пароля string и byte[] соли:

var helper = new Rfc2898DeriveBytes(password, salt);
algorithm.Key = helper.GetBytes(algorithm.KeySize / 8);

Для получения дополнительной информации о Rfc2898DeriveBytes и о том, как его использовать, посетите страницу на MSDN .

1 голос
/ 17 июля 2011

Прочтите ошибку и посмотрите документацию для TripleDES.Key:

Этот алгоритм поддерживает длину ключа от 128 до 192 бит с шагом 64 бита.

Это означает, что, например,

private const string MyKey = "bla bla bla blah";

будет работать.

Вы не спрашивали об этом, но я не уверен, что создание этого класса является статическим.отличная идея.Если вы используете его из двух разных мест в своем коде, это может привести к неожиданным результатам, поскольку AlgorithmName является статическим.

Кроме того, я не думаю, что имеет смысл иметь постоянный ключ, но переменный алгоритмТем более что для разных алгоритмов требуются ключи разной длины.

...