Re: Simple encryption/decryption
Angelo Chen wrote:
This seems enough, with that I can:
Key
Plaintext
A2B93E8F6F023A078E
now how to decode the string "A2B93E8F6F023A078E" back to "Plaintext"?
That's not what I get. Check your tests with Wikipedia. The
cipher-text for Key and Plaintext is "BBF316E8D940AF0AD3", which is what
the program I posted prints.
But for how to decrypt, RC4 is symmetric. That means you decrypt with
the same key and algorithm you encrypt with.
package local;
public class Rc4
{
private byte[] state = new byte[256];
int x, y;
public Rc4( byte[] key )
{
// if( key.length<5||key.length>16 )
// {
// throw new IllegalArgumentException( "Key: "+key+
// " must be between 40 and 128 bits. (key length is //"+
// key.length+".)" );
// }
for( int i = 0; i < state.length; i++ ) {
state[i] = (byte) i;
}
for( int i = 0; i < state.length; i++ ) {
x = (x + key[i % key.length] + state[i]) & 0xFF;
byte swap = state[i];
state[i] = state[x];
state[x] = swap;
}
x = 0;
}
public byte[] crypt( byte[] input )
{
byte[] output = new byte[input.length];
for( int i = 0; i < input.length; i++ ) {
x = (x + 1) % 256;
y = (state[x] + y) & 0xFF;
byte swap = state[x];
state[x] = state[y];
state[y] = swap;
byte r = state[(state[x] + state[y]) & 0xFF];
output[i] = (byte) (input[i] ^ r);
}
return output;
}
public static void main( final String... args )
{
String[][] testVectors = {{"Key", "Plaintext"},
{"Wiki", "pedia"}, {"Secret", "Attack at dawn"},
};
for( String[] s : testVectors ) {
System.out.printf( "RC4( \"%s\", \"%s\" ) => ",
s[0], s[1] );
System.out.println( hexString( new Rc4( s[0].getBytes() )
.crypt( s[1].getBytes() ) ) );
}
String [][] reverseVectors = {
{"Key", "BBF316E8D940AF0AD3" },
{"Wiki", "1021BF0420" },
{"Secret", "45A01F645FC35B383552544B9BF5" }
};
for( String[] s : reverseVectors ) {
System.out.printf( "RC4( \"%s\", \"%s\" ) => ",
s[0], s[1] );
byte[] bytes = new byte[s[1].length()/2];
for( int i = 0; i < bytes.length; i++ ) {
bytes[i] = (byte)Integer.parseInt( s[1]
.substring( i*2, i*2+2), 16 );
}
System.out.println( new String( new Rc4( s[0].getBytes() )
.crypt( bytes ) ) );
}
}
private static String hexString( byte[] bytes )
{
StringBuilder sb = new StringBuilder( bytes.length *2 );
for( int i = 0; i < bytes.length; i++ ) {
sb.append( String.format( "%02X", bytes[i] ));
}
return sb.toString();
}
}