non-academic guidance for computer science

Information

This article was written on 31 Led 2012, and is filled under cryptography, edit (nedokonceno), Hacking, Java, oop, Tutoring.

Current post is tagged

, , , , ,

RSA java implementation


Použití

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

Dokumentace & Licence

Potřebná rozhraní

public interface Crypt <K,M>
{
	M encrypt ( K key , M message ) ;
	M decrypt ( K key , M message ) ;
	M brute   ( K key , M message ) ;
}

Potřebné objekty

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

}

Kód

Implementace

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

	////////////////////////////////////////////////////////////////

}

////////////////////////////////////////////////////////////////

Napsat komentář