异或加密原理及实例

异或的运算方法是一个二进制运算:
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的每一个位进行运算。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值