Pessoal, bom dia!
Estou tendo dificuldades para desenvolver esse programa: "Implementar, em linguagem de programação, o esquema RSA.
OBS: as operações modulares DEVEM ser implementadas. Não será aceito trabalho que funcione sem a implementação dessas operações.
Sugere-se que o usuário ESCOLHA "P" e "Q" (combo box, com os primos, no mínino, até 1000). O sistema pode apresentar os possíveis "E" (outra combo). O usuário, ao escolher um "E", permite que o sistema gere um "D".
Para a cifragem e decifragem da mensagem (que o usuário deverá digitar), cada desenvolvedor define como irá codificar. O importante é que a mensagem cifrada possa ser editável, pois eu farei testes para verificar o que ocorre ao decifrar a mensagem."
Abaixo segue o que eu consegui até o momento, porém, não sei como decriptografar e o que colocar na classe main para executar de forma correta. Alguém tem alguma sugestão ou exemplo?
E-mail:
[email protected]
import java.math.BigInteger;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author serafin
*/
public class RSA{
private int p,q,n,pubkey;
public void params(String str, int p, int q){
this.p = p;
this.q = q;
n=this.p*this.q;
pubkey = 13; //pubKey();
System.out.println("pk: "+pubkey);
crypt(str);
}
private int pubKey(){
int e=2;
int ftot = fTotiente(p,q);
while(mdc(ftot,e) != 1){
e++;
}
return e;
}
private int mdc(int x, int y){
if(y==0) return x;
else return mdc(y, x%y);
}
private int fTotiente(int p, int q){
return ((p - 1) * (q - 1));
}
private void crypt(String str){
char s;
int i=0;
while(i < str.length()){
s = str.charAt(i);
int m = 0;
switch(s){
case ('A'): m = 1; break;
case ('B'): m = 2; break;
case ('C'): m = 3; break;
case ('D'): m = 4; break;
case ('E'): m = 5; break;
case ('F'): m = 6; break;
case ('G'): m = 7; break;
case ('H'): m = 8; break;
case ('I'): m = 9; break;
case ('J'): m = 10; break;
case ('K'): m = 11; break;
case ('L'): m = 12; break;
case ('M'): m = 13; break;
case ('N'): m = 14; break;
case ('O'): m = 15; break;
case ('P'): m = 16; break;
case ('Q'): m = 17; break;
case ('R'): m = 18; break;
case ('S'): m = 19; break;
case ('T'): m = 20; break;
case ('U'): m = 21; break;
case ('V'): m = 22; break;
case ('X'): m = 23; break;
case ('Y'): m = 24; break;
case ('Z'): m = 25; break;
}
int pk = pubkey % n;
BigInteger bm = new BigInteger(""+m);
//System.out.println("BM: "+bm);
BigInteger bn = new BigInteger(""+n);
//System.out.println("BN: "+bn);
BigInteger r = bm.pow(pk);
//System.out.println(r);
BigInteger c = r.mod(bn);
System.out.print(" "+c);
i++;
}
}
public void decrypt(){
}
}