Grain加密代码求助

 代码来源

(60条消息) Grain加密算法_Grain-C其他资源-CSDN文库icon-default.png?t=LA92https://download.csdn.net/download/myguoguo/8723677

因代码来源是下载的,故在此不粘贴全部代码,只粘贴部分代码,希望能够得到帮助

int lfsr(int a[N]) {
	int temp, i;
	int deliv_arg;
	deliv_arg = a[0];//将要输出的值赋予deliv_arg
	temp = a[0] ^ a[13] ^ a[23] ^ a[38] ^ a[51] ^ a[62];//由运算得到新的尾值*1
	if (flag == 1) {	//标志
		temp ^= g_save;
	}
	for (i = 0; i < N - 1; i++) {//移位操作
		a[i] = a[i + 1];
	}
	a[N - 1] = temp;
	return deliv_arg;
}

void nfsr(int deliv_arg, int b[N])//参数来自于线性移位寄存器
{
	int temp, i;
	temp = deliv_arg ^ b[0] ^ b[9] ^ b[14] ^ b[21] ^ b[28] ^ b[33] ^ b[37] ^ b[45] ^ b[52] ^ b[60] ^ b[62] ^ (b[63] & b[60]) ^ (b[37] & b[33]) ^ (b[15] & b[9]) ^ (b[60] & b[52] & b[45]) ^ (b[33] & b[28] & b[21]) ^ (b[63] & b[45] & b[28] & b[9]) ^ (b[60] & b[52] & b[37] & b[33]) ^ (b[63] & b[60] & b[21] & b[15]) ^ (b[63] & b[60] & b[52] & b[45] & b[37]) ^ (b[33] & b[28] & b[21] & b[15] & b[9]) ^ (b[52] & b[45] & b[37] & b[33] & b[28] & b[21]);
	if (flag == 1) {
		temp ^= g_save;
	}
	for (i = 0; i < N; i++) {
		b[i] = b[i + 1];
	}
	b[N - 1] = temp;
}
int bool_fun(int a[], int b[])
{
	int temp;
	temp = a[25] ^ b[63] ^ (a[3] & a[64]) ^ (a[46] & a[64])
		^ (a[64] & b[63]) ^ (a[3] & a[25] & a[46]) ^ (a[3] & a[46] & a[64])
		^ (a[3] & a[46] & b[63]) ^ (a[25] & a[46] & b[63]) ^ (a[46] & a[64] & b[63]);
	return temp;
}

void en_decrypt(int a[], int b[], int choice)
{
	char filename[30];
	int j, deliv_arg;
	char data_c;
	int bool_c[8];//存储bool_fun的返回值
	FILE* fp1, * fp2;
	//===========================
	if (choice == 2)
		init_key(a, b);
	//============================
	if (choice == 1) {
		printf("enter the name of file?\n");
		scanf("%s", filename);
		if ((fp2 = fopen(filename, "rb+")) == NULL)
		{
			printf("failure!");
			exit(0);
		}
		if ((fp1 = fopen("d:\\Users\\ASUS\\Desktop\\test1\\enc.txt", "wb+")) == NULL) {
			printf("failure!");
			exit(0);
		}

	}
	
	//============================
	data_c = fgetc(fp2);

    while (!feof(fp2))
	{
		for (j = 0; j <= 7; j++)
		{
            bool_c[j] = (bool_fun(a, b) ^ output(b));//test
			data_c = data_c ^ (char)(bool_c[j] << (7 - j));
			deliv_arg = lfsr(a);
			nfsr(deliv_arg, b);
		}



		fputc(data_c, fp1);
		//printf("%d%c",data_c);
		data_c = fgetc(fp2);

	}


	fclose(fp1);
	fclose(fp2);
	if (choice == 1) {
		printf("**加密完成!**\n");
	}
	else {
		printf("**解密完成!**\n");
	}



	}
int output(int x[])
{
	return x[1] ^ x[2] ^ x[4] ^ x[10] ^ x[31] ^ x[43] ^ x[56];
}

该算法是用来作为grain加密文件用的,但代码中输出的文件为乱码,输出结果如图

 希望能够输出的结果为可见字符并且是由字母和数字组成,希望能够帮助到我。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Saulstone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值