2009-08-30 25 views
12

Me gustaría encriptar un archivo de texto (configuración) almacenado en el disco. Intentando usar el cifrado DES He tenido un error fatal en las máquinas cliente, más tarde descubrí que el algoritmo no podía manejar caracteres acentuados (!) Sospecho que era porque estaba usando paquetes antiguos (sun.misc.BASE64Decoder) - pero no estoy seguro ese es el motivoCifrado simple de Java

Sin embargo, estoy buscando una solución más simple. Necesito una encriptación muy simple (sé que algunas personas no estarían de acuerdo con eso) - no RSA de 128 bits o menos, simplemente oscureciendo el texto de los ojos curiosos.

Es realmente extraño que no pude encontrar una solución trivial simple en la web.

¿Cómo puedo implementar un esquema de cifrado simple?

Respuesta

4

¿Qué tal ROT13? Es probablemente el más simple y lo peor de cifrado cada vez (que también se llama cifrado del César)

He aquí una implementación básica en Java por 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

Eso tampoco puede manejar caracteres acentuados. – SLaks

+0

No creo que ROT13 esté realmente definido para caracteres acentuados. Además, me complace ver que alguien obtiene algún tipo de uso de mi código anterior. :) –

0

Si usted tiene un solo trozo de texto a cifrar, ¿Qué tal un cojín de una sola vez? Una sola vez es muy fácil de crear; todo lo que necesita es una secuencia aleatoria de bytes de la misma longitud que los datos que está encriptando

2

Si no está buscando realmente encriptar el texto, ¿por qué no codificar con Base64? Parecerá una tontería, y es muy fácil de descifrar. Además, ya está utilizando el código Base64 ...

+0

Eso es una buena idea, iba a decir que simplemente agregue 1 a todos los bytes y luego restar 1 cuando quiera leerlo. Pero la codificación Base64 suena aún mejor, solo podría usar: org.apache.commons.codec.binary.Base64 –

6

Los algoritmos de cifrado funcionan en bytes sin procesar, no en caracteres.

La razón por la que no podía manejar los caracteres acentuados era porque el código que estaba usando para convertir los caracteres a bytes crudos no se manejaba con Unicode.

Debe usar AES; para ver un ejemplo de cómo usarlo en Java, consulte here.

EDITAR: En este momento, que sólo podría estar escondido de miradas curiosas, pero no se sabe lo que nos depara el futuro, y siempre es mucho mejor utilizar el cifrado fuerte ahora y no saber, a tarde, deberías haberlo hecho pero no lo hiciste

22

Echa un vistazo a Java Simplified Encryption (Jasypt).

Jasypt es una biblioteca de Java que permite que el desarrollador añadir cifrado básico capacidades a su/sus proyectos con mínimo esfuerzo, y sin la necesidad de tener conocimiento profundo de cómo funciona criptografía.

  • -alta seguridad, técnicas de encriptación basadas en estándares, tanto para unidireccional y bidireccional cifrado. Encriptar contraseñas, textos, números, binarios ...
  • Integración transparente con Hibernate.
  • Adecuado para la integración en aplicaciones basadas en Spring y también integrable de forma transparente con ACEGI (Spring Security).
  • Capacidades integradas para encriptar la configuración de las aplicaciones (es decir, fuentes de datos).
  • API abierta para usar con cualquier proveedor de JCE.
  • ... y mucho más
+0

Jasypt depende de que los proveedores de seguridad estén integrados en el JDK. No es una biblioteca independiente, sino solo una envoltura alrededor de JDK. – yegor256

7

estoy usando este sencillo algoritmo de One-Time-Pad:

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

No se olvide de añadir commons-codec a la ruta de clase.