C # Split byte [] массив - PullRequest
       18

C # Split byte [] массив

4 голосов
/ 22 июля 2009

Я выполняю шифрование 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 [] и теперь нужно разделить ее для декодирования кусков, а затем преобразовать в строку.

Есть идеи?

Спасибо

EDIT:

Я думаю, что у меня сейчас работает сплит, однако расшифровка не удалась. Это из-за ключей RSA и т. Д.? В TimePointA он шифрует его, затем в TimePointB пытается расшифровать, и это не удается. Публичные ключи разные, поэтому не уверен, что это проблема.

Ответы [ 5 ]

3 голосов
/ 22 июля 2009

Когда вы расшифровываете, вы можете создать один массив для буфера расшифровки и использовать его повторно:

Кроме того, обычно 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() и 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;
}
3 голосов
/ 22 июля 2009

Я бы сказал, что-то вроде этого сделало бы:

        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
        }
0 голосов
/ 22 июля 2009

почему бы не использовать фреймворк вместо того, чтобы делать что-то самостоятельно?

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

0 голосов
/ 22 июля 2009

"публичные ключи разные"?

Вы шифруете закрытым ключом и расшифровываете открытым ключом, который соответствует закрытому ключу.

Все остальное даст вам бред.

0 голосов
/ 22 июля 2009

Зачем вам нужно разбивать строку на куски переменной длины? Куски фиксированной длины, или вообще не содержащие чанки, значительно упростили бы это.

...