public class Main {
private static String alfabeto = "abcdefghijklmnñopqrstuvxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ .,:áéíóúÁÉÍÓÚ";
public static void main(String[] args) {
int numero=113;
int[] clave = new int[]{3,numero*6+1};
String a = codificar(clave, "hola");
System.out.println(a);
System.out.println(codificar(claveDescifrado(clave), a));
}
private static int[] claveDescifrado(int[] clave){
int[] descif = new int[2];
descif[0]=inverso(clave[0], alfabeto.length());
descif[1]=-inverso(clave[0], alfabeto.length())*clave[1];
if(descif[1]<0){
descif[1]=alfabeto.length()+descif[1];
}
if(descif[0]<0){
descif[0]=alfabeto.length()+descif[0];
}
return descif;
}
private static String codificar(int[] clave, String mensaje){
int[] secuencia = pasarTextoNumero(mensaje);
String mensajeCodificado = "";
for (int i = 0; i < secuencia.length; i++) {
mensajeCodificado+=alfabeto.charAt(operacion(secuencia[i],clave));
}
return mensajeCodificado;
}
private static int operacion(int numero, int[] clave){
return (clave[0]*numero+clave[1])%alfabeto.length();
}
private static int[] pasarTextoNumero(String mensaje){
int[] secuencia = new int[mensaje.length()];//array con la longitud del mensaje
for (int i = 0; i < secuencia.length; i++) {
char letra = mensaje.charAt(i);
int valor = valorLetra(letra);
secuencia[i]=valor;
}
return secuencia;
}
private static int valorLetra(char letra){
for (int j = 0; j < alfabeto.length(); j++) {
if(letra==alfabeto.charAt(j)){
return j;
}
}
return -1;
}
public static int inverso(int a,int m)
{
int c1=1,c2=-1*(m/a);//coeficiente de a y b respectivamente
int t1=0,t2=1;//coeficientes penultima corrida
int r=m%a;//residuo, asignamos 1 como condicion de entrada
int x=a,y=r,c;
while(r!=0){
c= x/y;//cociente
r= x%y;//residuo
//guardamos valores temporales de los coeficientes
//multiplicamos los coeficiente por -1*cociente de la division
c1*=-1*c;
c2*=-1*c;
//sumamos la corrida anterior
c1+=t1;
c2+=t2;
//actualizamos corrida anterior
t1=-1*(c1-t1)/c;
t2=-1*(c2-t2)/c;
x=y;
y=r;
}
if(x==1)//residuo anterior es 1 , son primos relativos y el inverso existe
return t2;
else
return -1;
}
}
private static String alfabeto = "abcdefghijklmnñopqrstuvxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ .,:áéíóúÁÉÍÓÚ";
public static void main(String[] args) {
int numero=113;
int[] clave = new int[]{3,numero*6+1};
String a = codificar(clave, "hola");
System.out.println(a);
System.out.println(codificar(claveDescifrado(clave), a));
}
private static int[] claveDescifrado(int[] clave){
int[] descif = new int[2];
descif[0]=inverso(clave[0], alfabeto.length());
descif[1]=-inverso(clave[0], alfabeto.length())*clave[1];
if(descif[1]<0){
descif[1]=alfabeto.length()+descif[1];
}
if(descif[0]<0){
descif[0]=alfabeto.length()+descif[0];
}
return descif;
}
private static String codificar(int[] clave, String mensaje){
int[] secuencia = pasarTextoNumero(mensaje);
String mensajeCodificado = "";
for (int i = 0; i < secuencia.length; i++) {
mensajeCodificado+=alfabeto.charAt(operacion(secuencia[i],clave));
}
return mensajeCodificado;
}
private static int operacion(int numero, int[] clave){
return (clave[0]*numero+clave[1])%alfabeto.length();
}
private static int[] pasarTextoNumero(String mensaje){
int[] secuencia = new int[mensaje.length()];//array con la longitud del mensaje
for (int i = 0; i < secuencia.length; i++) {
char letra = mensaje.charAt(i);
int valor = valorLetra(letra);
secuencia[i]=valor;
}
return secuencia;
}
private static int valorLetra(char letra){
for (int j = 0; j < alfabeto.length(); j++) {
if(letra==alfabeto.charAt(j)){
return j;
}
}
return -1;
}
public static int inverso(int a,int m)
{
int c1=1,c2=-1*(m/a);//coeficiente de a y b respectivamente
int t1=0,t2=1;//coeficientes penultima corrida
int r=m%a;//residuo, asignamos 1 como condicion de entrada
int x=a,y=r,c;
while(r!=0){
c= x/y;//cociente
r= x%y;//residuo
//guardamos valores temporales de los coeficientes
//multiplicamos los coeficiente por -1*cociente de la division
c1*=-1*c;
c2*=-1*c;
//sumamos la corrida anterior
c1+=t1;
c2+=t2;
//actualizamos corrida anterior
t1=-1*(c1-t1)/c;
t2=-1*(c2-t2)/c;
x=y;
y=r;
}
if(x==1)//residuo anterior es 1 , son primos relativos y el inverso existe
return t2;
else
return -1;
}
}