服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - JAVA教程 - Java异或技操作给任意的文件加密原理及使用详解

Java异或技操作给任意的文件加密原理及使用详解

2021-03-10 13:31朱君鹏 JAVA教程

这篇文章主要介绍了Java异或技操作给任意的文件加密原理及使用详解,具有一定借鉴价值,需要的朋友可以参考下。

异或简单介绍:异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。

简单理解就是不进位加法,如1+1=0,,0+0=0,1+0=1。

需求描述

在信息化时代对数据进行加密是一个很重要的主题,在做项目的过程中,我也实现了一个比较复杂的加密算法,但是由于涉及到的技术是保密的,所以在这里我实现一个比较简单的版本,利用文件的输入输出流和异或操作进行任意文件的加密,关于解密算法,很简单,自己思考下就能解决。

数学原理

该加密算法利用的是两个数异或的功能,先简单的说下异或的原理,异或实际上是对文件的二进制编码进行操作,简单的说就是当两个二进制位相同时为0,不同时为1,看下面的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//7的二进制表示:
00000111
//2的二进制表示:
00000010
//两者异或得到的结果:
00000101 //也就是数字5
 
//---------------------------
//得到的结果再次和2异或
//5的二进制表示:
00000101
//2的二进制表示:
00000010
//两者异或得到的结果:
00000111 //也就是7,是不是很神奇的又回到了7呢?

代码实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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亿的可表示数字,具体的代码如下:

?
1
2
3
4
5
6
7
8
9
//产生随机数的方法
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);
 }
}

改进后的加密算法

加密端代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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告知给解密端,否则不能实现文件的解密。

解密端代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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异或技操作给任意的文件加密原理及使用详解的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

原文链接:http://blog.csdn.net/jpzhu16/article/details/50805959

延伸 · 阅读

精彩推荐
  • JAVA教程Java枚举类enum介绍

    Java枚举类enum介绍

    这篇文章主要介绍了Java枚举类enum介绍,和其它普通类一样,enum同样可以有成员变量、方法、构造器,也可以实现一个或多个接口,需要的朋友可以参考下 ...

    junjie3862019-12-16
  • JAVA教程新闻列表的分页查询java代码实现

    新闻列表的分页查询java代码实现

    这篇文章主要为大家详细介绍了新闻列表的分页查询java代码实现,感兴趣的小伙伴们可以参考一下 ...

    梦牵绕了谁的灵魂2782020-06-04
  • JAVA教程Java异步处理机制实例详解

    Java异步处理机制实例详解

    本文涉及Java编程中异步处理机制的简单介绍和一个相关实例,相信通过这篇文章,大家能对异步处理有更多的了解。...

    坚持很贵11272021-01-03
  • JAVA教程java日期相关类实例详解

    java日期相关类实例详解

    这篇文章主要介绍了java日期相关类实例详解,小编觉得还是挺不错的,这里分享给大家,供需要的朋友参考。...

    FlyingZCC7862021-01-27
  • JAVA教程idea2019.2安裝MybatisCodeHelper插件的超详细教程

    idea2019.2安裝MybatisCodeHelper插件的超详细教程

    这篇文章主要介绍了idea2019.2安裝MybatisCodeHelper插件的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考...

    edda_huang4132020-09-29
  • JAVA教程浅谈线性表的原理及简单实现方法

    浅谈线性表的原理及简单实现方法

    下面小编就为大家带来一篇浅谈线性表的原理及简单实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Java教程网5062020-11-19
  • JAVA教程Java网络编程基础教程之Socket入门实例

    Java网络编程基础教程之Socket入门实例

    这篇文章主要介绍了Java网络编程基础教程之Socket入门实例,本文讲解了创建Socket、Socket发送数据、Socket读取数据、关闭Socket等内容,都是最基础的知识点,需要...

    junjie4782019-11-28
  • JAVA教程Java虚拟机装载和初始化一个class类代码解析

    Java虚拟机装载和初始化一个class类代码解析

    这篇文章的主要内容是Java虚拟机装载和初始化一个class类的代码解析,包括介绍了装载和初始化的时机与方式,需要的朋友可以参考下。...

    DemonHunter21110132021-01-01