2008-11-26 10 views
6

Ich versuche einige Integer in Java mit java.security und javax.crypto zu verschlüsseln.Verwenden von Java zum Verschlüsseln von Ganzzahlen

Das Problem scheint zu sein, dass die Cipher-Klasse nur Byte-Arrays verschlüsselt. Ich kann eine Ganzzahl nicht direkt in eine Byte-Zeichenfolge konvertieren (oder kann ich?). Was ist der beste Weg, dies zu tun?

Sollte ich die ganze Zahl in eine Zeichenfolge und die Zeichenfolge in Byte [] konvertieren? Dies scheint zu ineffizient zu sein.

Kennt jemand eine schnelle/einfache oder effiziente Möglichkeit, es zu tun?

Bitte lassen Sie es mich wissen.

Vielen Dank im Voraus.

JBU

+0

Hmm .. sind Sie zwischen verschiedenen Endianness gehen? Wenn dies der Fall wäre, würden diese Ganzzahlen falsch sein, wenn Sie sie vom Byte-Array zurückkonvertieren. – SCdF

+0

Apperently "Java virtuelle Maschine hat immer Big-Endian verwendet", also denke ich, dass es kein Problem ist. – SCdF

Antwort

12

Sie können Ints in ein Byte drehen [] ein Dataoutputstream verwenden, wie folgt aus:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DataOutputStream dos = new DataOutputStream (baos); 
dos.writeInt (i); 
byte[] data = baos.toByteArray(); 
// do encryption 

Dann ist es zu entschlüsseln später:

byte[] decrypted = decrypt (data); 
ByteArrayInputStream bais = new ByteArrayInputStream (data); 
DataInputStream dis = new DataInputStream (bais); 
int j = dis.readInt(); 
3

ich folgendes gefunden haben Code, der Ihnen helfen kann, da Integer in Java immer 4 Bytes lang ist.

public static byte[] intToFourBytes(int i, boolean bigEndian) { 
    if (bigEndian) { 
     byte[] data = new byte[4]; 
     data[3] = (byte) (i & 0xFF); 
     data[2] = (byte) ((i >> 8) & 0xFF); 
     data[1] = (byte) ((i >> 16) & 0xFF); 
     data[0] = (byte) ((i >> 24) & 0xFF); 
     return data; 

    } else { 
     byte[] data = new byte[4]; 
     data[0] = (byte) (i & 0xFF); 
     data[1] = (byte) ((i >> 8) & 0xFF); 
     data[2] = (byte) ((i >> 16) & 0xFF); 
     data[3] = (byte) ((i >> 24) & 0xFF); 
     return data; 
    } 
} 

Hier können Sie weitere Informationen über den bigEndian Parameter finden: http://en.wikipedia.org/wiki/Endianness

9

Sie können auch BigInteger für die Konvertierung verwenden:

BigInteger.valueOf(integer).toByteArray(); 
+1

Sie erstellen ein un benötigtes intermediate string-Objekt in diesem Prozess. – OscarRyz

5

Nur NIO verwenden. Es ist für diesen speziellen Zweck konzipiert. ByteBuffer und IntBuffer erledigen schnell, effizient und elegant, was Sie brauchen. Es wird Big/Little Endian-Konvertierung, "direkte" Puffer für Hochleistungs-IO verarbeiten, und Sie können sogar Datentypen in den Byte-Puffer mischen.

Convert ganze Zahlen in Bytes

ByteBuffer bbuffer = ByteBuffer.allocate(4*theIntArray.length); 
IntBuffer ibuffer = bbuffer.asIntBuffer(); //wrapper--doesn't allocate more memory 
ibuffer.put(theIntArray);     //add your int's here; can use 
              //array if you want 
byte[] rawBytes = bbuffer.array();   //returns array backed by bbuffer-- 
              //i.e. *doesn't* allocate more memory 

Bytes in ganzen Zahlen Konvertieren:

ByteBuffer bbuffer = ByteBuffer.wrap(rawBytes); 
IntBuffer ibuffer = bbuffer.asIntBuffer(); 
while(ibuffer.hasRemaining()) 
    System.out.println(ibuffer.get());  //also has bulk operators 
0

einen 4-Byte-Array erzeugen und die int mit dem Array in 4 Schritten kopieren, mit bitweise UNDs und Bitshifting, wie Paulo sagte.

Denken Sie jedoch daran, dass Blockalgorithmen wie AES und DES mit Blöcken von 8 oder 16 Byte arbeiten. Daher müssen Sie das Array auf das anpassen, was der Algorithmus benötigt. Vielleicht lassen Sie die ersten 4 Bytes eines 8-Byte-Arrays als 0, und die anderen 4 Bytes enthalten die ganze Zahl.

0

Verwenden Sie einfach:

Integer.toString(int).getBytes(); 

Stellen Sie sicher, dass Ihre ursprünglichen int und getBytes() verwenden, wird ein Byte-Array zurück. Keine Notwendigkeit, etwas Kompliziertes zu tun.

konvertieren zurück:

Integer.parseInt(encryptedString); 
Verwandte Themen