Шифрование с существующим модулем RSA и показателем степени C# - PullRequest
0 голосов
/ 07 апреля 2020

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

static void Main(string[] args)
{
    RSAParameters result = new RSAParameters())

        Modulus = Convert.FromBase64String("MjMwMDM5MDYyODE5NDc3MTQwODE5MzM0MTM4NzgzNjUyNTQ1MTU5NzAxNTY5NjIyMTc4OTc1NzIwODUzNjQwODY2NjM3NTI4NDQ1NDYzODU5MzY0NDY4MjIzMjk0MTI3NTg4NjY5NTQ5NjkxOTgxNTIxOTMwMzEwMTg4Njg4MjMzNjUzOTYwNzkzMzkzNjQwMDEwNjk3MDA3ODA4MDc3NDM1MTc1ODcwMjk2NzQ2ODQzMjAyODgwNzgxNzYzNDcxNTY2OTc0NDQ2MjY2NDA2MTQxOTU1Nzk4MjQwOTMwMjIxNzA4NTkzNDk5NjQ0MDM0ODc3ODQzODYxOTgyOTAyOTYxMzI0NzkyODAzNjQ1Mzk2MTk0ODcyNz=");
        Exponent = Encoding.ASCII.GetBytes("10001");

    byte[] bytes = Encoding.ASCII.GetBytes("data");

    using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
    {
        RSA.ImportParameters(result);
        var encryptedData = RSA.Encrypt(bytes, true);
        Console.WriteLine(encryptedData);
    }
}

В настоящее время это исключение для неверных данных, и я не уверен, почему. Я также попробовал это в python, но результат был неверным. Я открыт для использования другого языка, если мне нужно. Спасибо за помощь!

1 Ответ

1 голос
/ 08 апреля 2020

РЕДАКТИРОВАТЬ 1:

Это очень интересно, но

Convert.FromBase64String("MjMwMDM5MDYyODE5NDc3MTQwODE5MzM0MTM4NzgzNjUyNTQ1MTU5NzAxNTY5NjIyMTc4OTc1NzIwODUzNjQwODY2NjM3NTI4NDQ1NDYzODU5MzY0NDY4MjIzMjk0MTI3NTg4NjY5NTQ5NjkxOTgxNTIxOTMwMzEwMTg4Njg4MjMzNjUzOTYwNzkzMzkzNjQwMDEwNjk3MDA3ODA4MDc3NDM1MTc1ODcwMjk2NzQ2ODQzMjAyODgwNzgxNzYzNDcxNTY2OTc0NDQ2MjY2NDA2MTQxOTU1Nzk4MjQwOTMwMjIxNzA4NTkzNDk5NjQ0MDM0ODc3ODQzODYxOTgyOTAyOTYxMzI0NzkyODAzNjQ1Mzk2MTk0ODcyNz=");

терпит неудачу с неверной длиной.

https://www.base64decode.org/ декодирует это содержимое base64 на

2300390628194771408193341387836525451597015696221789757208536408666375284454638593644682232941275886695496919815219303101886882336539607933936400106970078080774351758702967468432028807817634715669744462664061419557982409302217085934996440348778438619829029613247928036453961948727

Сначала я подумал, что сайт дал мне шестнадцатеричное представление байтов, к которым он декодирует. К сожалению, он просто выводит STRING.

Это означает, что нам нужно применить еще одно преобразование (я сделал это в своем коде, когда выложил ответ здесь, но не показал, как это должно быть сделано в ваш)

Этот код должен работать и для вас:

static void Main(string[] args)
{
    RSAParameters result = new RSAParameters()
    {
        // If the following is working on your system:
        Modulus = HexStringToByteArray(Convert.FromBase64String("MjMwMDM5MDYyODE5NDc3MTQwODE5MzM0MTM4NzgzNjUyNTQ1MTU5NzAxNTY5NjIyMTc4OTc1NzIwODUzNjQwODY2NjM3NTI4NDQ1NDYzODU5MzY0NDY4MjIzMjk0MTI3NTg4NjY5NTQ5NjkxOTgxNTIxOTMwMzEwMTg4Njg4MjMzNjUzOTYwNzkzMzkzNjQwMDEwNjk3MDA3ODA4MDc3NDM1MTc1ODcwMjk2NzQ2ODQzMjAyODgwNzgxNzYzNDcxNTY2OTc0NDQ2MjY2NDA2MTQxOTU1Nzk4MjQwOTMwMjIxNzA4NTkzNDk5NjQ0MDM0ODc3ODQzODYxOTgyOTAyOTYxMzI0NzkyODAzNjQ1Mzk2MTk0ODcyNz=")),
        // And since it is not working on my environment:
        // Modulus = HexStringToByteArray("2300390628194771408193341387836525451597015696221789757208536408666375284454638593644682232941275886695496919815219303101886882336539607933936400106970078080774351758702967468432028807817634715669744462664061419557982409302217085934996440348778438619829029613247928036453961948727"),
        Exponent = HexStringToByteArray("010001")
    };

    byte[] bytes = Encoding.ASCII.GetBytes("data");

    using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
    {
        RSA.ImportParameters(result);
        var encryptedData = RSA.Encrypt(bytes, true);
        Console.WriteLine(encryptedData);
    }
}

ОРИГИНАЛЬНЫЙ ПОЧТ:

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

Exponent = Encoding.ASCII.GetBytes("10001");

На самом деле это шестнадцатеричное представление байтов 0x 01 00 01 (3 байта)

Примечание. Сбой Convert.FromBase64String () для введенного вами ввода. Вот почему была путаница по этому поводу. Это не помогло и на моем локальном компьютере, поэтому я использовал онлайн-декодер , который успешно расшифровал его,

Я использовал это декодированное значение для модуля для воспроизведения.

    public static byte[] HexStringToByteArray(string hexString)
    {
        MemoryStream stream = new MemoryStream(hexString.Length / 2);
        for (int i = default(int); i < hexString.Length; i += 2)
        {
            stream.WriteByte(byte.Parse(hexString.Substring(i, 2), System.Globalization.NumberStyles.AllowHexSpecifier));
        }
        return stream.ToArray();
    }

А потом;

Exponent = HexStringToByteArray("010001")
...