📄 serververify.java
字号:
import java.security.*;
import java.security.spec.*;
import java.io.*;
import javax.crypto.*;
public class ServerVerify extends Thread{
public static void main(String[] args)
{
}
public String byte2hex(byte[] b)
{
String hs="";
String stmp="";
for (int n=0;n<b.length;n++)
{
stmp=(Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
if (n<b.length-1) hs=hs+":";
}
return hs.toUpperCase();
}
public void run(String filename)
{
try {
//读出发送方的公钥
ObjectInputStream in=new ObjectInputStream(new FileInputStream("MyPubkey.dat"));
PublicKey pubKey=(PublicKey)in.readObject(); //读出公钥
in.close();
System.out.println(pubKey.getFormat());
//从文件中读出源文件的密文和数字签名
in=new ObjectInputStream(new FileInputStream(filename));
byte[] Des_info=(byte[])in.readObject();
String info=new String(Des_info); //读出信息
// System.out.println("info="+info);
byte[] Rsa_sign=(byte[])in.readObject(); //读出签名
System.out.println("得到签名 signed="+byte2hex(Rsa_sign));
in.close();
//用发送方的公钥对数字签名解密,得到MD5和对成密钥组成的MD_Key数组
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, pubKey);
byte[] MD_Key = cipher.doFinal(Rsa_sign);
System.out.println("得到消息摘要和对成密钥:"+byte2hex(MD_Key));
//分解出消息摘要和对成密钥
int len = MD_Key.length;
byte[] MD_1= new byte[128];
byte[] key =new byte[56];
int i;
for (i=0;i<128;i++) //因为用MD5产生的数字摘要为128位
MD_1[i]=MD_Key[i]; //将摘要部分提取出来赋给数组MD_1
//数组中的128位以后的元素即为对称密钥
while(i<len-1)
{
key[i]=MD_Key[i];}
//将对称密钥提取出来赋给数组Key[]
Key SingleKey=(Key)(key); /*将对称密钥强制类型转换为key型*/
/*得到对称密钥后,通过DES的解密算法将密文变成明文,再将明文用MD5算法生成消息摘要并保存在数组MD_2[]中*/
//对对称密钥解密得到原文件
cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE,SingleKey);
byte[] info_Plain= cipher.doFinal(Des_info);
System.out.println("明文加密后得到的信息:"+byte2hex(info_Plain));
System.out.println("解密后的信息:"+(new String(info_Plain)));
/*将明文用MD5生成消息摘要,并保存再MD_2数组中*/
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(info_Plain);
byte[] MD_2 = messageDigest.digest(); //得到消息的摘要MD_1里
System.out.println("经过MD5消息摘要是:"+byte2hex(MD_2));
/*将MD_1[] 和MD_2[]做比较,若相等,则签名正确*/
for( i=0;i<128;i++)
{
if (MD_1[i]!=MD_2[i])
{
System.out.println("Signature error!");
System.exit(0);
}
}
System.out.println("Signature success!");
}
catch (Exception e) {
e.printStackTrace();
System.out.println(e.toString());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -