溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java異或操作給任意文件加密的示例分析

發(fā)布時(shí)間:2021-08-09 10:52:38 來(lái)源:億速云 閱讀:133 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)Java異或操作給任意文件加密的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

異或簡(jiǎn)單介紹:異或是一種基于二進(jìn)制的位運(yùn)算,用符號(hào)XOR或者 ^ 表示,其運(yùn)算法則是對(duì)運(yùn)算符兩側(cè)數(shù)的每一個(gè)二進(jìn)制位,同值取0,異值取1。

簡(jiǎn)單理解就是不進(jìn)位加法,如1+1=0,,0+0=0,1+0=1。

需求描述

在信息化時(shí)代對(duì)數(shù)據(jù)進(jìn)行加密是一個(gè)很重要的主題,在做項(xiàng)目的過(guò)程中,我也實(shí)現(xiàn)了一個(gè)比較復(fù)雜的加密算法,但是由于涉及到的技術(shù)是保密的,所以在這里我實(shí)現(xiàn)一個(gè)比較簡(jiǎn)單的版本,利用文件的輸入輸出流和異或操作進(jìn)行任意文件的加密,關(guān)于解密算法,很簡(jiǎn)單,自己思考下就能解決。

數(shù)學(xué)原理

該加密算法利用的是兩個(gè)數(shù)異或的功能,先簡(jiǎn)單的說(shuō)下異或的原理,異或?qū)嶋H上是對(duì)文件的二進(jìn)制編碼進(jìn)行操作,簡(jiǎn)單的說(shuō)就是當(dāng)兩個(gè)二進(jìn)制位相同時(shí)為0,不同時(shí)為1,看下面的例子:

//7的二進(jìn)制表示:
00000111
//2的二進(jìn)制表示:
00000010
//兩者異或得到的結(jié)果:
00000101 //也就是數(shù)字5

//---------------------------
//得到的結(jié)果再次和2異或
//5的二進(jìn)制表示:
00000101
//2的二進(jìn)制表示:
00000010
//兩者異或得到的結(jié)果:
00000111 //也就是7,是不是很神奇的又回到了7呢?

代碼實(shí)現(xiàn)

import java.io.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//找到要加密的文件,盤(pán)符自己指定,輸入輸出不需要在同一個(gè)盤(pán)符
		File inFile = new File("盤(pán)符:\\加密的文件");
		//將要加密的文件輸出到指定的盤(pán)符
		File outFile = new File("盤(pán)符:\\解密的文件");
		//建立數(shù)據(jù)通道,讓圖片的二進(jìn)制數(shù)據(jù)流入
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//在讀的過(guò)程中,將讀到的數(shù)據(jù)異或一個(gè)數(shù)字,這個(gè)數(shù)字應(yīng)該是由某種加密算法生成的,在這里我僅僅簡(jiǎn)單的編一個(gè)數(shù)字928(我的生日),然后進(jìn)行異或,將得到的數(shù)據(jù)輸出
		int content = 0 ;
		//該變量用于存儲(chǔ)讀取到的數(shù)據(jù),當(dāng)然這里可以使用long等更長(zhǎng)的數(shù)據(jù)類(lèi)型,當(dāng)然我們也可以使用其他的數(shù)據(jù)類(lèi)型,只需要滿(mǎn)足^兩端的數(shù)據(jù)類(lèi)型能夠相互轉(zhuǎn)換就行,至少能進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換
		while((content=input.read())!=-1) // 如果沒(méi)有到文件的末尾,那么繼續(xù)讀取數(shù)據(jù),讀取到的數(shù)據(jù)已經(jīng)存儲(chǔ)到content變量中了,-1為文件的結(jié)束符
		{
			output.write(content^928);
			//寫(xiě)到輸出文件流中
		}
		//關(guān)閉資源
		input.close();
		output.close();
	}
}

代碼功能評(píng)價(jià)

對(duì)于這段代碼,功能大體上已經(jīng)能夠用滿(mǎn)足需求,但是存在不足,第一沒(méi)有使用加密算法生成異或的另一端數(shù)字,第二我沒(méi)有去實(shí)現(xiàn)文件的解密,實(shí)際上解密十分簡(jiǎn)單,請(qǐng)自己仔細(xì)讀數(shù)學(xué)原理部分就能知道怎么去寫(xiě)解密算法,實(shí)際上加密和解密也不是同一個(gè)地方同時(shí)實(shí)現(xiàn)的,而是加密雙采用相同的加密算法進(jìn)行運(yùn)算得出的。

使用隨機(jī)數(shù)改進(jìn)算法

在上面的過(guò)程中,我們實(shí)際上采用的是給定的一個(gè)值去和我們讀入的二進(jìn)制文件進(jìn)行異或,那么我們是否能用一個(gè)隨機(jī)數(shù)去代替這種約定呢?答案是可以的,首先我們采用的是int類(lèi)型的變量去存儲(chǔ),那么能表示的范圍是:正負(fù)21億的可表示數(shù)字,具體的代碼如下:

