Seltsames Verschlüsselungsergebnis

#1

Nabend, möchte einen Text so verschlüsseln, dass sowohl das Decrypt wie auch das Encrypt lesbar ist. Dabei hab ich mich um Schlüsselexpansion noch nicht gekümmert.

public class Verschluesseln {
    String key = "abc";

    public void setKey(String k) {
        key = k;
    }

    public boolean isValid(char c) {
        return c < 127 && c > 31;
    }

    public String toValid(char c) {
        return null;
    }

    public String encrypt(String s) {
        StringBuilder b = new StringBuilder();
        int i = 0;
        for (char c : s.toCharArray()) {
            if (isValid(c)) {
                b.append((char) ((((c - 32) ^ (key.charAt(i) - 32)) % 96) + 32));
                i = (i + 1) % key.length();
            }
        }
        return b.toString();
    }

    public static void main(String[] args) {
        Verschluesseln v = new Verschluesseln();
        v.setKey("in Ulm, um Ulm, und: um Ulm herum");
        String e = "Hier steht ~ ein sehr langer Text mit viel viel Bla bla, der Verschlüsselt und entschlüsselt wird(!).";
        System.out.println("e : " + e);
        e = v.encrypt(e);
        System.out.println("e : " + e);
        e = v.encrypt(e);
        System.out.println("e : " + e);
    }
}

und das Ergebnis ist sehr seltsam:

e : Hier steht ~ ein sehr langer Text mit viel viel Bla bla, der Verschlüsselt und entschlüsselt wird(!).
e : !'e'l>xe=9 +l(enu=!rru!a;+(rh17-9i#i!l;ee9mv<)!,B9/dxl4a 1)? >  &.!"s&)!x  #dU)#xs6&(is0!tU;$r,ms|c
e : hieR steht ^ ein sehr laNger text miT viel vIel Bla bla, Der verschlsSelt und entschlsselt wird(!).

Umlaute ignoriert er richtig, aber wieso schreibt er manche Buchstaben groß?

#2

Hier mit gehts:

b.append((char) ((((c - 32) ^ ((key.charAt(i) - 32) | 0x7FFF)) % 96) + 32));

und ist wahrscheinlich auch nicht so einfach herauszufinden.

#3

Ok, einmal nachrechnen:
Das höchste gültige Zeichen ist die Tilde ~ dez 126.
Das niedrigste gültige Zeichen ist das Space dez 32.

126-32 = 94 = 0101 1110
32-32 = 0 = 0

0x7FFF ist 0111 1111 1111 1111.

Aber ((c - 32) ^ (key.charAt(i) - 32)) klappt nicht, es gibt keine ver-xor-ung, deren Ergebnis im Bereich 0 bis 94 wäre - und durch % 94 ginge ein Teil der Information verloren.

Habt ihr noch 'ne Idee?

(% 96 oben ist falsch bzw. hat keine Auswirkungen…)

#4

Ihr markiert etwas als Lösung, was gar keine is… … Na danke.

Und zwar ist das @-Zeichen der Übeltäter:

public String encrypt(String s) {
    StringBuilder b = new StringBuilder();
    int i = 0;
    for (char c : s.toCharArray()) {
        if (isValid(c)) {
            b.append((char) ((((c - 32) ^ ((key.charAt(i) - 32) | 0x7FFF)) % 96) + 32));
            i = (i + 1) % key.length();
        }
    }
    return b.toString();
}

public static void main(String[] args) {
    Verschluesseln v = new Verschluesseln();
    for (int i = 0; i < 95; i++) {
        for (int j = 0; j < 95; j++) {
            v.setKey((char) (i + 32) + "");
            char c = v.encrypt((char) (j + 32) + "").charAt(0);
            if (!v.isValid(c)) {
                System.out.println((char) (i + 32) + " " + (char) (j + 32) + " " + c + " -");
            }
            try {
                c = v.encrypt(c + "").charAt(0);
                if (c != j + 32) {
                    System.out.println((char) (i + 32) + " " + (char) (j + 32) + " " + c + " --");
                }
            } catch (StringIndexOutOfBoundsException e) {
                //System.out.println(e);
            }
        }
    }
}
  @  -
! @  -
" @  -
# @  -
$ @  -
% @  -
& @  -
' @  -
( @  -
) @  -
* @  -
+ @  -
, @  -
- @  -
. @  -
/ @  -
0 @  -
1 @  -
2 @  -
3 @  -
4 @  -
5 @  -
6 @  -
7 @  -
8 @  -
9 @  -
: @  -
; @  -
< @  -
= @  -
> @  -
? @  -
@ @  -
A @  -
B @  -
C @  -
D @  -
E @  -
F @  -
G @  -
H @  -
I @  -
J @  -
K @  -
L @  -
M @  -
N @  -
O @  -
P @  -
Q @  -
R @  -
S @  -
T @  -
U @  -
V @  -
W @  -
X @  -
Y @  -
Z @  -
[ @  -
\ @  -
] @  -
^ @  -
_ @  -
` @  -
a @  -
b @  -
c @  -
d @  -
e @  -
f @  -
g @  -
h @  -
i @  -
j @  -
k @  -
l @  -
m @  -
n @  -
o @  -
p @  -
q @  -
r @  -
s @  -
t @  -
u @  -
v @  -
w @  -
x @  -
y @  -
z @  -
{ @  -
| @  -
} @  -
~ @  -

(Das dritte Zeichen ist kein Space)