时间:2021-05-20
异或简单介绍:异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。
简单理解就是不进位加法,如1+1=0,,0+0=0,1+0=1。
需求描述
在信息化时代对数据进行加密是一个很重要的主题,在做项目的过程中,我也实现了一个比较复杂的加密算法,但是由于涉及到的技术是保密的,所以在这里我实现一个比较简单的版本,利用文件的输入输出流和异或操作进行任意文件的加密,关于解密算法,很简单,自己思考下就能解决。
数学原理
该加密算法利用的是两个数异或的功能,先简单的说下异或的原理,异或实际上是对文件的二进制编码进行操作,简单的说就是当两个二进制位相同时为0,不同时为1,看下面的例子:
//7的二进制表示:00000111//2的二进制表示:00000010//两者异或得到的结果:00000101 //也就是数字5//---------------------------//得到的结果再次和2异或//5的二进制表示:00000101//2的二进制表示:00000010//两者异或得到的结果:00000111 //也就是7,是不是很神奇的又回到了7呢?代码实现
import java.io.*;class FileSecret{ public static void main(String[] args) throws Exception { //找到要加密的文件,盘符自己指定,输入输出不需要在同一个盘符 File inFile = new File("盘符:\\加密的文件"); //将要加密的文件输出到指定的盘符 File outFile = new File("盘符:\\解密的文件"); //建立数据通道,让图片的二进制数据流入 FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //在读的过程中,将读到的数据异或一个数字,这个数字应该是由某种加密算法生成的,在这里我仅仅简单的编一个数字928(我的生日),然后进行异或,将得到的数据输出 int content = 0 ; //该变量用于存储读取到的数据,当然这里可以使用long等更长的数据类型,当然我们也可以使用其他的数据类型,只需要满足^两端的数据类型能够相互转换就行,至少能进行强制类型转换 while((content=input.read())!=-1) // 如果没有到文件的末尾,那么继续读取数据,读取到的数据已经存储到content变量中了,-1为文件的结束符 { output.write(content^928); //写到输出文件流中 } //关闭资源 input.close(); output.close(); }}代码功能评价
对于这段代码,功能大体上已经能够用满足需求,但是存在不足,第一没有使用加密算法生成异或的另一端数字,第二我没有去实现文件的解密,实际上解密十分简单,请自己仔细读数学原理部分就能知道怎么去写解密算法,实际上加密和解密也不是同一个地方同时实现的,而是加密双采用相同的加密算法进行运算得出的。
使用随机数改进算法
在上面的过程中,我们实际上采用的是给定的一个值去和我们读入的二进制文件进行异或,那么我们是否能用一个随机数去代替这种约定呢?答案是可以的,首先我们采用的是int类型的变量去存储,那么能表示的范围是:正负21亿的可表示数字,具体的代码如下:
//产生随机数的方法import java.util.*;public class RandomTest{ public static void main(String[] args){ Random random = new Random(); int num = random.nextInt(11);//表示产生0-10之间的随机数,产生的这个随机数我们应该可以保存,供加密和解密者使用 System.out.println("随机数为:"+num); }}改进后的加密算法
加密端代码:
import java.io.*;import java.util.*;class FileSecret{ public static void main(String[] args) throws Exception { //找到要加密的文件,盘符自己指定,输入输出不需要在同一个盘符 File inFile = new File("盘符:\\加密的文件"); //将要加密的文件输出到指定的盘符 File outFile = new File("盘符:\\解密的文件"); //建立数据通道,让图片的二进制数据流入 FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //产生加密异或的另一个数字 Random random = new Random(); int num = random.nextint(11); //表示产生0-10之间的随机数,产生的这个随机数我们应该可以保存,供加密和解密者使用 System.out.println("随机数为:"+num); //在读的过程中,将读到的数据异或一个数字,这个数字应该是由某种加密算法生成的,在这里我仅仅简单的编一个数字928(我的生日),然后进行异或,将得到的数据输出 int content = 0 ; //该变量用于存储读取到的数据,当然这里可以使用long等更长的数据类型,当然我们也可以使用其他的数据类型,只需要满足^两端的数据类型能够相互转换就行,至少能进行强制类型转换 while((content=input.read())!=-1) // 如果没有到文件的末尾,那么继续读取数据,读取到的数据已经存储到content变量中了,-1为文件的结束符 { output.write(content^num); //写到输出文件流中 } //关闭资源 input.close(); output.close(); }}加密端需要将上面代码中生成的num告知给解密端,否则不能实现文件的解密。
解密端代码:
import java.io.*;class FileSecret{ public static void main(String[] args) throws Exception { //找到要加密的文件,盘符自己指定,输入输出不需要在同一个盘符 File inFile = new File("盘符:\\加密的文件"); //将要加密的文件输出到指定的盘符 File outFile = new File("盘符:\\解密的文件"); //建立数据通道,让图片的二进制数据流入 FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //在读的过程中,将读到的数据异或一个数字,这个数字应该是由某种加密算法生成的,在这里我仅仅简单的编一个数字928(我的生日),然后进行异或,将得到的数据输出 int content = 0 ; //该变量用于存储读取到的数据,当然这里可以使用long等更长的数据类型,当然我们也可以使用其他的数据类型,只需要满足^两端的数据类型能够相互转换就行,至少能进行强制类型转换 while((content=input.read())!=-1) // 如果没有到文件的末尾,那么继续读取数据,读取到的数据已经存储到content变量中了,-1为文件的结束符 { output.write(content^从加密端传来的加密数字); //写到输出文件流中 } //关闭资源 input.close(); output.close(); }}再一次改进
其实在我们的代码中,标准的加密码应该是随机生成,并且包含有字母、数字等各种符号,那么我们怎么生成这样的加密串呢?生成这样的加密串之后是怎样将其转化为二进制代码的?提供一种思路:采用Java的正则表达式可以生成任意你想要的串,然后用字符串转化方法生成相应的二进制代码。我自己实现了一个极其复杂的加密生成方法,但是不能公开,这涉及到实验室项目的资料,并且有很多的密码学领域有很多经典的加密算法也是可以利用的。
总结
以上就是本文关于Java异或技操作给任意的文件加密原理及使用详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:
Java使用异或运算实现简单的加密解密算法实例代码
Java编程实现对十六进制字符串异或运算代码示例
java中的异或问题代码解析
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了java使用异或对文件进行加密解密的具体代码,供大家参考,具体内容如下1.使用异或的方式加密文件的原理一个数异或另一个数两次,结果一定是其本
Java简单的加密解密算法,使用异或运算实例1:packagecn.std.util;importjava.nio.charset.Charset;public
Servlet中操作文件详解及实例因为Servlet本来就是一个.Java文件,因此servlet中操作文件和普通java文件操作文件是一样的。读取文件主要代码
java仿Servlet生成验证码实例详解实现原理:使用BufferedImage对象的Graphics来进行绘制,然后输出成一张图片进行保存实现代码及详解:p
原理如下,假如: 加密 明文:10101001 密匙:11100011 密文:01001010 得出密文01001010,解密之需和密匙异或下就可以了