Například:
public class Test
{
public static void main(String[] args)
{
Message message = new Message(123);
System.out.println("message: "+message);
RSA<Pair,Message> rsa = new RSA<Pair,Message>();
Pair publicKey = new Pair(3233,17);
Pair privateKey = new Pair(3233,2753);
System.out.println("\nCrypting with public key");
message=rsa.encrypt(publicKey, message);
System.out.println("crypted: "+message);
System.out.println("\nEncrypting with private key");
message=rsa.decrypt(privateKey, message);
System.out.println("result: "+message);
System.out.println("\nCrypting with public key");
message=rsa.encrypt(publicKey, message);
System.out.println("crypted: "+message);
System.out.println("\nEncrypting with brute force");
message=rsa.brute(publicKey, message);
System.out.println("result: "+message);
}
}
public interface Crypt <K,M>
{
M encrypt ( K key , M message ) ;
M decrypt ( K key , M message ) ;
M brute ( K key , M message ) ;
}
public class Pair
{
private int modulo;
private int key;
Pair(int modulo, int key)
{
this.modulo=modulo;
this.key=key;
}
public int getModulo()
{
return modulo;
}
public int getKey()
{
return key;
}
}
public class Message
{
private int value=0;
Message(int value)
{
this.value=value;
}
int getValue()
{
return this.value;
}
void setValue(int value)
{
this.value=value;
}
public String toString()
{
return String.valueOf(this.value);
}
}
public class RSA<K extends Pair,M extends Message> implements Crypt<K,M>
{
////////////////////////////////////////////////////////////////
public M decrypt(K key, M msg)
{
return this.decrypt(key.getModulo(), key.getKey(), msg);
}
////////////////////////////////////////////////////////////////
public M encrypt(K key, M msg)
{
msg.setValue(this.exponent(msg.getValue(), key.getKey(),key.getModulo()));
return msg;
}
////////////////////////////////////////////////////////////////
private M decrypt(int modulo, int key, M msg)
{
msg.setValue(this.exponent(msg.getValue(),key,modulo));
return msg;
}
////////////////////////////////////////////////////////////////
private int exponent(int number, int exponent,int modulo)
{
long x=1;
long y=number;
while(exponent > 0)
{
if(exponent%2 == 1)
x=(x*y)%modulo;
y = (y*y)%modulo;
exponent /= 2;
}
return (int) x%modulo;
}
////////////////////////////////////////////////////////////////
public M brute(K key, M message)
{
int n = key.getModulo();
int p = this.root(n);
return this.decrypt(
key.getModulo(),
this.inversion(key.getKey(),(p-1)*(n/p-1)),
message);
}
////////////////////////////////////////////////////////////////
private int inversion(int number, int modulo)
{
int i = modulo, v = 0, d = 1;
while (number>0)
{
int t = i/number, x = number;
number = i % x;
i = x;
x = d;
d = v - t*x;
v = x;
}
v %= modulo;
if (v<0) v = (v+modulo)%modulo;
return v;
}
////////////////////////////////////////////////////////////////
private int root ( int n )
{
boolean search = true ;
int p=0;
while(search)
{
float a = n/++p;
int b = (int)a;
if(p==n || ((a==b) && this.isPrime(b) && (p*a)==n))
search=false;
}
return p;
}
////////////////////////////////////////////////////////////////
private boolean isPrime(int num)
{
int i;
for (i=2; i < num ;i++ )
if((num%i)==0) return false;
return (i == num);
}
////////////////////////////////////////////////////////////////
}
////////////////////////////////////////////////////////////////