2009-08-30 8 views
12

Chciałbym zaszyfrować plik tekstowy (konfiguracyjny) przechowywany na dysku. Próbuję użyć szyfrowania DES Mam błąd krytyczny na komputerach klienckich, później odkryłem, że algorytm nie może obsłużyć znaków akcentowanych (!) Podejrzewam, że to dlatego, że używałem starych pakietów (sun.misc.BASE64Decoder) - ale nie jestem z pewnością to jest powód.Java simple encryption

Jednak szukam prostszego rozwiązania - potrzebuję naprawdę prostego szyfrowania (wiem, że niektórzy ludzie by się na to nie zgadzali) - a nie RSA z 128-bitowych klawiszy lub tak, po prostu przesłaniając tekst z ciekawskich oczu.

To naprawdę dziwne, że nie mogłem znaleźć prostego trywialnego rozwiązania w sieci.

Jak mogę wdrożyć prosty schemat szyfrowania?

Odpowiedz

4

Co powiecie na ROT13? To chyba najprostszy i najgorszy szyfrowanie kiedykolwiek (był nazywany również Caeser za Cipher)

Oto podstawowa implementacja w Javie przez Jay Kominka:

import java.io.*; 

public class rot13 { 
    public static void main (String args[]) { 
    int abyte = 0; 
    try { while((abyte = System.in.read())>=0) { 
     int cap = abyte & 32; 
     abyte &= ~cap; 
     abyte = ((abyte >= 'A') && (abyte <= 'Z') ? ((abyte - 'A' + 13) % 26 + 'A') : abyte) | cap; 
     System.out.print(String.valueOf((char)abyte)); 
    } } catch (IOException e) { } 
    System.out.flush(); 
    } 
} 
+0

To również nie obsługuje znaków akcentowanych. – SLaks

+0

Nie sądzę, że ROT13 jest naprawdę zdefiniowany dla znaków akcentowanych. Ponadto, z przyjemnością widzę, że ktoś korzysta z mojego starego kodu. :) –

0

Jeśli masz pojedynczy fragment tekstu do szyfrowania, a co z jednorazową podkładką? Jednorazowy pad jest bardzo łatwy do stworzenia; Wszystko czego potrzebujesz to losowa sekwencja bajtów o takiej samej długości jak dane, które chcesz zaszyfrować.

2

Jeśli nie chcesz naprawdę zaszyfrować tekstu, dlaczego nie kodować przy użyciu Base64? Będzie wyglądać jak bzdura i bardzo łatwo go rozszyfrować. Dodatkowo, używasz już kodu Base64 ...

+0

To dobry pomysł, zamierzałem powiedzieć, aby dodać 1 do wszystkich bajtów, a następnie odjąć 1, gdy chcesz go przeczytać. Ale kodowanie Base64 brzmi jeszcze lepiej, może po prostu użyć: org.apache.commons.codec.binary.Base64 –

6

Algorytmy szyfrowania działają na surowych bajtach, a nie na znakach.

Powodem, dla którego nie można obsługiwać znaków akcentowanych, było to, że kod, którego używano do konwertowania znaków na i od bajtów nieprzetworzonych, nie obsługiwał kodu Unicode.

Powinieneś użyć AES; na przykład, jak używać go w Javie, zobacz here.

EDIT: Teraz może po prostu ukrywa ją od ciekawskich oczu, ale nie wiadomo, co przyniesie przyszłość, a to jest zawsze znacznie lepiej użyć silnego szyfrowania teraz, a nie dowiedzieć się, do późno, że powinieneś, ale nie zrobiłeś.

22

Zapoznaj się z Java Simplified Encryption (Jasypt).

Jasypt jest biblioteka Java, która umożliwia programiście dodaj podstawowe szyfrowania w możliwości jego/jej projektów z minimalnym wysiłku i bez konieczności posiadania głębokiej wiedzy o tym, jak działa kryptografii.

  • wysoka bezpieczeństwa, techniki szyfrowania oparte na standardach, zarówno do jednokierunkowej i dwukierunkowej szyfrowania. Szyfruj hasła, teksty, numery , pliki binarne ...
  • Przejrzysta integracja z Hibernate.
  • Nadaje się do integracji z aplikacjami Spring, a także z przezroczystością całkowitą z ACEGI (Spring Security).
  • Zintegrowane możliwości szyfrowania konfiguracji aplikacji (tj. Źródeł danych).
  • Otwarty interfejs API do użytku z dowolnym dostawcą JCE.
  • ... i wiele więcej
+0

Jasiupt zależy od dostawców zabezpieczeń do wbudowanego JDK. To nie jest samodzielna biblioteka, ale tylko opakowanie JDK. – yegor256

7

Używam tego prostego One-Time-Pad algorytmu:

import org.apache.commons.codec.binary.Base64; 
public class Cipher { 
    private static final String KEY = "some-secret-key-of-your-choice"; 
    public String encrypt(final String text) { 
    return Base64.encodeBase64String(this.xor(text.getBytes())); 
    } 
    public String decrypt(final String hash) { 
    try { 
     return new String(this.xor(Base64.decodeBase64(hash.getBytes())), "UTF-8"); 
    } catch (java.io.UnsupportedEncodingException ex) { 
     throw new IllegalStateException(ex); 
    } 
    } 
    private byte[] xor(final byte[] input) { 
    final byte[] output = new byte[input.length]; 
    final byte[] secret = this.KEY.getBytes(); 
    int spos = 0; 
    for (int pos = 0; pos < input.length; ++pos) { 
     output[pos] = (byte) (input[pos]^secret[spos]); 
     spos += 1; 
     if (spos >= secret.length) { 
     spos = 0; 
     } 
    } 
    return output; 
    } 

nie zapomnij dodać commons-codec do ścieżki klasy.