IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> TEA算法源码 -> 正文阅读

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 15:59:31  更:2022-04-06 16:02:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:09:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码