日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现TEA系列加解密算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語言實(shí)現(xiàn)TEA系列加解密算法

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

TEA加解密

#include <stdio.h> #include <stdint.h>//加密函數(shù) 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; }//解密函數(shù) 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為要加解密的數(shù)據(jù),兩個(gè)32位無符號整數(shù)uint32_t v[2] = { 1,2 };// k為加解密密鑰,4個(gè)32位無符號整數(shù),密鑰長度為128位uint32_t k[4] = { 1,2,3,4 };int n = sizeof(v) / sizeof(uint32_t);printf("加密前原始數(shù)據(jù):0x%x 0x%x\n", v[0], v[1]);encrypt(v, k);printf("加密后的數(shù)據(jù):0x%x 0x%x\n", v[0], v[1]);decrypt(v, k);printf("解密后的數(shù)據(jù):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>//加密函數(shù) 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; }//解密函數(shù) 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為要加解密的數(shù)據(jù),兩個(gè)32位無符號整數(shù)uint32_t v[2] = { 1,2 };// k為加解密密鑰,4個(gè)32位無符號整數(shù),密鑰長度為128位uint32_t k[4] = { 1,2,3,4 };int n = sizeof(v) / sizeof(uint32_t);// num_rounds,建議取值為32unsigned int r = 32;printf("加密前原始數(shù)據(jù):0x%x 0x%x\n", v[0], v[1]);encrypt(r,v, k);printf("加密后的數(shù)據(jù):0x%x 0x%x\n", v[0], v[1]);decrypt(r,v, k);printf("解密后的數(shù)據(jù):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() {/*原數(shù)據(jù)為: 傳進(jìn)去的參數(shù)為: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"十六進(jìn)制表示為 0x66 0x6c 0x61 0x67于是傳進(jìn)去的參數(shù)要轉(zhuǎn)換成 0x67616c66由于密鑰長度為128位,其余需填充0*/uint32_t const k[4] = {(unsigned int)0x67616c66, (unsigned int)0x0,(unsigned int)0X0, (unsigned int)0x0 };//n的絕對值表示v的長度,取正表示加密,取負(fù)表示解密int n = sizeof(v) / sizeof(uint32_t);printf("加密前原始數(shù)據(jù):0x%x 0x%x\n", v[0], v[1]);btea(v, n, k);printf("加密后的數(shù)據(jù):0x%x 0x%x\n", v[0], v[1]);btea(v, -n, k);printf("解密后的數(shù)據(jù):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; }

總結(jié)

以上是生活随笔為你收集整理的C语言实现TEA系列加解密算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。