異種暗号化の原理と例

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]); }
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で演算する.