【2021.12.25】ctf逆向中常见加密算法和编码识别

您所在的位置:网站首页 rc4加密算法c语言 【2021.12.25】ctf逆向中常见加密算法和编码识别

【2021.12.25】ctf逆向中常见加密算法和编码识别

2023-11-22 14:47| 来源: 网络整理| 查看: 265

【2021.12.25】ctf逆向中常见加密算法和编码识别(含exe及wp)

文章目录 【2021.12.25】ctf逆向中常见加密算法和编码识别(含exe及wp)0、前言1、基础加密手法2、base64(1)原理:(2)base64完整编码过程(3)base64完整解码过程(4)特殊情况(5)base64加解密代码(6)base64在ctf中的变换(7)变换码表之后的base解法:(8)base58(9)练习 3、TEA(1)简介(2)TEA加解密代码(3)TEA扩展:XTEA加密 4、RC4(1)简介(2)加密过程(3)RC4加解密代码(4)RC4逆向(5)逆向RC4算法技巧(6)练习 5、MD5(1)简介(2)特点(3)运用(4)ctf逆向中的使用 6、总结

0、前言

在对数据进行变换的过程中,除了简单的字节操作之外,还会使用一些常用的编码加密算法,因此如果能够快速识别出对应的编码或者加密算法,就能更快的分析出整个完整的算法。

CTF 逆向中通常出现的加密算法包括 base64、TEA、AES、RC4、MD5 等。

1、基础加密手法

简单位运算

位运算C语言符号意义左移一般是位右移,有符号数高位补符号位,无符号数高位补0异或^按位比较,相同位取0,不同位取1与&按位比较,全为1时取1,否走取0或|按位比较,全为0时取0,否则取1非~按位取反

简单加密类型

基础加密算法简易公式意义凯撒加密Y=X+a任意值X经过偏移为a的移位变换为Y仿射加密Y = aX+b与上面类似 2、base64

Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。其码表有64个字符。

base64码表

加密的数据分为3个字节一组、6位一段;其中6位的含义是2的6次方=64,可以用64个码表字符表示。

(1)原理:

3个字节一组,将 3 字节的数据,(字符对应Ascll码)先后放入一个 24位的缓冲区中,先来的字节占高位。

3个字节24位从高到低平分成4段,每段6位,

用这6位二进制为代表的数字在base表中查找对应位置的字符。

(2)base64完整编码过程

假设要编码的字符串长度是3的倍数。

image-20210907185026475

(3)base64完整解码过程

假设要解码的字符串长度是4的倍数。

image-20210907185139929

(4)特殊情况

若加密字符长度除以3余1 ,则最后一组只有1个字节8位,将8位二进制后续以0填充至12位,(6的倍数),分成两段,查表获得两个字符,再添加‘==’,凑齐4个字符,完整演示如下。

image-20210907185307314

若加密字符长度除以3余2,则最后一组只有2个字节16位,将16位二进制后续以0填充至18位,(6的倍数),分成3段,查表获得三个字符,再添加‘=’,凑齐4个字符,完整演示如下。

image-20210907185442061

(5)base64加解密代码

–C语言–

环境:win10

编译:VC++6.0

加密

#include #include #include char a[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char s[100]; int i,j; void jiami(char x,char y,char z){ s[j]=a[x>>2]; s[j+1]=a[(x4)&0x3f]; s[j+2]=a[(y6)&0x3f]; s[j+3]=a[z&0x3f]; } int main(){ int len; char str[100]; printf("base64需要加密的字符串:"); gets(str); len=strlen(str); for(i=0,j=0;i s[j]=a[str[len-1]>>2]; s[j+1]=a[str[len-1] s[j]=a4; s[j+1]=b2; s[j+2]=c str1[i]=j; len1=i+1; } for(i=0,j=0;i unsigned int v0=v[0], v1=v[1], sum=0xC6EF3720, i; //由加密轮数而算出 unsigned int delta=0x9e3779b9; unsigned int k0=k[0], k1=k[1], k2=k[2], k3=k[3]; for (i=0; i unsigned int c[2]={1347371722,925494771}; //密文,两字节一组 unsigned int k[4]={2,2,3,4};//密钥随便 一定是128位,即4个4字节数 decode(c,k); printf("%d %d\n",c[0],c[1]); return 0; } (3)TEA扩展:XTEA加密

XTEA加密和TEA加密基本类似,只是多了一点点,对比一下代码即可发现。

环境:win10

编译:VC++6.0

加密

#include /* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */ void encipher(unsigned int num_rounds, unsigned int v[2], unsigned int key[4]) { unsigned int i; unsigned int v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9; for (i=0; i unsigned int v[2]={1,2}; unsigned int k[4]={2,2,3,4}; unsigned int r=32;//num_rounds建议取值为32 // v为要加密的数据是两个32位无符号整数 // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位 printf("加密前原始数据:%u %u\n",v[0],v[1]); encipher(r, v, k); printf("加密后的数据:%u %u\n",v[0],v[1]); return 0; }

解密

