2009-07-22 3 views
2

Я делаю шифрование RSA, и мне нужно разбить длинную строку на маленький байт [] и зашифровать их. Затем я объединять массивы и преобразовывать в строку и записывать в защищенный файл.C# Split byte [] array

Затем шифрование создает байт [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; 
} 

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

Любые идеи?

Благодаря

EDIT:

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

ответ

3

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

Кроме того, обычно 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 
} 

Edit 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; 
} 
+0

Не уверен, что это – Jon

+0

длина блока Это независимо от размера нужно разделить массив в. :) Также проверьте добавленный 2-й абзац. –

+0

Я использую System.Text.Encoding.Unicode – Jon

0

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

+0

RSA не будет шифровать байт [1024] – Jon

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 
     } 
+0

Буфер. * API-вызовы, как указано в принятом ответе, лучше. –

0

"открытые ключи разные"?

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

Что-нибудь еще даст вам тарабарщину.

+0

У меня он работает, установив RSA.FromXmlString (key) при кодировании, а затем декодируя, я делаю то же самое. Это, похоже, работает, однако, что ключ находится в моем коде, который не может быть безопасным? – Jon

+1

Правильно, его небезопасно. Чтобы быть в безопасности, вы должны понимать безопасность. Просить Stackoverflow не то, где вы собираетесь понять даже основы. Перейдите к «Кодовой книге» Симона Сингха. Его очень доступное и интересное чтение, и после того, как вы пройдете его, вы начнете понимать фонды. – Will

+0

О, и вы не используете тот же ключ для шифрования и дешифрования. Вы шифруете «общедоступный» ключ и дешифруете с помощью соответствующего «частного» ключа. – Will