8

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);
    }
}

}

4

2 に答える 2

1

base64 文字列は英数字と「+」、「/」、「=」のみを使用します。

詳細はこちら

于 2011-07-18T20:50:42.200 に答える
1

これは、公開鍵/秘密鍵の処理とは関係ありません (その部分は問題ないように見えますが、ファイル I/O は簡単に実行できます)。

ただし、暗号化されたデータを文字列として転送する方法は、「往復」には適していません。代わりに Base64 エンコーディングを使用してください。

デバッガーでこれを確認できるはずです。長さと最初のバイトを書き留めてください。これは Decrypt メソッドでencryptedData一致する必要があります。d

于 2011-07-18T16:51:15.687 に答える