English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JavaのXOR技術で任意のファイルを暗号化する原理及び使用法の詳細

XORの簡単な紹介:XORは二進数ベースのビット演算であり、シンボルXORまたは^で表されます。その運算法則は、演算子の両側の各二進数ビットに対して、同じ場合0、異なる場合1

簡単に言えば、進位しない加法であり、例えば1+1=0、0+0=0,1+0=0=1

要求説明

情報化時代におけるデータの暗号化は非常に重要なテーマです。プロジェクトの過程で、私は非常に複雑な暗号化アルゴリズムを実装しましたが、技術が機密であるため、ここでは非常に簡単なバージョンを実装します。ファイルの入出力ストリームとXOR操作を使用して任意のファイルを暗号化します。デコードアルゴリズムについては、自分で考えて解決できます。

数学的原理

この暗号化アルゴリズムは、2つの数のXORの機能を使用しています。まず、XORの原理について簡単に説明します。XORは、実際にはファイルの二進数エンコードに対する操作であり、簡単に言えば、2つの二進数ビットが同じ場合0、異なる場合1以下の例を見てください:

//7の二進数表現:
00000111
//2の二進数表現:
00000010
//両者をXORで行った結果:
00000101 //つまり数字5
//---------------------------
//で得られた結果を再度2XOR
//5の二進数表現:
00000101
//2の二進数表現:
00000010
//両者をXORで行った結果:
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);
		//読み込み中に、読み込まれたデータに数字をXORします。この数字はある暗号化アルゴリズムから生成されるべきですが、ここでは単純に数字を生成します928(私の誕生日)の後、XORを実行し、得られたデータを出力します
		int content = 0 ;
		//この変数は読み込まれたデータを保存するために使用されます。もちろん、longなどのもっと長いデータタイプを使用することもできます。また、他のデータタイプを使用することもできますが、^両端のデータタイプが相互に変換できる必要があります。少なくとも強制変換が可能です。
		while((content=input.read())!=})-1) // ファイルの終端に達していない場合、データを読み続け、読み取ったデータはcontent変数に保存されます。-1ファイルの終端記号
		{
			output.write(content^928);
			//出力ファイルストリームに書き込む
		}
		//リソースを閉じる
		input.close();
		output.close();
	}
}

コード機能評価

このコードでは、機能は大体に必要な要求を満たしていますが、いくつかの欠点があります。まず、XORの他方の数字を暗号化するアルゴリズムを使用していないこと、そしてファイルのデコードを実装していないことです。実際にはデコードは非常に簡単で、数学の原理部分を読めばデコードアルゴリズムの書き方がわかります。実際には、暗号化とデコードは同じ場所で同時に実行されるのではなく、暗号化とデコードは同じ暗号化アルゴリズムを使用して計算された結果です。

ランダムな数を使用してアルゴリズムを改善する

上記の過程では、実際には与えられた値を私たちが読み込んだバイナリファイルとXORを行う方法を取っています。このようにランダムな数で置き換えることはできますか?答えはイエスです。まず、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);
		//暗号化XORの別の数字を生成します
		Random random = new Random();
		int num = random.nextInt(11);
		//は0を表します-10の間のランダム数を生成します。生成されたこのランダム数は、暗号化者と解凍者が使用できるように保存する必要があります
		System.out.println("ランダム数:"+num);
		//読み込み中に、読み込まれたデータに数字をXORします。この数字はある暗号化アルゴリズムから生成されるべきですが、ここでは単純に数字を生成します928(私の誕生日)の後、XORを実行し、得られたデータを出力します
		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);
		//読み込み中に、読み込まれたデータに数字をXORします。この数字はある暗号化アルゴリズムから生成されるべきですが、ここでは単純に数字を生成します928(私の誕生日)の後、XORを実行し、得られたデータを出力します
		int content = 0 ;
		//この変数は読み込まれたデータを保存するために使用されます。もちろん、longなどのもっと長いデータタイプを使用することもできます。また、他のデータタイプを使用することもできますが、^両端のデータタイプが相互に変換できる必要があります。少なくとも強制変換が可能です。
		while((content=input.read())!=})-1) // ファイルの終端に達していない場合、データを読み続け、読み取ったデータはcontent変数に保存されます。-1ファイルの終端記号
		{
			output.write(content^暗号化端から受け取った暗号化数字);
			//出力ファイルストリームに書き込む
		}
		//リソースを閉じる
		input.close();
		output.close();
	}
}

再び改善

実際には、私たちのコードでは、標準的な暗号化キーはランダムに生成され、アルファベット、数字、さまざまなシンボルを含むべきです。どうやってこのような暗号化文字列を生成するのでしょうか?生成した暗号化文字列をどのようにバイナリーコードに変換するのでしょうか?以下のアプローチを提供します:Javaの正規表現を使用して、任意の文字列を生成し、その後、文字列変換メソッドを使用して対応するバイナリーコードを生成します。私は非常に複雑な暗号化生成メソッドを実装しましたが、公開することはできません。これは、研究室プロジェクトの資料に関連しており、多くの暗号学の古典的な暗号化アルゴリズムも利用できます。

まとめ

これで、本文におけるJavaのXOR技術に関するファイルの暗号化原理および使用方法の詳細説明が完了しました。皆様に役立つことを願っています。興味がある場合は、このサイトを参照してください:

JavaでXOR演算を使用したシンプルな暗号化・復号化アルゴリズムの実例コード

Javaで16進数文字列のXOR演算を実現するコード例

JavaでのXOR問題のコード解析

不十分な点があれば、コメントをお願いします。皆様のサポートに感謝します。

声明:この記事の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、アップロードしたものであり、このサイトは所有権を持ちません。また、人工的な編集は行われておらず、関連する法的責任も負いません。著作権侵害を疑う内容がある場合は、以下のメールアドレスにご連絡ください:notice#oldtoolbag.com(メール送信時は、#を@に変更してください)で報告してください。関連する証拠を提供し、一旦確認がとれたら、このサイトは即座に侵害を疑う内容を削除します。

おすすめ