Использование java для шифрования целых чисел

Я пытаюсь зашифровать некоторые целые числа в java, используя java.security и javax.crypto.

Проблема, похоже, в том, что класс Cipher шифрует только байтовые массивы. Я не могу напрямую преобразовать целое число в байтовую строку (или могу?). Как лучше всего это сделать?

Должен ли я преобразовать целое число в строку и строку в байт []? Это кажется слишком неэффективным.

Кто-нибудь знает быстрый/легкий или эффективный способ сделать это?

Пожалуйста, дайте мне знать.

Заранее спасибо.

джбу


person jbu    schedule 26.11.2008    source источник
comment
Хм... ты собираешься между разными Endianness? Если это так, это приведет к тому, что эти целые числа будут неверными, когда вы преобразуете их обратно из массива байтов.   -  person SCdF    schedule 26.11.2008
comment
По-видимому, виртуальная машина Java всегда использовала обратный порядок байтов, поэтому я думаю, что это не проблема.   -  person SCdF    schedule 26.11.2008


Ответы (7)


Вы можете превратить целые числа в byte[] с помощью DataOutputStream, например:

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

Затем, чтобы расшифровать его позже:

byte[] decrypted = decrypt (data);
ByteArrayInputStream bais = new ByteArrayInputStream (data);
DataInputStream dis = new DataInputStream (bais);
int j = dis.readInt();
person jodonnell    schedule 26.11.2008

Вы также можете использовать BigInteger для преобразования:

 BigInteger.valueOf(integer).toByteArray();
person asalamon74    schedule 26.11.2008
comment
в этом процессе вы создаете ненужный промежуточный строковый объект. - person OscarRyz; 23.12.2008

Просто используйте НИО. Он предназначен для этой конкретной цели. ByteBuffer и IntBuffer сделают то, что вам нужно, быстро, эффективно и элегантно. Он будет обрабатывать преобразование с прямым порядком байтов, «прямые» буферы для высокопроизводительного ввода-вывода, и вы даже можете смешивать типы данных в байтовом буфере.

Преобразование целых чисел в байты:

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

Преобразование байтов в целые числа:

ByteBuffer bbuffer = ByteBuffer.wrap(rawBytes);
IntBuffer ibuffer = bbuffer.asIntBuffer();
while(ibuffer.hasRemaining())
   System.out.println(ibuffer.get());      //also has bulk operators
person James Schek    schedule 26.11.2008

Я нашел следующий код, который может вам помочь, поскольку Integer в Java всегда имеет длину 4 байта.

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

Дополнительную информацию о параметре bigEndian можно найти здесь: http://en.wikipedia.org/wiki/Endianness

person Paulo Guedes    schedule 26.11.2008

создайте 4-байтовый массив и скопируйте int в массив за 4 шага с побитовыми операциями AND и битовым сдвигом, как сказал Пауло.

Но помните, что блочные алгоритмы, такие как AES и DES, работают с 8- или 16-байтовыми блоками, поэтому вам нужно будет дополнить массив тем, что нужно алгоритму. Возможно, оставить первые 4 байта 8-байтового массива как 0, а остальные 4 байта содержат целое число.

person Chochos    schedule 22.12.2008

Просто используйте:

    Integer.toString(int).getBytes();

Убедитесь, что вы используете исходный int, и getBytes() вернет массив байтов. Больше ничего сложного делать не нужно.

Чтобы конвертировать обратно:

    Integer.parseInt(encryptedString);
person Jon Downs    schedule 23.06.2015

Мое простое решение заключается в том, что зашифруйте целое число в строку, сдвинув значение ASCII целого числа на предоставленный вами секретный ключ.

Вот решение:

public String encodeDiscussionId(int Id) {

    String tempEn = Id + "";
    String encryptNum ="";
    for(int i=0;i<tempEn.length();i++) {
        int a = (int)tempEn.charAt(i);
        a+=148113;
        encryptNum +=(char)a;
    }
    return encryptNum;
}

public Integer decodeDiscussionId(String encryptText) {

    String decodeText = "";
    for(int i=0;i<encryptText.length();i++) {
        int a= (int)encryptText.charAt(i);
        a -= 148113;
        decodeText +=(char)a;
    }
    int decodeId = Integer.parseInt(decodeText);
    return decodeId;
}

Шаги для кодирования:

  1. Здесь сначала вы конвертируете данное целое число в строку: String temp = givenInt + ""
  2. Отсканируйте каждый символ строки, прочитайте ASCII этого символа и добавьте его с секретным ключом как 148113 в этом случае.
  3. Преобразуйте смещенный Integer в символ и соедините с String encryptNum и, наконец, верните его.

Шаги для декодирования:

  1. Отсканируйте каждый символ строки, прочитайте ASCII этого символа и вычтите его с помощью секретного ключа, как и в предыдущем случае.
  2. Преобразуйте это значение в символ и соедините с decodeText.

Как и в предыдущем коде, вывод всегда String '???' и зависит от количества цифр ввода Id.

person susan097    schedule 01.07.2018