读书人

c语言:这题什么意思?该怎么处理

发布时间: 2012-04-19 14:36:43 作者: rapoo

c语言:这题什么意思?

在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算。
解密的方法就是再执行一次同样的操作。

加密过程中n位二进制数会循环使用。并且其长度也可能不是8的整数倍。

下面的代码演示了如何实现该功能。
请仔细阅读,填写空缺的代码(下划线部分)。
注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。


void f(char* buf, unsigned char* uckey, int n)
{
int i;
for(i=0; i<n; i++)
buf[i] = buf[i] ^ uckey[i];
}

int main(int argc, char* argv[])
{
char p[] = "abcd中国人123"; // 待加密串

char* key = "11001100010001110"; //以串的形式表达的密匙,运算时要转换为按位存储的形式。

int np = strlen(p);
int nk = strlen(key);
unsigned char* uckey = (unsigned char*)malloc(np);

// 密匙串需要按位的形式循环拼入 uckey中
int i;
for(i=0; i<np*8; i++)
{
if(key[i%nk]=='1')
____________________________________________; // 填空1
else
____________________________________________; // 填空2

}

f(p, uckey, strlen(p));
f(p, uckey, strlen(p));

printf("%s\n", p);

free(uckey);

return 0;
}
横线上什么都不写输出:abcd中国人123

[解决办法]
大概明白题目的意思,如下:


要求将key中的字符串当做二进制数,需要八位一组转化成十进制存放到uckey中,按题目意思key的值是可以循环使用的

char* key = "11001100010001110"; //以串的形式表达的密匙,运算时要转换为按位存储的形式。


int np = strlen(p);

int nk = strlen(key);

unsigned char* uckey = (unsigned char*)malloc(np);

// 密匙串需要按位的形式循环拼入 uckey中

int i;


/*因为p有np个字节长度,这里需要查看 np字节*8 bit位*/

for(i=0; i<np*8; i++)

{
/*循环判断key*/

if(key[i%nk]=='1')

/*这是五楼的答案,他原意应该是将8个bit位移位得到一个char类型*/
/*我想的话这里是否不应该是与运算吧,是或运算吧*/
uckey[ i / 8 ] = uckey[ i / 8 ] & ( 1 << ( i % 8 ) ); // 填空1

else

/*同上*/
uckey[ i / 8 ] = uckey[ i / 8 ] & (~( 1 << ( i % 8 )) );// 填空2


}


然后用转换得到的13字节的uckey与p做异或运算!


爆料,我只看懂了题目意思,自己不会实现,对于五楼的答案的疑惑只是推测,并不是很肯定!
[解决办法]

探讨
uckey[ i / 8 ]初始化应该是0,每次做与运算后也是零,那么最后的结果都是0.
俺没用过移位,再次怀疑下!

读书人网 >C语言

热点推荐