java制作简单的加密程序
引言
在日常生活中,我们总会想着对一些文件进行加密,从而保护个人隐私。在学习了java之后,想到了一个简单的加密程序方案,同时不可否认的是这样一个方案的效率并不高,仅用于学习和小文件加密。
加密原理
日常的文件如文本,图像,视频等在计算机存放都是以二进制存放,所以利用这个性质可以对二进制数据进行处理,使其无法正常打开,需要使用时再将其恢复。
问题是怎么对二进制数据处理后又能准确地恢复?我们想到异或,一个数异或一个数两次会恢复,也就是说我们读取原文件时异或一个数就可以实现加密,要恢复时只需要再执行一次程序即可。
加密过程
读取原文件——>异或原文件——>生成加密文件
解密过程
读取加密文件——>异或加密文件——>生成解密文件
优化
通过原理我们很容易写出加密程序,但事实上如此简单的加密程序可能仅限自己个人使用,有没有办法实现像网上的加密程序那样面对用户?理论上是可以的,我们可以利用随机码加密,当然也可以由用户自定义,在这里提供一种随机码加密的方案,面对用户性的。
说到随机码,首先会想到Rondom,不错这个确实可以,但是其实用时间戳来随机生成随机码会更加难解。
Random ran = new Random(System.currentTimeMillis());
a= ran.nextInt();
a就是根据时间生成的随机码
生成了随机码,那么想要解密文件这个随机码就是关键,所以不难想到我们应想办法将随机码保存下来,最好是生成一个密钥文件,也就是说把随机码导出成一个txt文本文件。
相应的,解密的时候也可以把程序设置成导入密钥来实现解锁文件功能,这样就实现了密钥功能。
实现代码
进行了3次左右的代码优化,大致实现了上述功能。
package com.company;
import java.io.*;
import java.util.Random;
import java.util.Scanner;
//图像加密(个人版)二进制加密
//加密思路:利用异或两次恢复原态的原理进行二进制加密
//加密密钥:时间戳随机码(Random code)
//代码纯原创,仅供学习与参考
//输入路径需//隔开
public class Main {
public static void main(String[] args) throws Exception {
Random ran = new Random(System.currentTimeMillis());
int flag=3;
System.out.println("本程序提供加密与解密功能");
System.out.println("1.加密文件");
System.out.println("2.解密文件");
System.out.println("注:输入文件路径需用//隔开");
System.out.println("请输入你的选择(序号):")
Scanner fl=new Scanner(System.in);
int f= fl.nextInt();
switch (f) {
case 1:
flag = 0;
break;
case 2:
flag = 1;
break;
default:
break;
}
System.out.println("输入加密(解密)文件的文件目录:");
Scanner sc=new Scanner(System.in);
String cy= sc.next();
System.out.println("输入生成文件路径:");
Scanner sd=new Scanner(System.in);
String sr= sd.next();
int y=0;
if(flag==1)
{
System.out.println("导入解密密钥文件路径:");
Scanner my=new Scanner(System.in);
String sg=my.next();
BufferedReader bg=new BufferedReader(new FileReader(sg));
String yun;
//读取密钥数据(通常为一行)
while((yun=bg.readLine())!=null) {
y=Integer.parseInt(yun);//转换读取的数据类型为int型
}
bg.close();
File su=new File(sg);
System.out.println(su.delete());//删除密钥文件,返回真
}
FileInputStream s=new FileInputStream(cy);
FileOutputStream p=new FileOutputStream(sr);
File file=new File(cy);
int x,a=0;
if(flag==0)
a= ran.nextInt();
if(flag==1)
a=y;
while((x=s.read())!=-1){
p.write(x^a);
}
s.close();
p.close();
System.out.println(file.delete());//删除掉原文件,返回真
if(flag==0){
String str=a+"";//将a转换为字符串类型密钥
FileOutputStream t=new FileOutputStream(cy+".txt");
t.write(str.getBytes());
t.close();
}
if(flag==0)
System.out.println("加密成功!");
if(flag==1)
System.out.println("解密成功!");
}
}
这个程序为面对用户设计,事实上可以做一些简单修改变成自己个人使用类型
运行结果
结语
本代码实现加密&解密功能仅限于小文件,对于大文件并未测试,如需测试请先删除源代码中的delete()方法避免因加密失败造成数据损失,代码还处于优化阶段,有更好的方案可私信联系。如有帮助,恳请点赞支持一下!