5

私はRSA暗号化を行っており、長い文字列を小さなバイト[]に分割して暗号化する必要があります。次に、配列を組み合わせて文字列に変換し、安全なファイルに書き込みます。

次に、暗号化によってバイトが作成されます[128]

私はこれを次のように組み合わせて使用​​します。

public static byte[] Combine(params byte[][] arrays)
{
    byte[] ret = new byte[arrays.Sum(x => x.Length)];
    int offset = 0;
    foreach (byte[] data in arrays)
    {
        Buffer.BlockCopy(data, 0, ret, offset, data.Length);
        offset += data.Length;
    }
    return ret;
}

復号化するときは、文字列を取得し、それをbyte []配列に変換します。次に、チャンクをデコードするために文字列を分割してから、文字列に変換する必要があります。

何か案は?

ありがとう

編集:

分割は機能していると思いますが、復号化は失敗します。これはRSAキーなどが原因ですか?TimePointAでは暗号化され、TimePointBでは復号化が試みられて失敗します。公開鍵は異なるため、それが問題であるかどうかはわかりません。

4

5 に答える 5

4

復号化するときは、復号化バッファ用に 1 つの配列を作成して再利用できます。

また、通常、RSA は AES などの対称キーの暗号化に使用され、対称アルゴリズムは実際のデータの暗号化に使用されます。これは、1 暗号ブロックよりも長い場合は非常に高速です。データを復号化するには、RSA で対称キーを復号化し、続いてそのキーでデータを復号化します。

byte[] buffer = new byte[BlockLength];
// ASSUMES SOURCE IS padded to BlockLength
for (int i = 0; i < source.Length; i += BlockLength)
{
    Buffer.BlockCopy(source, i, buffer, 0, BlockLength);
    // ... decode buffer and copy the result somewhere else
}

編集 2: データを生のバイトとしてではなく文字列として格納する場合は、最も安全な変換ソリューションとしてConvert.ToBase64String()andを使用します。Convert.FromBase64String()

編集 3: 彼の編集から:

private static List<byte[]> splitByteArray(string longString)
{
    byte[] source = Convert.FromBase64String(longString);
    List<byte[]> result = new List<byte[]>();

    for (int i = 0; i < source.Length; i += 128)
    {
        byte[] buffer = new byte[128];
        Buffer.BlockCopy(source, i, buffer, 0, 128);
        result.Add(buffer);
    }
    return result;
}
于 2009-07-22T08:56:25.153 に答える
3

私はこのような何かがそれを行うだろうと言うだろう:

        byte[] text = Encoding.UTF8.GetBytes(longString);
        int len = 128;

        for (int i = 0; i < text.Length; )
        {
            int j = 0;
            byte[] chunk = new byte[len];
            while (++j < chunk.Length && i < text.Length)
            {
                chunk[j] = text[i++];
            }
            Convert(chunk); //do something with the chunk
        }
于 2009-07-22T08:56:42.093 に答える
0

文字列を可変長のチャンクに分割する必要があるのはなぜですか? 固定長のチャンク、またはチャンクをまったく使用しないと、これが大幅に簡素化されます。

于 2009-07-22T08:54:23.067 に答える
0

「公開鍵が違う」?

秘密鍵で暗号化し、秘密鍵に対応する公開鍵で復号化します。

それ以外は意味不明になります。

于 2009-07-22T09:01:17.670 に答える
0

自分でバイトを行う代わりに、フレームワークを使用しないのはなぜですか?

http://www.codinghorror.com/blog/archives/001275.html

于 2009-07-22T10:29:55.353 に答える