?? decipher.java
字號:
/**for Stream tools*/
import java.io.*;
/**for ArrayList*/
import java.util.*;
class deCipher
{
/**計算有可能溢出的模m的整數(shù)冪的算法
*<P>pre:none.
*<P>post:返回a^t(mod n);
*@param a a^t(mod n)中的a
*@param t a^t(mod n)中的t
*@param n a^t(mod n)中的n
*/
long powMod(long a,long t,long n)
{
long c=0;
long d=1;
String b=Long.toBinaryString(t);
for(int i=b.length()-1;i>=0;i--)
{
c*=2;
d=(d*d)%n;
if(b.charAt((b.length()-1-i))=='1')
{
c+=1;
d=(d*a)%n;
}
/**調(diào)試代碼
System.out.print("i="+i);
System.out.print(" c="+c);
System.out.print(" d="+d);
System.out.println();
*/
}
return d;
}
/**解密算法:
*<P>1,先讀入解密的目標文件和公鑰
*<P>2,用RSA算法對目標文件進行解密(結果用byte記錄).
*<P>3,儲存解密結果
*<P>pre:none
*<P>post:對文件解密
*/
deCipher()
{
String filename;
ArrayList mem_buffer=new ArrayList();
try{
BufferedReader in1=new BufferedReader(
new InputStreamReader(System.in));
System.out.println("請輸入要解密文件的文件名和(路徑):");
filename=in1.readLine();
DataInputStream infile=new DataInputStream(
new BufferedInputStream(
new FileInputStream(filename)));
System.out.println("請輸入私鑰的文件名(路徑)");
filename=in1.readLine();
DataInputStream key=new DataInputStream(
new BufferedInputStream(
new FileInputStream(filename)));
long d=key.readLong();
long n=key.readLong();
while(infile.available()>0)
{
long temp=infile.readLong();
byte m=(byte)powMod(temp,d,n);
mem_buffer.add(new Byte(m));
}
System.out.println("讀取完成.");
System.out.println("請輸入明文的存放文件名(路徑):");
filename=in1.readLine();
DataOutputStream out1=new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(filename)));
for(int i=0;i<mem_buffer.size();i++)
out1.writeByte(((Byte)mem_buffer.get(i)).byteValue());
System.out.println("解密完成");
}catch(EOFException e){
System.out.println("文件寫入錯誤!");
}
catch(IOException e){
System.err.println("文件讀取寫入出錯,請檢查文件名的輸入是否正確,該文件是否存在!\n 正確格式:data.dat或c:\\data.dat");
}
}
public static void main(String[] args)
{
new deCipher();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -