文章目录
  1. 1. XOR加密

command_conquer_red_alert_2_conceptart_b95ii
可参考

位运算优先级:
~—-><< —-> >> —–> &——> ^——->|——->

以下实例代码中:位都是 从0位开始算起

unsigned shot 一般都是16位;

i|=j;

2个对象位或运算,只要其中对象中的位有1位为1则1,否则为0;

i&=j;

2个对象进行与运算,只要2个位运算同时为1则为1,否则为0;

  1. 位的设置

    1
    i |= 1 << j; 		 /*将 第j位0设为1 ,其它位不变(利用`|`遇`1`则变`1`的特性);	'<<'	优先级高于 '|'	,	'='		*/
  2. 位的清除

    1
    i &= ~(1 << j);    /*  将第j为设为0,其它位不变(利用`&`与) //掩码:第j位为0,其它为1   */

也可以复合使用

1
i&=~(j|k);   /*  把j和k所有带1的位设为0*/
  1. 位的测试
    1
    if(i & 1 << j)			/*		检查第j位的值是>1还是<0	*/
    也可以复合测试
    1

XOR加密

将每一个字符与密钥&进行异或(XOR即^)运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<ctype.h>
#include<stdio.h>

#define key '&'
int main(void)
{
int orig_char, new_char;
while ((orig_char = getchar()) != EOF) {
new_char = orig_char^key;
if (isprint(orig_char) && isprint(new_char))
putchar(new_char);
else
putchar(orig_char);
}
return 0;
}

换而言之,解密只需要将加密的消息再次加密,即可得到原始的消息.

注意:该程序不会改变一些字符,包括数字。因为将这些字符与&异或会产生不可见的控制字符,这些在操作系统中会引发问题。

isprint()函数:判断字符是否为可打印字符

**可打印字符的ASCII码值**大于 0x1f(除了0x7f(DEL)),这些字符可以显示到屏幕上,让我们看到;不能显示在屏幕上,我们看不到的,叫控制字符,ASCII码值为 0x00 ~ 0x1f,再加上 0x7f(DEL)。检测控制字符请使用 isiscntrl() 函数。

其他:
%p可以输出二进制

参考程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main(void)
{

unsigned char a=0x8D;
unsigned char hight,low;
hight = (a>>4)&15;//蔽低4位
low = a & 15;
printf("hight[%02x]\n", hight);
printf("low[%02x]\n", low);


//要屏蔽低4位,x=(x>>4)&15;或(x>>=4)&=15;就可以了。
//要屏蔽高4位,x&=15;这样就可以了。
}
文章目录
  1. 1. XOR加密