RSA-шифрование больших данных на C #

Это мой первый пост, так что надеюсь, что я не пропустил ничего важного . Я делаю проект на C #, где мне нужно использовать шифрование с открытым / закрытым ключом, чтобы зашифровать сообщение, а затем отправить его по SSL-соединению.

Я решил использовать RSACryptoService , поскольку, согласно документации, это была единственная схема асимметричного шифрования, используемая для шифрования данных. Проблема в том, что у меня с этим много проблем. (Я хотел использовать симметричное шифрование, но мой учитель не хочет, чтобы я делал это, и, по его словам, должно быть легко просто определить размер блока, и тогда он должен сделать всю работу за вас.) Что ж, пока не повезло, и я пробовал несколько разных подходов, но теперь я вернулся к основам и попробовал еще раз, это мой текущий код:

    public string[] GenerateKeysToStrings(string uniqueIdentifier)
    {
        string[] keys;
        using (var rsa = new RSACryptoServiceProvider(4096))
        {
            try
            {
                string privateKey = rsa.ToXmlString(true);
                string publicKey = rsa.ToXmlString(false);

                this.pki.StoreKey(publicKey, uniqueIdentifier);

                keys = new string[2];
                keys[0] = privateKey;
                keys[1] = publicKey;
            }
            finally
            {
                //// Clear the RSA key container, deleting generated keys.
                rsa.PersistKeyInCsp = false;
            }
        }
        return keys;
    }

Как видите, я генерирую ключи и имитирую PKI, отправляя общедоступный ключ к простому классу, который его хранит, а затем закрытый ключ записывается в файл (Обратите внимание, что у меня также есть другой метод, который делает то же самое, но вместо этого сохраняет его в массиве, просто потому, что я хотел протестировать и упростить вещи, когда я получаю Нет таких ключевых исключений , а иногда и криптографических исключений, когда я это делаю способ, показанный в примере, поэтому я хотел упростить его, просто сохранив строку rsa.ToXmlString как строку в массиве, но безуспешно.)

Теперь у меня есть следующий метод шифрования и дешифрования:

    public string Encrypt(string keyString, string message)
    {
        string encryptedMessage;
        using (var rsa = new RSACryptoServiceProvider())
        {
            try
            {
                //// Load the key from the specified path
                var encryptKey = new XmlDocument();
                encryptKey.Load(@"C:\Test\PrivateKeyInfo.xml");
                rsa.FromXmlString(encryptKey.OuterXml);


                //// Conver the string message to a byte array for encryption
                //// var encoder = new UTF8Encoding();
                ASCIIEncoding byteConverter = new ASCIIEncoding();
                byte[] dataToEncrypt = byteConverter.GetBytes(message);

                byte[] encryptedData = rsa.Encrypt(dataToEncrypt, false);

                //// Convert the byte array back to a string message
                encryptedMessage = byteConverter.GetString(encryptedData);
            }
            finally
            {
                //// Clear the RSA key container, deleting generated keys.
                rsa.PersistKeyInCsp = false;
            }
        }
        return encryptedMessage;
    }

Расшифровка:

    public string Decrypt(string keyString, string message)
    {
        string decryptedText;
        using (var rsa = new RSACryptoServiceProvider())
        {
            try
            {
                //// Loads the keyinfo into the rsa parameters from the keyfile
                /*
                var privateKey = new XmlDocument();
                privateKey.Load(keyString);
                 */
                rsa.FromXmlString(keyString);

                //// Convert the text from string to byte array for decryption
                ASCIIEncoding byteConverter = new ASCIIEncoding();
                var encryptedBytes = byteConverter.GetBytes(message);

                //// Create an aux array to store all the encrypted bytes
                byte[] decryptedBytes = rsa.Decrypt(encryptedBytes, false);

                decryptedText = byteConverter.GetString(decryptedBytes);
            }
            finally
            {
                //// Clear the RSA key container, deleting generated keys.
                rsa.PersistKeyInCsp = false;
            }
        }
        return decryptedText;
    }

Я знаю, что это стена текста, но я надеюсь, что вы можете мне помочь, потому что я бился головой о стена так давно уже не смешно :)

Проблема в том, как мне зашифровать сообщения с помощью RSA (или любого другого шифрования с открытым / закрытым ключом)

Вот тест client:

    public static void Main(string[] args)
    {
        PublicKeyInfrastructure pki = new PublicKeyInfrastructure();
        Cryptograph crypto = new Cryptograph();
        string[] keys = crypto.GenerateKeysToStrings("simonlanghoff@gmail.com");


        string plainText = "Hello play with me, please";
        string publicKey = crypto.GetPublicKey("simonlanghoff@gmail.com");

        string encryptedText = crypto.Encrypt(keys[0], plainText);


        string decryptedText = crypto.Decrypt(keys[1], encryptedText);

    }

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

Когда я запускаю тестовый клиент, если я использую закрытый ключ для шифрования и открытый ключ для дешифровать, я получаю «исключение ключа не существует», и если я сделаю это наоборот, я получаю исключение неверных данных.

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

Я ценю любую помощь.

8
задан Simon Langhoff 7 December 2011 в 17:01
поделиться