JAVAカスタム暗号化アルゴリズム(1)
### 1.基本知
- ビットとバイトの関係
- 1)ビットは、メモリ内の最小のストレージユニットであり、0または1のいずれかです.
- 2)1バイト= 8ビット
- 3)バイトはJavaで最小のストレージユニットです.
- メモリ内のint型の格納方法(サンプル):
- Javaのint型の長さは32ビットです
- 最上位ビットは符号ビットです.1は負の数を意味し、0は正の数を意味します.
- したがって、Javaのint型の値の範囲は(- 2 ^ 31)〜(2 ^ 31)です.
- 数値は2の補数の形でメモリに保存されます.
- バイナリの基本的な知識
- 元の数の場合、最上位ビットは符号ビットであり、残りのビットは数値の絶対値の2進数です.
- シフト操作「>>」、右シフト.
- ビット単位のANDで「&」を計算します.2つのビットが同時に1の場合、結果は1になり、それ以外の場合は0になります.
### 2.int型をbyte []型に変換する方法
- 一致する長さのバイト配列を作成します
- 1バイト= 8ビット
- intの長さは32ビット、バイトの長さは8ビット
- したがって、byte[4]はint型の値を格納できます
- intをbyte[4]に格納します
- 「>>」操作を使用して、バイトに格納する8ビットを最下位ビットに移動します.
- 「&」演算を使用して、下位8桁以外の数値を0に変更します. (「&」サンプル)
- 結果をバイト型に強力に変換します
3.コード
public static byte[] intToByteArray(int i) { byte[] result = new byte[4]; result[0] = (byte)((i >> 24) & 0xFF); result[1] = (byte)((i >> 16) & 0xFF); result[2] = (byte)((i >> 8) & 0xFF); result[3] = (byte)(i & 0xFF); return result; }
「& 0xFFの意味は何ですか?説明をご参照ください。」 (説明)
4.説明
$\color{#4285f4}{メモリ内のint型の例}$
例:10進数の999
対応するバイナリ値は:1111100111
メモリ内のストレージ(2の補数は元の数と同じです):
00000000 00000000 00000011 11100111
例として10進数の- 999
元のコード:10000000 00000000 00000011 11100111
2の補数:11111111 11111111 11111100 00011001
メモリ内のストレージ:
11111111 11111111 11111100 00011001intをbyte [4]に格納する例
「&」操作を使用して上位ビットを「0」に変更します
00000000 00000000 00000011 11100111 & 0xFF =>
00000000 00000000 00000000 11100111
「& 0xFFの」$\color{#34a853}{説明:}$
0xFFは16進数で、2進数に変換されます:11111111
上記の計算は次と同等です.
00000000 00000000 00000000 11111111(0xFF)
& 00000000 00000000 00000011 11100111 (999)
00000000 00000000 00000000 11100111
「&」が同時に1の場合、結果は1になります.それ以外の場合、結果は0になります.下位8ビットの結果を変更せずに保持すると、残りのビットは0になります.
「0000000000000000 00000000 11100111」をバイトに強制変換します.これは、下位8ビットをバイトに格納することと同じです.
- 結果の確認
byte [] bResult = intToByteArray(999);
bResult [0] => 0($\color{#4285f4}{00000000}$ )
bResult [1] => 0($\color{#4285f4}{00000000}$ )
bResult [2] => 3($\color{#ea4335}{00000011}$ )
bResult [3] => - 25($\color{#fbbc05}{11100111}$ )
2の補数:$\color{#fbbc05}{11100111}$,対応する元の数:$\color{#34a853}{10011001}$
$\color{#34a853}{10011001}$対応する10進数は:- 25、最上位の桁1は負の数を表します.
byte [] bResult = intToByteArray(- 999);
bResult [0] => - 1($\color{#4285f4}{11111111}$)
bResult [1] => - 1($\color{#4285f4}{11111111}$)
bResult [2] => - 4($\color{#ea4335}{11111100}$)
bResult [3] => 25($\color{#fbbc05}{00011001}$)
2の補数:$\color{#4285f4}{11111111}$対応する元の数は:$\color{#34a853}{10000001}$
$\color{#34a853}{10000001}$対応する10進数:1、最上位の桁1は負の数を表します.
2の補数:$\color{#ea4335}{11111100}$対応する元の数は:$\color{#34a853}{10000100}$
10000100対応する10進数は:4、最上位の桁1は負の数を表します.
2の補数:$\color{#fbbc05}{00011001}$対応する元の数は:$\color{#34a853}{00011001}$
00011001対応する10進数は:25、最上位の桁0は正の数を表します.