C语言实现TEA系列加解密算法

C语言实现TEA系列加解密算法

    • TEA加解密
    • XTEA加解密
    • XXTEA加解密

TEA加解密

#include <stdio.h>
#include <stdint.h>//加密函数
void encrypt(uint32_t* v, uint32_t* k) {uint32_t v0 = v[0], v1 = v[1], sum = 0, i;uint32_t delta = 0x9e3779b9;uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];for (i = 0; i < 32; i++) {sum += delta;v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);}v[0] = v0; v[1] = v1;
}//解密函数
void decrypt(uint32_t* v, uint32_t* k) {uint32_t v0 = v[0], v1 = v[1], sum = 0xC6EF3720, i;uint32_t delta = 0x9e3779b9;uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];for (i = 0; i<32; i++) {v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);sum -= delta;}v[0] = v0; v[1] = v1;
}int main()
{// v为要加解密的数据,两个32位无符号整数uint32_t v[2] = { 1,2 };// k为加解密密钥,4个32位无符号整数,密钥长度为128位uint32_t k[4] = { 1,2,3,4 };int n = sizeof(v) / sizeof(uint32_t);printf("加密前原始数据:0x%x 0x%x\n", v[0], v[1]);encrypt(v, k);printf("加密后的数据:0x%x 0x%x\n", v[0], v[1]);decrypt(v, k);printf("解密后的数据:0x%x 0x%x\n", v[0], v[1]);for (int i = 0; i < n; i++){for (int j = 0; j < sizeof(uint32_t)/sizeof(uint8_t); j++){printf("%c", (v[i] >> (j * 8)) & 0xFF);}}printf("\n");return 0;
}

XTEA加解密

#include <stdio.h>
#include <stdint.h>//加密函数
void encrypt(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {unsigned int i;uint32_t v0 = v[0], v1 = v[1], sum = 0, delta = 0x9E3779B9;for (i = 0; i < num_rounds; i++) {v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);sum += delta;v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);}v[0] = v0; v[1] = v1;
}//解密函数
void decrypt(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {unsigned int i;uint32_t v0 = v[0], v1 = v[1], delta = 0x9E3779B9, sum = delta*num_rounds;for (i = 0; i < num_rounds; i++) {v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);sum -= delta;v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);}v[0] = v0; v[1] = v1;
}int main()
{// v为要加解密的数据,两个32位无符号整数uint32_t v[2] = { 1,2 };// k为加解密密钥,4个32位无符号整数,密钥长度为128位uint32_t k[4] = { 1,2,3,4 };int n = sizeof(v) / sizeof(uint32_t);// num_rounds,建议取值为32unsigned int r = 32;printf("加密前原始数据:0x%x 0x%x\n", v[0], v[1]);encrypt(r,v, k);printf("加密后的数据:0x%x 0x%x\n", v[0], v[1]);decrypt(r,v, k);printf("解密后的数据:0x%x 0x%x\n", v[0], v[1]);for (int i = 0; i < n; i++){for (int j = 0; j < sizeof(uint32_t) / sizeof(uint8_t); j++){printf("%c", (v[i] >> (j * 8)) & 0xFF);}}printf("\n");return 0;
}

XXTEA加解密