#include /* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */ void decipher(unsigned int num_rounds, unsigned int v[2], unsigned int key[4]) { unsigned int i; unsigned int v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds; for (i=0; i unsigned int c[2]={1345390024,2801624574}; unsigned int k[4]={2,2,3,4}; unsigned int r=32;//num_rounds建议取值为32 // v为要加密的数据是两个32位无符号整数 // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位 printf("解密前原始数据:%u %u\n",c[0],c[1]); decipher(r, c, k); printf("解密后的数据:%u %u\n",c[0],c[1]); return 0; } 4、RC4 (1)简介

百度百科:RC4

RC4(来自 Rivest Cipher 4 的缩写)是一种流加密算法,密钥长度可变。它加解密解密使用相同的密钥,因此也属于对称加密算法。RC4 是有线等效加密(WEP)中采用的加密算法,也曾经是 TLS可采用的算法之一。

特点:

名称特点秘钥长度可变,通常小于256字节密钥流指S盒,长度256Byte,初始化为0~255序列,然后根据秘钥K搅乱明文长度任意,明文只一次异或加密 (2)加密过程

image-20210908001318799

注意看加密过程,明文就一个异或加密,

只是密钥流要当时生成,加密解密的密钥流都是一样的

完整加密过程

结合上图

image-20210908001437128

注意: 加密前,生成的密钥流s盒,加密后密钥流s盒会发生改变,所以解密时,用的密钥流s盒是初始化之后但加密前的,即上图第一步之后生成的s盒。

(3)RC4加解密代码

先初始化秘钥

image-20210908001536375

再进行加解密,(用的秘钥都是上述代码初始化出来的)

image-20210908001710735

完整加密代码

环境:win10

编译:VC++6.0

main函数有通过RC4加解密的整个过程

//程序开始 #include #include /*初始化函数*/ //参数1:传入长度256的unsigned char型数组首地址 //参数2:密钥,其内容可以随便定义:char key[256]; //参数3是密钥的长度,Len = strlen(key); void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len) { int i = 0, j = 0; char k[256] = { 0 }; unsigned char tmp = 0; for (i = 0; i j = (j + s[i] + k[i]) % 256; tmp = s[i];//交换s[i]和s[j] s[i] = s[j]; s[j] = tmp; } } /*加解密*/ //参数1:是上边rc4_init函数中,被搅乱的S-box; //参数2:是需要加密/解密的数据data; //参数3:data的长度. void rc4_crypt(unsigned char*s, unsigned char*Data, unsigned long Len) { int i = 0, j = 0, t = 0; unsigned long k = 0; unsigned char tmp; for (k = 0; k unsigned char s[256] = { 0 }, s2[256] = { 0 };//S-box char key[256] = { "justfortest" }; unsigned char pData[512] = "Hello World"; unsigned long len = strlen((char*)pData); int i; printf("pData=%s\n", pData); printf("key=%s,length=%d\n\n", key, strlen(key)); rc4_init(s, (unsigned char*)key, strlen(key));//已经完成了初始化 printf("完成对S[i]的初始化,如下:\n\n"); for (i = 0; i s2[i] = s[i]; } printf("已经初始化,现在加密:\n\n"); rc4_crypt(s, (unsigned char*)pData, len);//加密 for(i=0;pData[i];i++){ printf("0x%x,",pData[i]); } //printf("pData=%s\n\n", pData); printf("\n"); printf("已经加密,现在解密:\n\n"); //rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密钥 rc4_crypt(s2, (unsigned char*)pData, len);//解密 printf("pData=%s\n\n", pData); return 0; } //程序完 (4)RC4逆向

上述可以看出RC4算法,加密和解密是一样的流程

先初始化密钥流S盒,再通过初始化的密钥流S盒对数据进行异或加密/解密

所以逆向RC4算法:找到密钥、加密之后的数据,用来跑一边解密脚本

(5)逆向RC4算法技巧

image-20210908002309988

image-20210908002304517

通过上面两张图可以看到:

密文=明文^密钥流

所以!明文=密文^密钥流

即密钥固定时,每次加密生成的秘钥流是固定的

**解密难点:**密钥流未知

技巧:

我们可以通过选择明文攻击

即输入一串已知明文,调试获取加密之后的密文

这样就已知了明文和对应密文

所以可求:密钥流=已知明文^对应密文

然后根据原始密文

可求得:原始明文=原始密文^密钥流

(6)练习

RC4练习

链接:https://pan.baidu.com/s/1nblRiYkSFewKRyulSirUXg 提取码:ffyq

5、MD5 (1)简介

MD5 消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个 128 位(16 字节)的散列值(hash value),用于确保信息传输完整一致。

(2)特点

1、无论加密数据多大多小,都只生成长度一样的散列值(一般是128位,16字节)

2、相同的数据,随时生成的散列值都一致,但只要数据发生一点变化,生成的散列值差别巨大

3、MD5本身不可逆

(3)运用

1、密码管理,输入密码后进行md5加密然后与数据库中的md5值对比(易受到md5撞库攻击)

2、电子签名,确保数据传输过程中数据更改

(4)ctf逆向中的使用

在线md5加密网址:https://www.somd5.com/

6、总结

ctf逆向中的加密算法坑定不止上述这些,只是说通过这些简单的加密算法,学习,进阶,再难的算法都是从基础算法变换而来的,好比万丈高楼平地起!加油!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3