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

java 异或加密_Java异或技操作给任意的文件加密原理及使用详解异或简单介绍:异或是一种基于二进制的位运算,用符号XOR或者^表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。简单理解就是不进位加法,如1+1=0,,0+0=0,1+0=1。需求描述在信息化时代对数据进行加密是一个很重要的主题,在做项目的过程中,我也实现了一个比较复杂的加密算法,但是由于涉及到的技术是保密的,所以在这里我实现一个比较简单的版本,利用文件的输入输出流和异或操…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

异或简单介绍:异或是一种基于二进制的位运算,用符号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异或技操作给任意的文件加密原理及使用详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188067.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 二叉树的性质及其创建

    二叉树的性质及其创建二叉树的性质性质1在二叉树的第i层上至多有2^(i-1)个结点(i>=1)性质2深度为k的二叉树至多有2^k-1个结点(k>=1)性质3对任意一棵二叉树,若终端结点数为n0,其度数为2的结点数为n2,那么n0=n2+1满二叉树深度为k且结点个数为2^k-1,即每一层都具有最大结点数完全二叉树深度为k,结点数为n的二叉树,如果其结点1n的位置序号分别与满二叉树的结点1…

    2022年5月15日
    38
  • 异步fifo的10个测试关注点_异步FIFO

    异步fifo的10个测试关注点_异步FIFO1、异步FIFO简介及其原理FIFO是英文FirstInFirstOut的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据。异步FIFO是指读写时钟不一致,读写时钟是互相独立的。1.1用途用途1:  跨时钟域:异步FIFO读写分别采用相互异步的不同时钟。在现代集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个时钟,多时钟域带来的一个问题就是,如何设计异步时钟之间的接口电路。异步FIFO是这个问题的一

    2022年8月13日
    6
  • python ==和is_python中is是什么意思

    python ==和is_python中is是什么意思前置知识点当我们创建一个对象时,我们要知道它内部干了些什么1.创建了一个随机id,开辟了一片内存地址2.自动声明了这个对象的类型type3.给这个对象赋值value小例子a=1pri

    2022年7月30日
    5
  • fcitx install 安装 解决 办法(方框)

    fcitx install 安装 解决 办法(方框)

    2021年4月27日
    159
  • 齐次坐标讲解_齐次方程为什么叫齐次

    齐次坐标讲解_齐次方程为什么叫齐次齐次坐标的表示根据《向量几何在游戏编程中的使用6》中关于基的概念。对于一个向量v以及基oabc,可以找到一组坐标(v1,v2,v3),使得v=v1a+v2b+v3c(1)而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得p–o=p1a+p2b+p3c(2)从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p–o(有的书中把这样的向.

    2025年6月21日
    4
  • 六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序「建议收藏」

    六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序「建议收藏」文章目录:1.插入排序2.希尔排序1.插入排序步骤:1.从第一个元素开始,该元素可以认为已经被排序2.取下一个元素tem,从已排序的元素序列从后往前扫描3.如果该元素大于tem,则将该元素移到下一位4.重复步骤3,直到找到已排序元素中小于等于tem的元素5.tem插入到该元素的后面,如果已排序所有元素都大于tem,则将tem插入到下标为0的位置6.重复步骤2~5动图演示如下:思路:  在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个

    2022年7月12日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号