#include <stdio.h>
#include <stdint.h>
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))void btea(uint32_t *v, int n, uint32_t const key[4])
{uint32_t y, z, sum;unsigned p, rounds, e;//加密if (n > 1){rounds = 6 + 52 / n;sum = 0;z = v[n - 1];do{sum += DELTA;e = (sum >> 2) & 3;for (p = 0; p<n - 1; p++){y = v[p + 1];z = v[p] += MX;}y = v[0];z = v[n - 1] += MX;} while (--rounds);}//解密else if (n < -1){n = -n;rounds = 6 + 52 / n;sum = rounds*DELTA;y = v[0];do{e = (sum >> 2) & 3;for (p = n - 1; p>0; p--){z = v[p - 1];y = v[p] -= MX;}z = v[n - 1];y = v[0] -= MX;sum -= DELTA;} while (--rounds);}
}int main()
{/*原数据为:				传进去的参数为:0xbc 0xa5 0xce 0x40		->0x40cea5bc0xf4 0xb2 0xb2 0xe7		->0xe7b2b2f40xa9 0x12 0x9d 0x12		->0x129d12a90xae 0x10 0xc8 0x5b		->0x5bc810ae0x3d 0xd7 0x06 0x1d		->0x1d06d73d0xdc 0x70 0xf8 0xdc		->0xdcf870dc*/uint32_t v[6] = {(unsigned int)0x40cea5bc, (unsigned int)0xe7b2b2f4,(unsigned int)0x129d12a9,(unsigned int)0x5bc810ae,(unsigned int)0x1d06d73d,(unsigned int)0xdcf870dc };/*密钥为字符串"flag"十六进制表示为 0x66 0x6c 0x61 0x67于是传进去的参数要转换成 0x67616c66由于密钥长度为128位,其余需填充0*/uint32_t const k[4] = {(unsigned int)0x67616c66, (unsigned int)0x0,(unsigned int)0X0, (unsigned int)0x0 };//n的绝对值表示v的长度,取正表示加密,取负表示解密int n = sizeof(v) / sizeof(uint32_t);printf("加密前原始数据:0x%x 0x%x\n", v[0], v[1]);btea(v, n, k);printf("加密后的数据:0x%x 0x%x\n", v[0], v[1]);btea(v, -n, k);printf("解密后的数据:0x%x 0x%x\n", v[0], v[1]);for (int i = 0; i < n; i++){for (int j = 0; j < sizeof(uint32_t) / sizeof(uint8_t); j++){printf("%c", (v[i] >> (j * 8)) & 0xFF);}}printf("\n");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web服务器控件和HTML控件的区别与联系

我们知道&#xff0c;在ASP.NET中&#xff0c;使用了两类控件&#xff0c;一类是HTML控件&#xff0c;还有一类是WEB控件。 WEB控件我们已经很熟悉&#xff0c;因为它是ASP.NET提供&#xff0c;一般关于ASP.NET的教程文章都会仔细介绍这些控件的详细应用技巧&#xff1b; 而H…

Hexo 博客优化之博客美化系列(持续更新)

2022-01-25 更新&#xff1a;博客新地址&#xff1a;https://www.itbob.cn/&#xff0c;文章距上次编辑时间较远&#xff0c;部分内容可能已经过时&#xff01; 本文将讲述一些 Hexo 博客的美化&#xff0c;本文以作者 luuman 的 spfk 主题和作者 xaoxuu 的 Material X 主题为例…

C语言实现AES加解密算法

C语言实现AES加解密算法AES加解密AES加解密 #include <stdio.h> #include <stdint.h> #include <memory.h> /****************************************************************************************************************/ typedef enum {AES_CYPH…

一台电脑部署两个或多个 Hexo 博客(一台电脑使用两个或多个 GitHub 账号)

由于个人原因需要在一台电脑上部署两个Hexo博客&#xff0c;本来以为挺简单&#xff0c;没想到问题重重&#xff0c;首先是一个GitHub账号只能搭建一个Hexo博客&#xff0c;因此就需要使用其他GitHub账号&#xff1b;其次是一台电脑绑定两个GitHub账号&#xff0c;则需要两对公…

详解ASP.NET页面生命周期事件

下面是ASP.NET页面初始的过程: 1. Page_Init(); 2. Load ViewState; 3. Load Postback data; 4. Page_Load(); 5. Handle control events; 6. Page_PreRender(); 7. Page_Render(); 8. Unload event; 9. Dispose method called; 下面对其中的一些过程作下描述&#xff1a;1. P…

C语言实现DES加解密算法

C语言实现DES加解密算法DES加解密DES加解密 #include <stdio.h> #include <stdlib.h> #include <string.h> /*--------------------------------------------------------------------------------------------------------------*/ typedef unsigned char …

33种编程语言为您送上祝福,新年快乐!

又是新的一年&#xff0c;没什么好说的&#xff0c;就用33种编程语言为大家送上祝福吧&#xff01;Cprintf("2019&#xff0c;祝大家");Ccout<<"一帆风顺";C#System.Console.WriteLine("二龙腾飞")VBMsg("三羊开泰")VCMessageBo…

IsPostBack须要注意的地方,这些都不是POSTBACK动作

page.IsPostBack属性 简要概述: IsPostBack 字面意思理解为:是回滚,那如果不是回滚,那就是首次加载! (!page.ispostback)理解为:不是回滚,值为:true. if(!page.ispostback) //首次加载 { //如果是第一次加载,就执行此内容. } else{非首次加载页面} 1 IsPostBack介…

C语言实现RC4加解密算法

C语言实现RC4加解密算法RC4加解密RC4加解密 #include<stdio.h>/* RC4初始化函数 */ void rc4_init(unsigned char* s, unsigned char* key, unsigned long Len_k) {int i 0, j 0;char k[256] { 0 };unsigned char tmp 0;for (i 0; i < 256; i) {s[i] i;k[i] k…

element.style内联样式修改

最近在修改我个人博客的一个样式时发现&#xff0c;无论我如何修改style里面的值&#xff0c;页面上的样式都不会被修改&#xff0c;F12检查一下发现个element.style&#xff0c;但是却找不到这个值在哪里&#xff0c;查资料后才知道element.style为内联样式&#xff0c;基本很…

if(!ispostback)其用法和作用 什么时候该用?

&#xff08;1&#xff09;if (!IsPostBack) 里面的代码只执行一遍&#xff0c;即页面第一次加载时。 &#xff08;2&#xff09;以后页面重新刷新时&#xff0c;if (!IsPostBack)里面的语句不执行。 &#xff08;3&#xff09;首次建立页面 IsPostBack为false&#xff0c;用来…

C语言实现SM4加解密算法

C语言实现SM4加解密算法SM4加解密SM4加解密 #include <string.h> #include <stdio.h> #include <time.h> /*--------------------------------------------------------------------------------------------------------------*/ #define SM4_ENCRYPT …

免费CDN:jsDelivr+Github 使用方法

CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。CDN是构建在网络之上的内容分发网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c;降低网络拥塞&…

EasyUI学习总结(一)——EasyUI入门

一、EasyUI下载 EasyUI官方下载地址&#xff1a;http://www.jeasyui.com/download/index.php&#xff0c;目前最新的版本是&#xff1a;jQuery EasyUI 1.4.1 下载完成之后&#xff0c;得到压缩包&#xff0c;解压后&#xff0c;得到一个【jquery-easyui-1.4.1】文件夹&#xff…

PWN-PRACTICE-CTFSHOW-1

PWN-PRACTICE-CTFSHOW-1PWN签到题pwn02pwn03pwn04PWN签到题 nc连上去就会打印flag pwn02 栈溢出&#xff0c;覆盖返回地址为后门函数stack起始地址即可 # -*- coding:utf-8 -*- from pwn import * #ioprocess("./pwn1") ioremote("pwn.challenge.ctf.show&…

利用QQ邮箱设置个性域名邮箱,并在网易邮箱大师客户端添加域名邮箱

平常我们使用的邮箱都是xxxqq.com、xxx126.com、xxx163.com、xxxgmail.com之类的&#xff0c;这些邮箱会暴露你的QQ号、电话号等信息&#xff0c;最重要的是后缀都和别人一样&#xff0c;没有个性&#xff0c;也许你看见过xxxliruihao.com、xxxwangxiaoxiao.com之类的带有个性后…

MVC和WebForm区别

WebForm的理解 1、 WebForm概念 ASP.NETWebform提供了一个类似于Winform的事件响应GUI模型&#xff08;event-drivenGUI&#xff09;&#xff0c;隐藏了HTTP、HTML、JavaScript等细节&#xff0c;将用户界面构建成一个服务器端的树结构控件&#xff08;Control&#xff09;&a…

PWN-PRACTICE-CTFSHOW-2

PWN-PRACTICE-CTFSHOW-2pwn05pwn06pwn0701栈溢出之ret2textpwn05 栈溢出&#xff0c;覆盖返回地址为后门函数getFlag起始地址即可 # -*- coding:utf-8 -*- from pwn import * context.log_level"debug" #ioprocess("./pwn1") ioremote("pwn.challen…

VMware Pro 15 安装 Deepin15.9 国产操作系统详细教程

Deepin是由武汉深之度科技有限公司开发的Linux发行版&#xff0c;个人认为其界面设计非常美观&#xff0c;而且作为国产操作系统&#xff0c;值得我们去体验和支持&#xff01; 文章目录1.下载安装 VMware Workstation Pro 152.下载 Deepin15.9 系统3.在 VMware 中创建虚拟机4.…

Asp.Net WebForm生命周期的详解

一&#xff0e;http://Asp.Net页面生命周期的概念 当我们在浏览器地址栏中输入网址&#xff0c;回车查看页面时&#xff0c;这时会向服务器端IIS&#xff09;发送一个request请求&#xff0c;服务器就会判断发送过来的请求页面&#xff0c;当完全识别 TTP页面处理程序类后&…