//77行出现错误,无法解决
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define num_rounds 32
/*take 64 bits of data in v[0] and v[1] and 128 bits of key[0]~ key[3]*/
void encipher(unsigned int v[2], unsigned int key[4])
{
unsigned int i;
unsigned int v0 = v[0];
unsigned int v1 = v[1];
unsigned int sum = 0;
unsigned int delta = 0x9E3779B9;
for ( i = 0; i < num_rounds; i++)
{
v0 += (((v1<<4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
//v0 = v0 + (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]); 不要在这里随便使用如下的转换a+=b ---> a = a+b 这是模加运算,不对等!
sum += delta;//注意每次v0 v1的取值
//printf("%d\t \n", sum);
//v1 = v1 + (((v0 >>5) ^ v0 >> 5) + v0) ^ (sum + key[sum >> 11 & 3]);
v1 += (((v0<<4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
}
v[0] = v0;
v[1] = v1;
}
void decipher(unsigned int v[2], unsigned int key[4])
{
unsigned int i;
unsigned v0 = v[0];
unsigned v1 = v[1];
//unsigned delta = 0x9E377989; 数字写错了
unsigned delta = 0x9E3779B9;
unsigned sum = delta * num_rounds;
for (i = 0; i < num_rounds; i++)
{
//v1 = v1 - (((v0 << 4) ^( v0 >> 5) + v0) ^ (sum + key[(sum >> 11) & 3]));
v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
sum -= delta;
//v0 = v0 - (((v1 << 4) ^( v1 >> 5) + v1) ^ (sum + key[sum & 3]));
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
}
v[0] = v0;
v[1] = v1;
}
int main(int argc, char* argv[])
{
//judge whether the parameters' number is 5
//e(加密) 密码 源文件名 输出文件名
//d(解密) 密码 源文件名 输出文件名
if (argc != 5)
{
printf("\n Usage:%s e(encipher) password sourcefile outFile \n",argv[0]);
printf("\n Usage:%s d(decipher) password sourcefule outfile \n", argv[0]);
return 0;
}
for (int i = 0; i < 5; i++)
{
printf("第%d个参数是:%s \n", i, argv[i]);
}
//第0个参数是:f:\Users\Thinkpad\source\repos\TeaAlgorithm\Debug\TeaAlgorithm.exe
//第1个参数是:e
//第2个参数是:123456
//第3个参数是:plaintext.txt
//第4个参数是:file.out
//第5个参数是:(null)
//store a password,100字符防止内存溢出
char password[100] = { 0 }; //={0} is important
// #pragma warning(disable : 4996)
strcpy_s(password, argv[2]);//可变参数2是用户输入的密码
//read from a file ,write to a file
//FILE * fpin = fopen(argv[3], "rb");
//FILE * fpout = fopen(argv[4], "wb");
//因为参数不对,导致指针为空。输入的参数应该是绝对路径!
//FILE* fpin = fopen("F:\\Users\\Thinkpad\\source\\repos\\TeaAlgorithm\\Debug\\plaintext.txt", "rb");
//FILE* fpout = fopen("F:\\Users\\Thinkpad\\source\\repos\\TeaAlgorithm\\Debug\\ciphertext.txt", "wb");
//定义文件指针,从argv[3]读文件,从argv[4]中写文件
FILE* fpin = fopen(argv[3], "rb");//以二进制文件读
FILE* fpout = fopen(argv[4], "wb");
if (fpin != NULL && fpout != NULL)
{
while (!feof(fpin))
//如果文件没有结束的时候,做下面的循环
{
unsigned int msg[2];
msg[0] = msg[1] = 0;//= {0} is important
if (fread(msg, 1, 8, fpin) == 0)
//没有读到数据,则退出主循环
//这里犯了一个错误,没有理解这句话的含义
{
break;
}
//if the first char in argv[0] = 'e', do the "encipher"
if (argv[1][0] == 'e')
{
encipher(msg, (unsigned int*)password);
}
//if the first char in argv[0] = 'd', do the "decipher"
else
{
decipher(msg, (unsigned int*)password);
}
fwrite(msg, 1, 8, fpout);
}
}
fclose(fpin); //这里触发了一个断点
fclose(fpout);
return 0;
}
//int main_01(int argc, char* argv[]) {
// int i;
// for (i = 0; i < argc; i++)
// {
// printf(" Argument %d is %s.\n\n", i, argv[i]);
// }
// return 0;
//}
在写这个TEA实现的过程中,因为自己对C语言的知识点掌握不牢固,多次使用都未能实现效果。例如:模加运算的理解,十六进制数的取值。
视频演示