Как сделать байт [] из зашифрованной строки? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь зашифровать и расшифровать строку, и я могу сделать это успешно.После этого я преобразовываю зашифрованную byte[] в строку для сохранения в базе данных.

Но когда я пытаюсь снова преобразовать строку в byte[], мой код выдает ошибку.

Чтобы проверить код, я создал строковую переменную для сохранения зашифрованной строки.

ошибка печати

Как мне снова успешно преобразовать строку обратно в byte[]?

static void Main(string[] args)
{
    Console.WriteLine("Enter text that needs to be encrypted..");
    string data = Console.ReadLine();
    EncryptAesManaged(data);
    Console.ReadLine();
}

static void EncryptAesManaged(string raw)
{
    string EncryptionKey = "sruohfaymonerishfiahbihbgrG546";
    byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(raw);

    try
    {
        using (AesManaged aes = new AesManaged())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(EncryptionKey);

            aes.Key = pdb.GetBytes(32);
            aes.IV = pdb.GetBytes(16);
            // Encrypt string    
            byte[] encrypted = Encrypt(raw, aes.Key, aes.IV);

            // Print encrypted string    
            string passe = System.Text.Encoding.UTF8.GetString(encrypted);
            Console.WriteLine($"Encrypt:{passe}");
            Console.WriteLine(System.Text.Encoding.UTF8.GetBytes(passe));

            // Decrypt the bytes to a string.    
            string decrypted = Decrypt(System.Text.Encoding.UTF8.GetBytes(passe), aes.Key, aes.IV);
            // Print decrypted string. It should be same as raw data    
            Console.WriteLine($"Decrypted data: {decrypted}");
        }
    }
    catch (Exception exp)
    {
        Console.WriteLine(exp.Message);
    }

    Console.ReadKey();
}

static byte[] Encrypt(String plainText, byte[] Key, byte[] IV)
{
    byte[] encrypted;

    using (AesManaged aes = new AesManaged())
    {
        // Create encryptor    
        ICryptoTransform encryptor = aes.CreateEncryptor(Key, IV);

        // Create MemoryStream    
        using (MemoryStream ms = new MemoryStream())
        {
            // Create crypto stream using the CryptoStream class. This class is the key to encryption    
            // and encrypts and decrypts data from any given stream. In this case, we will pass a memory stream    
            // to encrypt    
            using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
            {
                // Create StreamWriter and write data to a stream    
                using (StreamWriter sw = new StreamWriter(cs))
                    sw.Write(plainText);

                encrypted = ms.ToArray();
            }
        }
    }

    return encrypted;
}

static string Decrypt(byte[] cipherText, byte[] Key, byte[] IV)
{
    string plaintext = null;
    // Create AesManaged    
    using (AesManaged aes = new AesManaged())
    {
        // Create a decryptor    
        ICryptoTransform decryptor = aes.CreateDecryptor(Key, IV);

        // Create the streams used for decryption.    
        using (MemoryStream ms = new MemoryStream(cipherText))
        {
            // Create crypto stream    
            using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
            {
                // Read crypto stream    
                using (StreamReader reader = new StreamReader(cs))
                    plaintext = reader.ReadToEnd();
            }
        }
    }

    return plaintext;
}

1 Ответ

2 голосов
/ 02 июля 2019

Проблема прямо здесь:

string passe = System.Text.Encoding.UTF8.GetString(encrypted);
               ^---------------------------------^

, а затем здесь:

string decrypted = Decrypt(System.Text.Encoding.UTF8.GetBytes(passe), aes.Key, aes.IV);
                           ^--------------------------------^

Я предполагаю, что это ваша симуляция хранения ее в базе данных, а затем ее возврата, исохраняя его как строку.

Однако то, что вы сделали, почти наверняка повредило строку таким образом.

Encoding.UTF8.GetString(bytes) делает не преобразование байтового массива, содержащегопроизвольные байты в строку.Вместо этого он преобразует байтовый массив , который должен содержать байты, составляющие строку в кодировке UTF8, обратно в эту строку.

Если байтовый массив содержит произвольные байты, например, результат шифрованиятекст, этот шаг и его компаньон Encoding.UTF8.GetBytes почти наверняка повредят данные и / или потеряют байты.

Вместо этого следует использовать другой метод преобразования байтового массива в строку и обратно.

Одним из способов было бы использование кодировки Base64, и вы можете заменить две строки выше на это:

string passe = Convert.ToBase64String(encrypted);
...
string decrypted = Decrypt(Convert.FromBase64String(passe), aes.Key, aes.IV);

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


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

...