代码来源
(60条消息) Grain加密算法_Grain-C其他资源-CSDN文库https://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加密文件用的,但代码中输出的文件为乱码,输出结果如图
希望能够输出的结果为可见字符并且是由字母和数字组成,希望能够帮助到我。