Member 14736805 Ответов: 4

Есть ли способ зашифровать строку с помощью закрытого ключа в алгоритме RSA и расшифровать ее с помощью открытого ключа в C# .NET?


У меня есть строка, например str = "Hello World", которую я должен зашифровать с помощью закрытого ключа алгоритма RSA и расшифровать то же самое с помощью открытого ключа в .Net.

Что я уже пробовал:

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

johannesnestler

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

4 Ответов

Рейтинг:
2

Patrice T

Цитата:
Есть ли способ зашифровать строку с помощью закрытого ключа в алгоритме RSA и расшифровать ее с помощью открытого ключа в C# .NET?

RSA работает наоборот, шифрование осуществляется с помощью открытого ключа, дешифрование-с помощью закрытого ключа. Вот как работает алгоритм.
Ответ не зависит от конкретного языка.


Рейтинг:
1

phil.o

Нет, здесь все наоборот.
То общественный ключ используется для того, чтобы зашифровать сообщения и проверка подписей.
То частный ключ, с другой стороны, используется для расшифровать и подписывать сообщения.
Алгоритм RSA не является коммутативной операцией.


Maciej Los

Я бы сказал, что оба ключа необходимы, потому что закрытый ключ никогда не станет открытым, и наоборот.
Более подробная информация о компании Википедия
5ed!

phil.o

Конечно, они образуют пару значений, соответствующих друг другу. Вопрос ОП заключается в том, можно ли их использовать в обратном порядке для получения эквивалентного результата, но это не так.
Спасибо за Вашу поддержку Мацей :)

Maciej Los

:большой палец вверх:

Рейтинг:
1

F-ES Sitecore

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


Рейтинг:
0

George Swan

Попробуйте использовать пакет NuGet BouncyCastle.NetCore. Он более гибок, чем RSACryptoServiceProvider и связанные с ним классы. Вот пример консоли NetCore. Размер сообщения, которое может быть зашифровано, ограничен размером ключей.


//Derived from http://www.go4expert.com/articles/bouncy-castle-net-implementationrsa-t24827/
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using System;
using System.Text;

namespace EncryptString
{
    class Program
    {
        public static void Main()
        {
            RsaKeyPairGenerator rsaKeyPairGenerator = new RsaKeyPairGenerator();
            int keySize = 2048;//in bits
            rsaKeyPairGenerator.Init(new KeyGenerationParameters(new SecureRandom(), keySize));
            var keyPair = rsaKeyPairGenerator.GenerateKeyPair();
            var publicKey = keyPair.Public;
            var privateKey = keyPair.Private;
            var rsa = new RsaEngine();
            rsa.Init(true, privateKey);//use private key for encryption-not recommended
            string message = "Hello World";
            Console.WriteLine($"Original text: {message}");
            var plainTextBytes = Encoding.UTF8.GetBytes(message);
            byte[] cipherBytes = rsa.ProcessBlock(plainTextBytes, 0, message.Length);
            Console.WriteLine("Encrypted text as a byte array:");
            Console.WriteLine(BitConverter.ToString(cipherBytes));
            rsa.Init(false, publicKey);//use public key for decryption
            byte[] decryptedData = rsa.ProcessBlock(cipherBytes, 0, cipherBytes.Length);
            string decipheredText = Encoding.UTF8.GetString(decryptedData);
            Console.WriteLine($"Decrypted text: {decipheredText}");
            Console.ReadLine();
          
        }
    
    }
}