//產(chǎn)生隨機(jī)數(shù)的方法
import java.util.*;
public class RandomTest{
 public static void main(String[] args){
  Random random = new Random();
  int num = random.nextInt(11);//表示產(chǎn)生0-10之間的隨機(jī)數(shù),產(chǎn)生的這個(gè)隨機(jī)數(shù)我們應(yīng)該可以保存,供加密和解密者使用
  System.out.println("隨機(jī)數(shù)為:"+num);
 }
}

改進(jìn)后的加密算法

加密端代碼:

import java.io.*;
import java.util.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//找到要加密的文件,盤(pán)符自己指定,輸入輸出不需要在同一個(gè)盤(pán)符
		File inFile = new File("盤(pán)符:\\加密的文件");
		//將要加密的文件輸出到指定的盤(pán)符
		File outFile = new File("盤(pán)符:\\解密的文件");
		//建立數(shù)據(jù)通道,讓圖片的二進(jìn)制數(shù)據(jù)流入
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//產(chǎn)生加密異或的另一個(gè)數(shù)字
		Random random = new Random();
		int num = random.nextint(11);
		//表示產(chǎn)生0-10之間的隨機(jī)數(shù),產(chǎn)生的這個(gè)隨機(jī)數(shù)我們應(yīng)該可以保存,供加密和解密者使用
		System.out.println("隨機(jī)數(shù)為:"+num);
		//在讀的過(guò)程中,將讀到的數(shù)據(jù)異或一個(gè)數(shù)字,這個(gè)數(shù)字應(yīng)該是由某種加密算法生成的,在這里我僅僅簡(jiǎn)單的編一個(gè)數(shù)字928(我的生日),然后進(jìn)行異或,將得到的數(shù)據(jù)輸出
		int content = 0 ;
		//該變量用于存儲(chǔ)讀取到的數(shù)據(jù),當(dāng)然這里可以使用long等更長(zhǎng)的數(shù)據(jù)類(lèi)型,當(dāng)然我們也可以使用其他的數(shù)據(jù)類(lèi)型,只需要滿(mǎn)足^兩端的數(shù)據(jù)類(lèi)型能夠相互轉(zhuǎn)換就行,至少能進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換
		while((content=input.read())!=-1) // 如果沒(méi)有到文件的末尾,那么繼續(xù)讀取數(shù)據(jù),讀取到的數(shù)據(jù)已經(jīng)存儲(chǔ)到content變量中了,-1為文件的結(jié)束符
		{
			output.write(content^num);
			//寫(xiě)到輸出文件流中
		}
		//關(guān)閉資源
		input.close();
		output.close();
	}
}

加密端需要將上面代碼中生成的num告知給解密端,否則不能實(shí)現(xiàn)文件的解密。

解密端代碼:

import java.io.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//找到要加密的文件,盤(pán)符自己指定,輸入輸出不需要在同一個(gè)盤(pán)符
		File inFile = new File("盤(pán)符:\\加密的文件");
		//將要加密的文件輸出到指定的盤(pán)符
		File outFile = new File("盤(pán)符:\\解密的文件");
		//建立數(shù)據(jù)通道,讓圖片的二進(jìn)制數(shù)據(jù)流入
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//在讀的過(guò)程中,將讀到的數(shù)據(jù)異或一個(gè)數(shù)字,這個(gè)數(shù)字應(yīng)該是由某種加密算法生成的,在這里我僅僅簡(jiǎn)單的編一個(gè)數(shù)字928(我的生日),然后進(jìn)行異或,將得到的數(shù)據(jù)輸出
		int content = 0 ;
		//該變量用于存儲(chǔ)讀取到的數(shù)據(jù),當(dāng)然這里可以使用long等更長(zhǎng)的數(shù)據(jù)類(lèi)型,當(dāng)然我們也可以使用其他的數(shù)據(jù)類(lèi)型,只需要滿(mǎn)足^兩端的數(shù)據(jù)類(lèi)型能夠相互轉(zhuǎn)換就行,至少能進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換
		while((content=input.read())!=-1) // 如果沒(méi)有到文件的末尾,那么繼續(xù)讀取數(shù)據(jù),讀取到的數(shù)據(jù)已經(jīng)存儲(chǔ)到content變量中了,-1為文件的結(jié)束符
		{
			output.write(content^從加密端傳來(lái)的加密數(shù)字);
			//寫(xiě)到輸出文件流中
		}
		//關(guān)閉資源
		input.close();
		output.close();
	}
}

再一次改進(jìn)

其實(shí)在我們的代碼中,標(biāo)準(zhǔn)的加密碼應(yīng)該是隨機(jī)生成,并且包含有字母、數(shù)字等各種符號(hào),那么我們?cè)趺瓷蛇@樣的加密串呢?生成這樣的加密串之后是怎樣將其轉(zhuǎn)化為二進(jìn)制代碼的?提供一種思路:采用Java的正則表達(dá)式可以生成任意你想要的串,然后用字符串轉(zhuǎn)化方法生成相應(yīng)的二進(jìn)制代碼。我自己實(shí)現(xiàn)了一個(gè)極其復(fù)雜的加密生成方法,但是不能公開(kāi),這涉及到實(shí)驗(yàn)室項(xiàng)目的資料,并且有很多的密碼學(xué)領(lǐng)域有很多經(jīng)典的加密算法也是可以利用的。

感謝各位的閱讀!關(guān)于“Java異或操作給任意文件加密的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI