異種暗号化の原理と例
2071 ワード
排他的論理和の演算方法は、1^1=0^0=0=0^0=1=10^1=1の2つが0に等しく、等しくない.
1文字については、いずれもバイナリコードで表すことができる.A:01000001文字の排他的論理和は、ビット毎にバイナリ演算を行う.暗号化アルゴリズムに用いる場合、暗号化する内容がA、鍵がBであると仮定すると、C=A^BでデータにCを保存すればよい.使用時:A=B^Cで元の暗号化の内容を取得できるので、鍵さえ分かれば暗号化と復号が完了する.
#include < stdio.h>main(){char a[]="MyPassword";/暗号化するパスワード/char b[]="cryptographic";/鍵/int i;/暗号化コード/for(i=0;a[i]!='0';i+)a[i]=a[i]=a[i]^b[i];printf("You Pasword encrypted:%s",a);/復号コード/for(i=0;a[i]!='0';i++)a[i]=a[i]=a[i]=a[i]=a[i]=a[i]=a[i]=a[i]=a[i]=a[i]^b[i]=a[i]^b「You Password:%s」,a);}
テキストを単純に暗号化する場合は、1つのnビットのバイナリ数で原文を異或演算することができます.復号化の方法は、同じ操作をもう一度実行することです.暗号化中にnビットバイナリ数がループします.また、その長さは8の整数倍ではない場合もあります.次のコードでは、この機能を実装する方法を示します.public class異或いは暗号化法{public static void print(char[]p){for(char x:p){System.out.printf("%s",x);System.out.println(); } public static void f(char[] buf, char[] uckey, int n) { int i; for (i = 0; i < n; i++) buf[i] = (char) (buf[i] ^ uckey[i]); }
実行結果:% G亜﹄¹Þ÷abcd中国人123
注意:a|b=4|7=(バイナリ化してビット単位または演算)0100|0111=01111、結果は10進数7に再化され、(ビット単位または、対応するビット毎に1|1=1、1|0=0|1=1、0|0=0)
だから4|7=7
JAvaには3種類のシフト演算子があります1.<:左シフト演算子、num<<1、numに2を乗じたものに相当します2.>:右シフト演算子、num>>1、numを2で割ったものに相当します>>>:記号なし右シフト、記号ビットを無視し、空席は0で埋められます
//0 x 80シフトバイナリは1000 0000、すなわち128であり、uckeyの各ビットをi%8で演算する.
1文字については、いずれもバイナリコードで表すことができる.A:01000001文字の排他的論理和は、ビット毎にバイナリ演算を行う.暗号化アルゴリズムに用いる場合、暗号化する内容がA、鍵がBであると仮定すると、C=A^BでデータにCを保存すればよい.使用時:A=B^Cで元の暗号化の内容を取得できるので、鍵さえ分かれば暗号化と復号が完了する.
#include < stdio.h>main(){char a[]="MyPassword";/暗号化するパスワード/char b[]="cryptographic";/鍵/int i;/暗号化コード/for(i=0;a[i]!='0';i+)a[i]=a[i]=a[i]^b[i];printf("You Pasword encrypted:%s",a);/復号コード/for(i=0;a[i]!='0';i++)a[i]=a[i]=a[i]=a[i]=a[i]=a[i]=a[i]=a[i]=a[i]=a[i]^b[i]=a[i]^b「You Password:%s」,a);}
テキストを単純に暗号化する場合は、1つのnビットのバイナリ数で原文を異或演算することができます.復号化の方法は、同じ操作をもう一度実行することです.暗号化中にnビットバイナリ数がループします.また、その長さは8の整数倍ではない場合もあります.次のコードでは、この機能を実装する方法を示します.public class異或いは暗号化法{public static void print(char[]p){for(char x:p){System.out.printf("%s",x);System.out.println(); } public static void f(char[] buf, char[] uckey, int n) { int i; for (i = 0; i < n; i++) buf[i] = (char) (buf[i] ^ uckey[i]); }
public static void main(String[] args) {
char p[] = "abcd 123".toCharArray(); //
char[] key = "11001100010001110".toCharArray(); // , 。
int np = p.length;
int nk = key.length; //nk=17
char[] uckey = new char[np];
// uckey , p uckey
int i;
for (i = 0; i < np * 8; i++) {
if (key[i % nk] == '1')
uckey[i/8] |= (char)0x80 >> (i%8); // 1
else
uckey[i/8] &= ~(char)0x80 >> (i%8); // 2
}
f(p, uckey, p.length);
print(p);
f(p, uckey, p.length);
print(p);
} }
実行結果:% G亜﹄¹Þ÷abcd中国人123
注意:a|b=4|7=(バイナリ化してビット単位または演算)0100|0111=01111、結果は10進数7に再化され、(ビット単位または、対応するビット毎に1|1=1、1|0=0|1=1、0|0=0)
だから4|7=7
JAvaには3種類のシフト演算子があります1.<:左シフト演算子、num<<1、numに2を乗じたものに相当します2.>:右シフト演算子、num>>1、numを2で割ったものに相当します>>>:記号なし右シフト、記号ビットを無視し、空席は0で埋められます
//0 x 80シフトバイナリは1000 0000、すなわち128であり、uckeyの各ビットをi%8で演算する.