密码学--文件安全传输

使用对称加密算法(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<
  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值