使用对称加密算法(DES)加密文件,使用非对称加密算法(RSA)加密生成的DES密钥,使用哈希函数(MD5)生成文件摘要,并对摘要进行签名
发送方A要将DES加密后的文件,RSA加密后的DES密钥,以及签名的结果打包发送给接收方B
发送方A需要完成的任务
1.用des对消息进行加密,加密后的内容存入文件
2.用接受方B生成的公钥对生成的des密钥进行加密----注意
,在消息发送之前,发送方A和接收方B已经沟通好公私钥,故在下图中,如果是第一次运行该代码,rsa1.generateKeyPair(publicKeyFile,privateKeyFile)
这句话不需要注释掉,但是如果已经运行过,文件中就会存在公私钥对,再次运行,又会随机生成公私钥,导致接收方B解密失败
3.对消息签名,调用函数即可,签名函数中包含了哈希,该函数是对消息进行哈希,生成摘要,再对摘要进行签名,实现了消息的完整性和不可否认性
接受方B需要完成的任务
1.生成公私钥对,并存入文件中
2.用自己的RSA私钥解密出DES密钥
3.用解密出的DES密钥解密加密文件
4.用发送端的公钥解密签名,得到文件摘要,将自己收到的消息进行哈希,生成一个文件摘要,比较2个文件摘要,若相等,则表明该消息在发送的过程中没有被篡改
发送方源代码
package mimaExample;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Base64;
import javax.crypto.SecretKey;
public class Send {
//保存文件
public void saveFile(String s,String url) throws IOException {
File f =new File(url);
if(!f.exists()) {
f.createNewFile();
}
OutputStreamWriter write=new OutputStreamWriter(new FileOutputStream(f),"utf-8");
BufferedWriter writer=new BufferedWriter(write);
writer.write(s);
System.out.println("write successful");
writer.close();
}
//读取文件
public String readFile(String filename) {
try {
File f=new File(filename);
if(f.isFile()&&f.exists())
{
InputStreamReader reader=new InputStreamReader(new FileInputStream(f),"utf-8");
BufferedReader br=new BufferedReader(reader);
String line;
while((line=br.readLine())!=null){
return line;
}
reader.close();
}
}catch(Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws Exception{
//用DES加密文件LqqAddress.txt文件,并将加密过的文件存入LqqAddressSerect.txt中
DESdemo des1=new DESdemo();
String srcFile="LqqAddress.txt";
String destFile="LqqAddressSerect.txt";
des1.encryptFile(srcFile, destFile);
//将生成的DES密钥存入临时变量DesKey中
SecretKey DesKey = des1.mykey;
byte[] encodedKey = DesKey.getEncoded();
//对des密钥进行base64编码
Base64.Encoder encoder = Base64.getEncoder();
String deskey = encoder.encodeToString(encodedKey);
System.out.println("-----------DESKEY-----------"+"\n"+deskey);
//用RSA加密DES密钥
//1.从文件中读出接收端生成的公钥
RSAdemo rsa2 =new RSAdemo();
String publicKeyFile = "public_key.txt";
String pubkeyStr = rsa2.readFile2String(publicKeyFile);
RSAPublicKey publicKey = rsa2.loadPublicKey(pubkeyStr);
//2.用RSA公钥加密DES密钥
String s10=new String(encodedKey);
System.out.println("处理前DES密钥是:" + "\n"+s10);
byte[] resultBytes = rsa2.encrypt(publicKey, encodedKey);
String resultStr = encoder.encodeToString(resultBytes);
//因为RSA的key自动得到,因此加密结果在变化
System.out.println("加密后是(base64),并写入文件:\n" + resultStr);
//写入文件
Send s1=new Send();
s1.saveFile<