Использование Java для шифрования целых чисел - PullRequest
6 голосов
/ 26 ноября 2008

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

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

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

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

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

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

JBU

Ответы [ 7 ]

12 голосов
/ 26 ноября 2008

Вы можете превратить целые числа в байт [], используя 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();
9 голосов
/ 26 ноября 2008

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

 BigInteger.valueOf(integer).toByteArray();
5 голосов
/ 27 ноября 2008

Просто используйте NIO. Он предназначен для этой конкретной цели. 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
3 голосов
/ 26 ноября 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

0 голосов
/ 01 июля 2018

Мое простое решение заключается в том, что шифруйте целое число в строку, сдвигая 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.

0 голосов
/ 23 июня 2015

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

    Integer.toString(int).getBytes();

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

Чтобы преобразовать обратно:

    Integer.parseInt(encryptedString);
0 голосов
/ 23 декабря 2008

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

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

...