一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天干夜天天夜天干天ww | 暖暖中国免费观看高清完整版 | 久久久久综合 | 久久精品国产只有精品 | 91免费播放人人爽人人快乐 | 亚洲天堂网站 | 欧美成人aa | 99精品视频在线观看免费 | 亚洲精品午夜在线观看 | 欧美裸妇 | chinaese中国女人厕所小便 | 免费在线看 | 草草免费观看视频在线 | 亚洲人成绝费网站色ww | 希望影院高清免费观看视频 | 99午夜高清在线视频在观看 | 麻豆亚洲一区 | 欧美一区精品二区三区 | 色综合色狠狠天天综合色hd | 亚洲haose在线观看 | 2022最新国产在线不卡a | 精品久久成人 | 欧美破处女视频 | 性欧美xxxxx老太婆 | 亚洲黄色大片 | 成人免费视屏 | 久久人妻熟女中文字幕AV蜜芽 | 国产精品久久久久久久久久久威 | 女人又色又爽又黄 | 四虎免费影院4hu永久免费 | 奇米影视99 | 91精品啪在线观看国产线免费 | 人人澡 人人澡碰人人看软件 | 国产精品久久久精品视频 | 四虎免费看黄 | 男女肉文高h | 色人阁图片 | 日本不卡在线视频高清免费 | 亚洲 欧美 日本 国产 高清 | 色综合天天综合网站中国 | 午夜理论片日本中文在线 |