2008-11-26 17 views
6

Estoy tratando de encriptar algunos enteros en java usando java.security y javax.crypto.Usando java para encriptar enteros

El problema parece ser que la clase Cipher solo encripta las matrices de bytes. No puedo convertir directamente un entero a una cadena de bytes (¿o puedo?). ¿Cuál es la mejor manera de hacer esto?

¿Debo convertir el número entero en una cadena y la cadena en byte []? Esto parece demasiado ineficiente.

¿Alguien sabe de una manera rápida/fácil o eficiente para hacerlo?

Háganme saber.

Gracias de antemano.

JBU

+0

Hmm .. vas entre diferentes Endianness? Si es así, los enteros serían incorrectos al convertirlos de la matriz de bytes. – SCdF

+0

Aparentemente, "la máquina virtual Java siempre usa big-endian", así que supongo que no es un problema. – SCdF

Respuesta

12

Puede convertir enteros en un byte [] utilizando un DataOutputStream, así:

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

Entonces para descifrarlo más tarde:

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

He encontrado el siguiente código que puede ayudarlo, ya que Integer en Java siempre tiene 4 bytes de longitud.

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

Puede encontrar más información acerca del parámetro bigEndian aquí: http://en.wikipedia.org/wiki/Endianness

9

También se puede utilizar para la conversión BigInteger:

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

está creando un objeto de cadena intermedia no necesario en este proceso. – OscarRyz

5

sólo tiene que utilizar NIO. Está diseñado para este propósito específico. ByteBuffer e IntBuffer harán lo que necesites de manera rápida, eficiente y elegante. Manejará la conversión endian grande/pequeña, los búferes "directos" para alto rendimiento IO, e incluso puede mezclar tipos de datos en el búfer de bytes.

enteros se convierten en 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 

Convertir bytes en números enteros:

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

crear una matriz de 4 bytes y copiar el int a la matriz en 4 pasos, con ANDs bit a bit y cambio de bits, como dijo Paulo.

Pero recuerde que los algoritmos de bloque como AES y DES funcionan con bloques de 8 o 16 bytes, por lo que deberá rellenar la matriz según lo que necesite el algoritmo. Tal vez deje los primeros 4 bytes de una matriz de 8 bytes como 0, y los otros 4 bytes contienen el número entero.

0

sólo tiene que utilizar:

Integer.toString(int).getBytes(); 

Asegúrese de que utiliza su int original y getBytes() devolverá una matriz de bytes. No hay necesidad de hacer nada más complicado.

Para convertir de nuevo:

Integer.parseInt(encryptedString); 
Cuestiones relacionadas