столкнулся с такой проблемой в криптографии-нужно из файла считать строки а потом закодировать их и декодировать.. решаю проблему преобразованием строк в массив типа ИНТ и потом с ним работаю... при этом возникают проблемы с преобразованием и обратной загонкой цифр в формат строки. есть ли более элегантное решение этой проблемы?(преобразование типов =то есть мы работаем со строками как с числами(коды букв) и при этом они как бы все таки строки) приведу код программы | Код | package crypto;
/** * * @author */ import java.io.*; import java.math.*; import java.lang.*;
public class crypto { static byte[] input=new byte[500]; // schityvaem massiv is faila static crypto r=new crypto(); //------------------------------------------------------------------------------ static int[] I_Kodir=new int[500]; // teper berem iz input[] po odnome static long[] I_Kodir1=new long[500];// simvoly i shiftyem i zapixivaem syda static int[] shift=new int[500]; static int[] shift1=new int[500]; long[] I_Decodir=new long[100]; int k=5; // eto kluch(nado vvodit iz konsoli) int b=3;// to ge samoe static int n=26; // kolichestvo bukv v alfavite
//------------------------------------------------------------------------------- static byte[] example=new byte[26]; //--------- /** * @param args * @throws IOException */ // 1. otkryt fail /* * vziat simvol i zashifrovat * po formule i1=((k*i+b))(mod 26) * gde k- kluch ,b-kluch,i-index po massivu simvolov teksta, mod 26- eto nado poschitat * ety figny i podelit na 26 i VZIAT OSTATOK OT DELENIA 1.a zapisat eto v vyxodnoi fail * */ /* * 2. vziat vyxodnoi fail i po formule * * i=[(i1-b)*X](mod n); * gde X=Y na predydyshem shage * Y=k^(-1); * a k naxodiat po rashirennomy algoritmy Evklida * * */ public void encrypt() throws IOException { FileInputStream f=new FileInputStream("input.txt"); FileOutputStream f1=new FileOutputStream("output.txt"); FileOutputStream f2 =new FileOutputStream("decod.txt"); for(int n=0;n<10;n++) { //System.out.println((char)f.read()); f.read(input); // zapisali v massiv } // teper shifruem for(int i=0;i<30;i++) { //System.out.println((int)input[i]); I_Kodir[i]=(int)input[i]; I_Kodir[i]=(5*input[i])+3%n; //???// zakodirovali ???? while(I_Kodir[i]>122) { shift[i]=I_Kodir[i]-122; I_Kodir[i]=97+shift[i]; } while(I_Kodir[i]<97) { shift[i]=97-I_Kodir[i]; I_Kodir[i]=122-shift[i]; } // nado proverit esli chisla vyxodiat iz intervala chisel alfavita // to "zakoltsevat ego" }
//---------------------------------------------------------------- System.out.println("I_Kodir \t"+"input"); for(int i=0;i<30;i++) { f1.write(I_Kodir[i]); I_Kodir1[i]=I_Kodir[i]; System.out.println(I_Kodir1[i]+"\t"+input[i]); // f2.write((byte)I_Decodir); //System.out.println(I_Kodir1[i]); } //---------------------------------------------------------------- } public void decrypt(long[] ikod,long b1,long k2) { for(int i=0;i<30;i++) { I_Decodir[i]=((I_Kodir1[i]-b1)*k2)%n;//*1%n; System.out.println("I_Decodir=\t"+I_Decodir[i]); // System.out.println(I_Kodir1[i]); // не получается пока } } void evclid(long a,long b,long x,long y,long d) { /* calculates a * *x + b * *y = gcd(a, b) = *d */ long q,r,x1,x2,y1,y2; if (b == 0) { d = a; x = 1; y = 0; return; } x2 = 1; x1 = 0; y2 = 0; y1 = 1; while (b > 0) {
q = a / b; r = a - q * b;
x = x2 - q * x1; y = y2 - q * y1;
a = b; b = r;
x2 = x1; x1 = x; y2 = y1; y1 = y; } d = a; x = x2; y = y2; System.out.println("X="+x); System.out.println("Y=\t"+y); System.out.println("d=\t"+d); decrypt( I_Kodir1, b,y); if(26*x+b*y==1) { System.out.println("ok"); } else System.out.println("no"); } public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //r.proverkaIO(example); r.encrypt(); long a = 26; long b = 5;// n long d=0; long x=0; long y=0; r.evclid(a, b, x, y, d); // long k1=b%n; // доделать обратить внимание на b, k,k1 // System.out.print(k1); // r.decrypt( I_Kodir1, b,5); //System.out.println(y); }
}
|
этот процесс можно видеть в функции криптования и дешифровки...... массивы I_Kodir[] I_Decodir[] спасибо.
|