设计一个加密机。要求是针对100个字符组成的字符串进行加密。
方法是:事先设计一个由3个字符组成的字符串作为秘钥,用此秘钥对100 个字符组成的字符串进行运算加密。秘钥字符串由字母加数字构成,秘钥第1个字符为任意字符,第2个字符为1-7之间的数字,第3个字符为任意字符。
要求是:
第一次:用秘钥的第1个字符对目标字符进行异或运算,如目标是 "A",秘钥是”C”,第1次,A XOR C;
第二次:用秘钥的第2个字符的对目标字符ASC的16进制数据进行循环左移位,如数字为2,则左边的位移动2个到右边。如第一次加密结果是“W”,其16进制asc数据为:0x57,二进制为01010111。第二次加密时,左边循环2位移动到右边是:01011101,其16进制数为:0x5d,这就是第二次加密的结果(是假设第一次加密结果为的情况下)
第三次:用秘钥的第三个字符的反向ASC码对目标字符进行异或。如秘钥的第三个字符为C.则其ASC码的16进制为0x43,二进制为01000011,反向ASC码 (从右边到左边数)为,11000010,16进制为0xC2,这时用0xC2继续第三次对目标字符进行加密,最后得到100个目标字符的加密结果。这样做的目的是:将来为了解密。
#include<stdio.h>
int main(){
char a[101], k[4];
printf("请输入密钥:");
scanf("%s", k);
printf("请输入待加密字符串:\n");
getchar();
gets(a);
int i, b, c = 0;
for(i = 0; i < 8; i++){ //第三个密钥
c = c*2 + (k[2] & 1);
k[2] = k[2] >> 1;
}
for(i = 0; a[i] != '\0'; i++){
a[i] = a[i] ^ k[0]; //一轮加密
b = a[i];
b = b >> (8- (k[1] - '0'));
a[i] = (a[i] << (k[1] - '0')) + b; //二轮加密
a[i] = a[i] ^ c; //三轮加密
}
printf("加密结果:\n%s", a);
return 0;
}
我觉得你的题目有点问题,字符串中的数据的值加密后是可能超过ASCII码范围的
下面是源码
#include <stdio.h>
char *jm(char str[],char key[]){
int i,f,n,d,j;
n = key[2];
d = 0;
for (j = 0; j < 8; j++){
d = (d << 1) | (n & 1);
n = n >> 1;
}
for (i = 0; str[i] !='\0'; i++) {
f = str[i] ^ key[0];
n = key[1]-'0';
f = ((f >> (8-n)) | (f << n)) & 0xff;
f = f ^ d;
str[i] = f;
}
return str;
}
int main() {
char key[] = "A2C";
char str[] = "abcdef";
jm(str,key);
printf("%s", str);
return 0;