2016-12-13 3 views
1

Wie in einer Datei den Chiffretext und die IV (einer Blockchiffre-Betriebsart, z. B. AES-GCM) zu speichern? Wenn ich sie mit einem Byte, das dem ":" - Zeichen entspricht, getrennt habe, muss ich das gesamte Byte-Array in String konvertieren und dann die Strings in durch ":" getrennte Chunks aufteilen und dann die Chunks wieder in Byte umwandeln Arrays. Gibt es einen einfacheren Weg? Vielleicht kann ein Byte, das wir sicher sind, nicht als Folge einer AES-Verschlüsselung und in einem Initialisierungsvektor erscheinen?Separator für Chiffretext und andere Daten

Der aktuelle Code (in Java) ist der folgende, aber ich bin mir nicht sicher, ob es der beste Weg ist, um zu tun, was ich fragte, und auch wenn es funktioniert, weil ich nicht weiß, ob das Byte ":" kann im IV oder im Chiffretext erscheinen.

FileInputStream keyfis = new FileInputStream("test"); 
byte[] byteRead = new byte[keyfis.available()]; 
keyfis.read(byteRead); 
keyfis.close(); 
String textRead=new String(byteRead); 

String[] parts = textRead.split(":"); 
byte[] encrAESkey=parts[0].getBytes(); 
byte[] myIV=parts[1].getBytes(); 
byte[] myencrtext=parts[2].getBytes(); 
+0

@SibeeshVenu Ich habe meine Frage bearbeitet. –

Antwort

1

Traditionell wird die IV vorangestellt, wie es genau eine Blocklänge (16 bytes) erforderlich ist, zu sein, und Blockchiffre-Modi (außer ECB) erfordert alle die IV (oder Nonce + Zähler). Dann extrahiert Ihr Entschlüsselungscode einfach die erste 16 bytes aus der verschlüsselten Texteingabe und verwendet sie als IV und führt die Entschlüsselungsoperation für die verbleibenden n - 16 bytes durch.

Sie sollten ein Codierungsschema verwenden, um den verschlüsselten Text zu schützen, den Sie in die Datei serialisieren, da Sie sehr wahrscheinlich auf Probleme stoßen werden, wenn Sie rohe Binärbytes schreiben/lesen. Hexadezimale oder Base64-Codierung sind der Standard für diese Operation.

Aus Ihrem Code geht auch hervor, dass Sie den AES-Schlüssel neben dem IV- und Chiffretext speichern. Während die IV ungeschützt neben dem verschlüsselten Text gespeichert werden kann, kann der Schlüssel nicht ohne effektiv jeden Schutz, den die Verschlüsselung bieten würde entfernen.

+0

Mein Code war ein erster "Versuch", AES-GCM zu verwenden. In meinen nachfolgenden Codes habe ich die IV in einer separaten Spalte einer Tabelle gespeichert, die zu einer DB gehört. Wie auch immer, danke für deine Antwort und ja, ich hatte einige Probleme beim Encodieren und Dekodieren von Rohbytes, die ich mit der ISO-8859-1-Codierung löste, wenn ich Bytes von einem String erhalte und wenn ich einen String aus rohen Bytes initialisiere. Es funktioniert gut, aber ich bin interessiert zu wissen, ob es eine gute Lösung ist. –

+0

Das Speichern der IV in einer separaten Spalte ist wirklich nicht notwendig und könnte dazu führen, dass Felder nicht mehr synchron sind, was die Wiederherstellbarkeit des Chiffretextes beeinträchtigen würde. Gibt es einen bestimmten Grund, warum Sie ISO-8859-1 anstelle von UTF-8 verwenden? Wenn ja, ist das in Ordnung, aber wenn Sie keinen Grund haben, möchten Sie wahrscheinlich UTF - für die Klartextnachrichten verwenden. Für den verschlüsselten Text möchten Sie das mit hex oder Base64 kodieren, bevor Sie persistieren. ISO-8859-1 und UTF-8 verwenden beide 8 Bits pro Byte (im Gegensatz zu ASCII 7), garantieren jedoch nicht, dass alle möglichen Codepunkte gültige Zeichen sind. Base64 tut es. – Andy

+0

Warum die IV separat speichern könnte die Felder ausgleichen? Ich benutze UTF-8 nicht, weil es - und ich weiß nicht warum - mein Verschlüsselungsschema nicht funktioniert hat, während es - und es ist merkwürdig - funktioniert es problemlos mit ISO-8859-1. Kannst du erklären, warum der Chiffretext und der Klartext unterschiedliche Kodierungen verwenden sollten? –