2009-07-22 14 views
2

Ich mache RSA-Verschlüsselung und ich muss meine lange Zeichenfolge in kleine Byte [] teilen und sie verschlüsseln. Ich kombiniere dann die Arrays und konvertiere in eine Zeichenfolge und schreibe in eine sichere Datei.C# Split-Byte [] Array

Dann Byteverschlüsselung erzeugt [128]

Ich benutze dies folgendes zu kombinieren:

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

Wenn ich entschlüsseln ich die Zeichenfolge nehmen, wandelt es in ein byte [] Array und müssen jetzt Teile es, um die Chunks zu dekodieren und konvertiere dann in eine Zeichenkette.

Irgendwelche Ideen?

Dank

EDIT:

Ich glaube, ich habe die Spaltung arbeitet jetzt jedoch die Entschlüsselung fehlschlägt. Ist das wegen RSA-Schlüssel usw.? Bei TimePointA verschlüsselt es es, dann bei TimePointB versucht es zu entschlüsseln und es schlägt fehl. Die öffentlichen Schlüssel sind unterschiedlich, also nicht sicher, ob das das Problem ist.

Antwort

3

Wenn Sie entschlüsseln, können Sie ein Array für Ihre Entschlüsselungs-Puffer erstellen und wiederverwenden:

Auch normalerweise wird RSA einen symmetrischen Schlüssel für so etwas wie AES zu verschlüsseln verwendet, und der symmetrische Algorithmus verwendet, um die verschlüsseln wirkliche Daten. Dies ist enorm schneller für etwas länger als 1 Chiffre Block. Um die Daten zu entschlüsseln, entschlüsseln Sie den symmetrischen Schlüssel mit RSA und entschlüsseln anschließend die Daten mit diesem Schlüssel.

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: Wenn Sie die Daten als Zeichenfolge und nicht als rohes Bytes speichern, verwendet Convert.ToBase64String() und Convert.FromBase64String() als die sicherste Umwandlungslösung.

Bearbeiten 3: Von seiner edit:

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

nicht sicher, was BlockLength ist – Jon

+0

Es ist, was Größe, die Sie in das Array aufteilen müssen. :) Überprüfen Sie auch den hinzugefügten 2. Absatz. –

+0

Ich verwende System.Text.Encoding.Unicode – Jon

0

Warum müssen Sie die Zeichenfolge in Blöcke variabler Länge zerlegen? Chunks fester Länge oder überhaupt keine Chunks würden dies sehr vereinfachen.

+0

RSA wird kein Byte verschlüsseln [1024] – Jon

3

Ich würde sagen, so etwas wie dieses es tun würde:

 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

Die Buffer. * API-Aufrufe wie in der angenommenen Antwort sind besser. –

0

"die öffentlichen Schlüssel unterschiedlich sind"?

Sie verschlüsseln mit einem privaten Schlüssel und entschlüsseln mit dem öffentlichen Schlüssel, der dem privaten Schlüssel entspricht.

Alles andere wird Ihnen Kauderwelsch geben.

+0

Ich habe es funktioniert, indem Sie RSA.FromXmlString (Schlüssel) beim Codieren und Decodieren dann tun, mache ich das gleiche. Dies scheint jedoch zu funktionieren, dass der Schlüssel in meinem Code ist, der nicht sicher sein kann? – Jon

+1

Richtig, es ist nicht sicher. Um sicher zu sein, müssen Sie die Sicherheit verstehen. Mit Stackoverflow können Sie nicht einmal die Grundlagen verstehen. Gehen Sie nach "The Code Book" von Simon Singh. Es ist sehr zugänglich und unterhaltsam zu lesen, und nachdem du es durchgemacht hast, wirst du die Grundlagen verstehen. – Will

+0

Oh, und Sie verwenden nicht den gleichen Schlüssel zum Verschlüsseln und Entschlüsseln. Sie verschlüsseln mit einem "öffentlichen" Schlüssel und entschlüsseln mit dem passenden "privaten" Schlüssel. – Will