C # RSACryptoServiceProvider ToXmlString () / FromXmlString () - PullRequest
7 голосов
/ 18 июля 2011

EDIT2: кажется Convert.FromBase64String мой спаситель.Кто-нибудь знает, будет ли в такой строке запятая?Я делаю основной анализ CSV.Если это так, я всегда могу использовать кавычки (но я могу предположить, что кавычки всегда могут быть в такой строке), но для меня это всего лишь небольшой проект, так что его проще разобрать, разделив на ','.

РЕДАКТИРОВАТЬ: ОК, так что, похоже, моя проблема заключается в том, когда я преобразую зашифрованные байты в строку, а затем преобразую эту строку обратно в байты для расшифровки.Как я могу это сделать, потому что я хочу где-то хранить зашифрованную строку и иметь возможность расшифровывать эту строку.

Я пытаюсь сохранить открытый ключ (и закрытый только для тестирования) в XML-файл, такчто я могу прочитать то же самое позже, но получаю ошибку «Bad data» при попытке расшифровать.Кто-нибудь может увидеть, что я делаю не так?

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

namespace EncryptionTest
{
class Program
{
    static void Main(string[] args)
    {
        UnicodeEncoding ByteConverter = new UnicodeEncoding();

        byte[] dataToEncrypt = ByteConverter.GetBytes("Test data");

        WriteRSAInfoToFile();

        string enc = Encrypt(dataToEncrypt);

        enc = Decrypt(enc);
    }

    static void WriteRSAInfoToFile()
    {
        RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
        TextWriter writer = new StreamWriter("C:\\publicKey.xml");
        string publicKey = RSA.ToXmlString(false);
        writer.Write(publicKey);
        writer.Close();

        writer = new StreamWriter("C:\\privateKey.xml");
        string privateKey = RSA.ToXmlString(true);
        writer.Write(privateKey);
        writer.Close();
    }

    static string Encrypt(byte[] data)
    {
        UnicodeEncoding ByteConverter = new UnicodeEncoding();
        RSACryptoServiceProvider encrypt = new RSACryptoServiceProvider();
        TextReader reader = new StreamReader("C:\\publicKey.xml");
        string publicKey = reader.ReadToEnd();
        reader.Close();

        encrypt.FromXmlString(publicKey);

        byte[] encryptedData = encrypt.Encrypt(data, false);

        return ByteConverter.GetString(encryptedData);
    }

    static string Decrypt(string data)
    {
        UnicodeEncoding ByteConverter = new UnicodeEncoding();
        RSACryptoServiceProvider decrypt = new RSACryptoServiceProvider();
        TextReader reader = new StreamReader("C:\\privateKey.xml");
        string privateKey = reader.ReadToEnd();
        reader.Close();

        decrypt.FromXmlString(privateKey);

        byte[] d = ByteConverter.GetBytes(data);
        byte[] decryptedData = decrypt.Decrypt(d, false);       // ERROR: bad data

        return ByteConverter.GetString(decryptedData);
    }
}

}

Ответы [ 2 ]

0 голосов
/ 19 июля 2011

Ответ на ваше второе редактирование - нет, в строках base64 используются только буквенно-цифровые символы и "+", "/" и "=".

Подробнее здесь

0 голосов
/ 18 июля 2011

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

Но ваш способ передачи зашифрованных данных в виде строки не подходит для «туда-обратно».Вместо этого используйте кодировку Base64.

Вы должны увидеть это в отладчике: запишите длину и первые байты encryptedData, и это должно соответствовать d в методе Decrypt.

...