TEA算法源码

//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语言的知识点掌握不牢固,多次使用都未能实现效果。例如:模加运算的理解,十六进制数的取值。
视频演示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值