para example encriptar encriptacion desencriptar descifrar contraseƱa codigo cifrar java encryption cryptography integer bytearray

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.