异或加密原理及实例

来源:互联网 发布:老子二章天下皆知 编辑:程序博客网 时间:2024/06/07 01:14

异或的运算方法是一个二进制运算:
1^1=0
0^0=0
1^0=1
0^1=1
两者相等为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]^b[i];
printf(“You Password encrypted: %s\n”,a);
/解密代码/
for(i=0;a[i]!=’\0’;i++)
a[i]=a[i]^b[i];
printf(“You Password: %s\n”,a);
}

在对文本进行简单加密的时候,可以选择用一个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=0111,结果再化为十进制7,(按位或,就是对应的每一位进行或运算 1|1=1, 1|0=0|1=1, 0|0=0)

所以4|7=7

java中有三种移位运算符
1. << : 左移运算符,num << 1,相当于num乘以2
2.>> : 右移运算符,num >> 1,相当于num除以2
3.>>> : 无符号右移,忽略符号位,空位都以0补齐

//0x80 换位二进制为1000 0000,即128,通过i%8对uckey的每一个位进行运算。

0 0
原创粉丝点击