package test;
import java.util.Random;
public class Code {
public static void main( String[] args ) {
String pw = "beni";
String value = "www.java-forum.org";
byte[] data = value.getBytes();
System.out.println( "----" );
System.out.println( new String( data ) );
System.out.println( "----" );
convert( data, pw );
System.out.println( new String( data ) );
convert( data, pw );
System.out.println( "----" );
System.out.println( new String( data ) );
System.out.println( "----" );
}
private static void convert( byte[] data, String pw ){
byte[] pwb = pw.getBytes();
Random random = new Random();
// aufwärmen, zwei Passwörter die gleich beginnen, würden
// sonst anfangs gleich verschlüsseln
for( int i = 0; i < pwb.length; i++ ){
random.setSeed( get( pwb, i ) );
long key = random.nextLong();
set( pwb, i, key );
}
// ok, man könnte hier auch einfach einmal das seed setzen,
// und einen Einzeiler schreiben.
// Aber so sieht es doch viel eindrucksvoller aus? :-)
for( int i = 0; i < data.length; i++ ){
random.setSeed( get( pwb, i ) );
long key = random.nextLong();
set( pwb, i, key );
byte or = sum( key );
data[i] = (byte)(data[i] ^ or);
}
}
private static byte sum( long value ){
byte result = 0;
for( int i = 0; i < 8; i++ ){
result += (byte)( value & 0xFF );
value = value >>> 8;
}
return result;
}
private static long get( byte[] base, int offset ){
long result = base[ offset % base.length ];
for( int i = 1; i < 8; i++ ){
result = result << 8;
result = result | base[ (offset+i) % base.length ];
}
return result;
}
private static void set( byte[] base, int offset, long value ){
for( int i = 7; i >= 0; i-- ){
base[ (offset+i) % base.length ] = (byte)(value & 0xFF);
value = value >>> 8;
}
}
}