2010-11-19 15 views
1

Ich habe 4 Bytes Daten und brauche ein Array mit 8 Bytes für eine Sicherheitsoperation. Ich sollte diese 8 Bytes aus dem 4 Byte Byte-Array erzeugen und das sollte reproduzierbar sein.Wie produziere ich 8 Bytes aus 4 Bytes mit einer reproduzierbaren Operation?

Ich dachte über die Verwendung exakter Byte-Arrays und das Hinzufügen von 4 zusätzlichen Bytes und fülle sie mit AND, OR, XOR ... des ursprünglichen Arrays in einer bekannten Reihenfolge. Ich bin mir nicht sicher, ob es eine gute Idee ist. Ich brauche nur ein 8-Byte-Array von diesen 4 Bytes und die Operation sollte reproduzierbar sein (gleiche 8 Bytes mit gleichen gegebenen 4 Bytes). Bitte geben Sie ein Beispiel in C#

+0

Ich weiß nicht, ob ich den Punkt hier verpasse, aber das Beste, was zu tun wäre, wäre nur mit 4 leeren Bytes zu füllen? Es ist gültig und reproduzierbar. –

+0

Viele Möglichkeiten, das zu tun .... einfach kopieren Sie es zweimal, pad mit 0s, kopieren und rückgängig machen, hash es, ... kann sogar die Reihenfolge mischen, so dass es nicht immer die letzten oder ersten 4 Bytes, die signifikant sind. – mpen

+0

Ist der Code erforderlich, um auch auf Big-Endian-Systemen zu arbeiten? – CodesInChaos

Antwort

4

Warum nicht nur die vorhandenen 4 Bytes mit weiteren 4 Bytes Nullen auffüllen? Oder wiederhole die ursprünglichen 4 Bytes. Zum Beispiel:

static byte[] Pad(byte[] input) 
{ 
    // Alternatively use Array.Resize 
    byte[] output = new byte[input.Length + 4]; 
    Buffer.BlockCopy(input, 0, output, 0, input.Length); 
    return output; 
} 

static byte[] Repeat(byte[] input) 
{ 
    byte[] output = new byte[input.Length * 2]; 
    Buffer.BlockCopy(input, 0, output, 0, input.Length); 
    Buffer.BlockCopy(input, 0, output, input.Length, input.Length); 
    return output; 
} 

Beide erfüllen Ihre ursprünglichen Kriterien, glaube ich ... aber ich vermute, Sie suchen etwas anderes. Wenn das der Fall ist, müssen Sie explizit angeben, was Sie brauchen.

EDIT: Wie ich in den Kommentaren gesagt habe, fügen Sie im Grunde keine echte Sicherheit hier - Padding wird das klarer machen, IMO. Auf der anderen Seite, wenn Sie tun wollen einige Sicherheit-durch-Obskurität, könnten Sie einen Zufallsgenerator, der Seeding ermöglicht, und verwenden Sie das als Ausgangspunkt. Zum Beispiel:

// Don't use this - see below. Just the concept... 
int seed = BitConverter.ToInt32(input, 0); // TODO: Cope with endianness 
Random rng = new Random(seed); 
byte[] output = new byte[8]; 
Buffer.BlockCopy(input, 0, output, 0, 4); 
for (int i = 4; i < 8; i++) { 
    output[i] = (byte) rng.Next(256); 
} 

Nun, der Grund, warum ich den Kommentar oben habe, ist, dass Sie wahrscheinlich einen Algorithmus benötigen, die nicht ändern zwischen Versionen von .NET gewährleistet ist. Finden Sie Code zu etwas wie dem Mersenne Twister, zum Beispiel.

+0

Es sollte ein wenig komplex sein, auf den ersten Blick zu erraten – Xaqron

+2

@Xaqron: Klingt wie Sicherheit durch Unklarheit für mich ... –

+0

Ja, das ist Sicherheit durch Dunkelheit um die Hälfte seit der ersten Hälfte ist Sicherheit durch Design und genug für meine Situation. – Xaqron

1

Wie wäre es

bytes.Concat(bytes) 
1

würde ich sehr vorsichtig sein. Wenn eine Sicherheitsoperation Daten mit 64 Bit erfordert, ist dies wahrscheinlich darauf zurückzuführen, dass so viele Daten erforderlich sind. Wenn Sie Ihre 64 Bits aus 32 Bits mit einer bekannten reproduzierbaren Formel erstellen, haben Sie immer noch nur 32 Bits an Daten.

Wenn die Sicherheit nicht von den Daten beeinflusst wird, die Sie haben, können Sie einfach die verbleibenden vier Bytes mit Einsen oder Nullen füllen. Aber Sie sollten wirklich versuchen, 8 Bytes von "echten" Daten zu bekommen.

+0

Ich stimme zu, aber Projektbeschränkungen zwingen mich dazu (zumindest ist dies in meinem Fall eine dynamische Lösung), anstatt einen 8-Byte-Array in meinem Code fest zu programmieren. Tatsächlich sind 4 Bytes genug, aber ich war ein wenig pessimistisch. – Xaqron

Verwandte Themen