Не зашифровать - PullRequest
       10

Не зашифровать

0 голосов
/ 07 февраля 2019

Я недавно преобразовал предыдущую программу шифрования из Java в C #.Функция дешифрования работает нормально (как было проверено с использованием зашифрованной строки Java), но шифрование дает результат, который ни программа Java, ни программа C # не могут декодировать.Код и юнит-тест включены ниже вместе с выводом.Функция GetKey () - это мой собственный сгенерированный солт-ключ, который правильно генерирует тот же ключ для заданного ввода (протестировано в Java и C #).

Функции шифрования и дешифрования являются точными двойными.Я не могу понять, почему один работает, а другой нет.

Я сократил все тексты до base64, чтобы избежать ловушки между Java и C #.вставил зашифрованную строку Java (через отладчик) в функцию расшифровки, и она работала нормально.Зашифрованная строка не может быть декодирована как в расшифровке, так и в ее Java-версии с той же ошибкой

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

namespace Krypto
{
    class Program
    {
        static void Main(string[] args)
        {
        string text;
        string key;
        string encrypText;
        string decryptText;

        Console.Write("Plese enter text to encrypt:");
        text = Console.ReadLine();

        Console.WriteLine("");

        Console.Write("Plese enter Key:");
        key = Console.ReadLine();
        Console.WriteLine("");

        encrypText = EncryptString(text, key);
        Console.WriteLine("The encrypted string is: "+ encrypText);

        decryptText = Decrypt(encrypText, key);
        Console.WriteLine("The decrypted string is: " + decryptText);

        if (text.Equals(decryptText)) Console.WriteLine("The test was sucessful");
        else Console.WriteLine("The test failed!");

        Console.ReadKey();

        }


        static string EncryptString(string text, string key)
        {
            byte[] key16 = getKey16(key);
            string text64 = System.Convert.ToBase64String(System.Text.ASCIIEncoding.UTF8.GetBytes(text));
            byte[] encrypted;

            byte[] ivArr = { 1, 3, 3, 4, 5, 6, 6, 7, 4, 3, 2, 1, 7, 5, 5, 7 };
            byte[] IVBytes16Value = new byte[16];
            Array.Copy(ivArr, IVBytes16Value, 16);

        // Create an RijndaelManaged object 
        // with the specified key and IV. 
        using (RijndaelManaged aes = new RijndaelManaged())
            {
                aes.Key = key16; 
                aes.IV = IVBytes16Value;
                aes.BlockSize = 128;
                aes.KeySize = 256;
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.PKCS7; 


            // Create a decryptor to perform the stream transform.
            ICryptoTransform encryptor = aes.CreateEncryptor();

            try
            {
                byte[] textBytes = Convert.FromBase64CharArray(text64.ToCharArray(), 0, text64.Length);
                encrypted = encryptor.TransformFinalBlock(textBytes, 0, textBytes.Length);
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: " + e.Message);
                return "";
            };

        }


            // Return the encrypted bytes from the memory stream. 
            return Convert.ToBase64String(encrypted); 

        }

    private static string Decrypt(string CipherText, string key)
    {
        byte[] key16 = getKey16(key);
        RijndaelManaged aes = new RijndaelManaged();
        aes.BlockSize = 128;
        aes.KeySize = 256;

        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.PKCS7;

        byte[] ivArr = { 1, 3, 3, 4, 5, 6, 6, 7, 4, 3, 2, 1, 7, 5, 5, 7 };
        byte[] IVBytes16Value = new byte[16];
        Array.Copy(ivArr, IVBytes16Value, 16);

        aes.Key = key16;
        aes.IV = IVBytes16Value;

        ICryptoTransform decrypto = aes.CreateDecryptor();
        byte[] decryptedData = null;

        try
        {
            byte[] encryptedBytes = Convert.FromBase64CharArray(CipherText.ToCharArray(), 0, CipherText.Length);
            decryptedData = decrypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.Message);
            return ""; 
        };
            return System.Text.ASCIIEncoding.UTF8.GetString(decryptedData);
        }

    }

private static byte[] getKey16(string key)
        {
            byte[] key16 = new byte[16];
            //make key a 64bit string
            string base64key = System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(key));
            byte[] keyArr = Convert.FromBase64String(base64key);

            int keyarraysize = keyArr.Count();

            if (keyarraysize < 16)
            {
                int counter = 0;
                while (keyarraysize * (counter + 1) < 16)
                {
                    for (int i = 0; i < keyarraysize; ++i) key16[i + keyarraysize * counter] = keyArr[i];
                    ++counter;
                }
                for (int i = keyarraysize * counter; i < 16; ++i)
                {
                key16[i] = 0; 
                }
            }
            else for (int i = 1; i < 16; ++i) key16[i] = keyArr[i];
            return key16;

        }
}

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

Пожалуйста, введите текст для шифрования: Это тест

Пожалуйста, введите ключ: testKey

Зашифрованная строкаis: vLCR4QCJcVHvN4ss7H4Q2g == Ошибка: заполнение недопустимо и не может быть удалено.Расшифрованная строка: Тест не пройден!

1 Ответ

0 голосов
/ 08 февраля 2019

Если вы установите KeySize, ключ будет установлен в ноль (генерируется случайный ключ).

См. источник

На самом деле вы надеваетеНе нужно устанавливать KeySize, потому что программа знает, как вычислить с помощью ключа.

...