2009-08-30 12 views
12

Ich möchte eine Textdatei (Konfiguration) auf der Festplatte gespeichert werden. Versuchen, DES Verschlüsselung zu verwenden Ich hatte fatale Fehler auf Client-Computern, später fand ich heraus, der Algorithmus konnte nicht mit Akzenten (!) Ich vermute, dass war, weil ich alte Pakete (sun.misc.BASE64Decoder) verwendet wurde - aber ich bin nicht Sicher, das ist der Grund.Java einfache Verschlüsselung

Allerdings suche ich nach einer einfacheren Lösung - ich brauche eine wirklich einfache Verschlüsselung (ich weiß, dass einige Leute nicht zustimmen würden) - nicht RSA von 128 Bit-Schlüssel oder so, nur verdunkeln den Text aus neugierigen Augen.

Es ist wirklich seltsam, dass ich keine einfache triviale Lösung im Internet finden konnte.

Wie kann ich ein einfaches Verschlüsselungsschema implementieren?

Antwort

4

Wie wäre es mit ROT13? Es ist wahrscheinlich die einfachste und am schlechtesten Verschlüsselung jemals

Hier ist eine grundlegende Implementierung in Java von Jay Kominek (es war auch der Caeser des Cipher genannt):

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

Das kann auch Akzentbuchstaben nicht behandeln. – SLaks

+0

Ich glaube nicht, dass ROT13 wirklich für akzentuierte Zeichen definiert ist. Ich freue mich auch zu sehen, dass irgendjemand irgendwie meinen alten Code benutzt. :) –

0

Wenn Sie ein einzelnes Stück Text haben zu verschlüsseln, Was ist mit einem One-Time-Pad? Ein One-Time-Pad ist sehr einfach zu erstellen; alles, was Sie brauchen, ist eine zufällige Folge von Bytes die gleiche Länge wie die Daten, die Sie verschlüsseln

2

Wenn Sie nicht suchen, um den Text wirklich zu verschlüsseln, warum nicht codieren mit Base64? Es wird wie Unsinn aussehen, und es ist sehr einfach zu entschlüsseln. Plus, Sie verwenden bereits Base64-Code ...

+0

Das ist eine gute Idee, ich würde sagen, nur 1 zu allen Bytes hinzufügen und dann 1 subtrahieren, wenn Sie es lesen möchten. Aber die Base64-Codierung klingt noch besser, könnte einfach verwenden: org.apache.commons.codec.binary.Base64 –

6

Verschlüsselungsalgorithmen arbeiten mit rohen Bytes, nicht mit Zeichen.

Der Grund, warum Akzentzeichen nicht verwendet werden konnten, lag daran, dass der Code, den Sie zum Konvertieren der Zeichen in und aus Raw-Byte verwendeten, nicht Unicode verarbeiten konnte.

Sie sollten AES verwenden; Ein Beispiel für die Verwendung in Java finden Sie unter here.

EDIT: Gerade jetzt, können Sie nur es vor neugierigen Blicken versteckt, aber es ist nicht abzusehen, was die Zukunft bringen wird, und es ist immer viel besser jetzt eine starke Verschlüsselung verwenden und nicht herausfinden, zu spät, das hättest du tun sollen, aber nicht.

22

Überprüfen Sie die Java Simplified Encryption (Jasypt).

Jasypt ist eine Java-Bibliothek, die der Entwickler ermöglicht Fähigkeiten seine/ihre Projekte mit minimalem Aufwand und ohne die Notwendigkeit der mit tiefen Kenntnissen Grundverschlüsselung auf hinzufügen, wie Kryptographie funktioniert.

  • Hochsicherheits, standardbasierte Verschlüsselungstechniken, sowohl für uni- und bidirektionalen Verschlüsselung. Verschlüsseln Passwörter, Texte, Zahlen, Binärdateien ...
  • Transparente Integration mit Hibernate.
  • Geeignet für die Integration in Spring-basierte Anwendungen und auch transparent integrierbar mit ACEGI (Spring Security).
  • Integrierte Funktionen zum Verschlüsseln der Konfiguration von Anwendungen (d. H. Datenquellen).
  • Öffnen Sie die API für die Verwendung mit einem JCE-Anbieter.
  • ... und vieles mehr
+0

JASYPT hängt von Sicherheits-Providern, integrierte JDK sein. Es ist keine eigenständige Bibliothek, sondern nur ein Wrapper um JDK. – yegor256

7

ich diesen einfachen One-Time-Pad Algorithmus bin mit:

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

Vergessen Sie nicht commons-codec zu Classpath hinzufügen.