2009-08-30 37 views
12

Vorrei crittografare un file testuale (di configurazione) memorizzato su disco. Cercando di usare la crittografia DES Ho avuto un errore fatale sulle macchine client, in seguito ho scoperto che l'algoritmo non poteva gestire i caratteri accentati (!) Sospetto che fosse perché stavo usando vecchi pacchetti (sun.misc.BASE64Decoder) - ma io non sono certo questa è la ragione.Cifratura semplice Java

Tuttavia, sto cercando una soluzione più semplice - Ho bisogno di un molto semplice crittografia (so che alcune persone non sarebbero d'accordo su questo) - Non RSA di 128 chiavi bit o giù di lì, semplicemente oscurando il testo da occhi curiosi.

È davvero strano che non sia riuscito a trovare una semplice soluzione banale sul web.

Come posso implementare un semplice schema di crittografia?

risposta

4

Che ne dici di ROT13? E 'probabilmente la più semplice e la crittografia peggiore mai (è stato chiamato anche Cipher del Caeser)

Ecco un'implementazione di base in Java da Jay Kominek:

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

Anche questo non può gestire i caratteri accentati. – SLaks

+0

Non penso che ROT13 sia realmente definito per i caratteri accentati. Inoltre, è felice di vedere qualcuno che ottiene qualsiasi tipo di utilizzo dal mio vecchio codice. :) –

0

Se si dispone di un unico pezzo di testo per crittografare, che ne dici di una volta? Un one-time-pad è molto facile da creare; tutto ciò di cui hai bisogno è una sequenza casuale di byte della stessa lunghezza dei dati che stai crittografando

2

Se non stai cercando di crittografare davvero il testo, perché non codificarlo con Base64? Sembrerà un'assurdità, ed è molto facile da decodificare. Inoltre, stai già utilizzando il codice Base64 ...

+0

Questa è una buona idea, stavo per dire di aggiungere 1 a tutti i byte e quindi sottrarre 1 quando vuoi leggerlo. Ma la codifica Base64 suona ancora meglio, potrebbe semplicemente usare: org.apache.commons.codec.binary.Base64 –

6

Gli algoritmi di crittografia funzionano su byte non elaborati.

Il motivo per cui non è possibile gestire i caratteri accentati era perché il codice che si stava utilizzando per convertire i caratteri da e verso i byte non gestiti non gestiva Unicode.

È necessario utilizzare AES; per un esempio su come utilizzarlo in Java, vedere here.

EDIT: In questo momento, si potrebbe semplicemente essere nascosto da occhi curiosi, ma non si può dire quello che sarà il futuro, ed è sempre molto meglio usare la crittografia forte ora e non scoprire, a tardi, che dovresti avere ma non lo hai fatto.

22

Verificare il Java Simplified Encryption (Jasypt).

Jasypt è una libreria Java che permette allo sviluppatore di aggiungere la crittografia di base funzionalità per il suo/suoi progetti con minimo sforzo, e senza la necessità di avere profonda conoscenza su come funziona crittografia.

  • -alta sicurezza, tecniche di crittografia basati su standard, sia per unidirezionali e bidirezionali crittografia. Cripta password, testi, numeri , binari ...
  • Integrazione trasparente con Hibernate.
  • Adatto per l'integrazione in applicazioni a molla e anche integrabile in modo trasparente con ACEGI (Spring Security).
  • Funzionalità integrate per la crittografia della configurazione delle applicazioni (ad esempio origini dati).
  • API aperta da utilizzare con qualsiasi provider JCE.
  • ... e molto altro ancora
+0

Jasypt dipende dai provider di sicurezza che devono essere integrati in JDK. Non è una libreria standalone, ma solo un wrapper su JDK. – yegor256

7

sto usando questo semplice One-Time-Pad algoritmo:

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

Non dimenticare di aggiungere commons-codec al classpath.