2008-11-26 9 views
6

Próbuję zaszyfrować niektóre liczby całkowite w java za pomocą java.security i javax.crypto.Używanie java do szyfrowania liczb całkowitych

Problem polega na tym, że klasa Cipher szyfruje jedynie tablice bajtów. Nie mogę bezpośrednio przekonwertować liczby całkowitej na ciąg bajtów (lub czy mogę?). Jaki jest najlepszy sposób na zrobienie tego?

Czy należy przekonwertować liczbę całkowitą na ciąg, a ciąg na bajt []? Wydaje się to zbyt mało skuteczne.

Czy ktoś zna szybki/łatwy lub skuteczny sposób to zrobić?

Proszę dać mi znać.

Z góry dziękuję.

JBU

+0

Hmm .. idziesz między różnymi endianness? Jeśli tak, to spowoduje, że te liczby całkowite będą niepoprawne, gdy skonwertujesz je z powrotem z tablicy bajtów. – SCdF

+0

Apparerntly "Maszyna wirtualna Java zawsze używała big-endian", więc myślę, że to nie problem. – SCdF

Odpowiedz

12

Można włączyć ints do byte [] przy użyciu DataOutputStream, tak:

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

Wtedy by go odszyfrować później:

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

Znalazłem następujące kod, który może ci pomóc, ponieważ liczba całkowita w Javie ma zawsze 4 bajty.

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

można znaleźć więcej informacji na temat bigEndian parametru tutaj: http://en.wikipedia.org/wiki/Endianness

9

Można również wykorzystać BigInteger dla konwersji:

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

Tworzysz niepotrzebny pośredni obiekt łańcucha w tym procesie. – OscarRyz

5

wystarczy użyć NIO. Jest przeznaczony do tego konkretnego celu. ByteBuffer i IntBuffer zrobią to, czego potrzebujesz szybko, sprawnie i elegancko. Będzie obsługiwać duże/małe konwersje endianowe, "bezpośrednie" bufory dla wysokiej wydajności IO, a nawet można mieszać typy danych w buforze bajtowym.

Konwersja całkowitymi w bajty:

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 

Konwersja bajtów do liczb całkowitych

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

utworzyć macierz 4 bajtów i skopiować int tablicy w 4 etapach, z bitowe AND i bityhift, jak powiedział Paulo.

Należy jednak pamiętać, że algorytmy blokowe, takie jak AES i DES, pracują z blokami 8 lub 16-bajtowymi, więc trzeba umieścić tablicę w tym, czego potrzebuje algorytm. Może zostawić pierwsze 4 bajty tablicy 8-bajtowej jako 0, a pozostałe 4 bajty zawierać liczbę całkowitą.

0

Wystarczy użyć:

Integer.toString(int).getBytes(); 

Używaj oryginalnego i getBytes int() zwróci tablicę bajtów. Nie trzeba robić nic innego, co skomplikowane.

Aby przekonwertować z powrotem:

Integer.parseInt(encryptedString);