example - Usando java para encriptar enteros
encriptar y desencriptar sha1 java (6)
Estoy intentando cifrar algunos enteros en Java usando java.security y javax.crypto.
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?
Por favor hagamelo saber.
Gracias por adelantado.
jbu
He encontrado el siguiente código que puede ser útil, 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 sobre el parámetro bigEndian aquí: http://en.wikipedia.org/wiki/Endianness
Puede convertir ints en un byte [] usando un DataOutputStream, como este:
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
DataOutputStream dos = new DataOutputStream (baos);
dos.writeInt (i);
byte[] data = baos.toByteArray();
// do encryption
Luego para descifrarlo más tarde:
byte[] decrypted = decrypt (data);
ByteArrayInputStream bais = new ByteArrayInputStream (data);
DataInputStream dis = new DataInputStream (bais);
int j = dis.readInt();
También puede usar BigInteger para la conversión:
BigInteger.valueOf(integer).toByteArray();
Solo usa 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.
Convierte enteros 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
Convierte bytes en enteros:
ByteBuffer bbuffer = ByteBuffer.wrap(rawBytes);
IntBuffer ibuffer = bbuffer.asIntBuffer();
while(ibuffer.hasRemaining())
System.out.println(ibuffer.get()); //also has bulk operators
Solo usa:
Integer.toString(int).getBytes();
Asegúrese de utilizar 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);
cree una matriz de 4 bytes y copie la int en la matriz en 4 pasos, con AND a nivel de bit y cambio de bits, como dijo Paulo.
Pero recuerde que los algoritmos de bloques 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.