Base64 原理 及 Base64 隐写

Base64由 a-z 、A-Z 、+ 、/ 、=组成,= 为填充字符。

索引 对应字符 索引 对应字符 索引 对应字符 索引 对应字符
0 A   17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N

30

e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y

Base64把三个8bit的字节转换成四个6bit的字节。例如:

Base64 原理 及 Base64 隐写

 倘若字符串的长度不为3的倍数时,则在该字符串二进制后添加 0 使字节数为6的倍数,然后在编码后的字符串后添加 1-2 个 = 。例如:

Base64 原理 及 Base64 隐写

而Base64隐写就是利用红框中的这几位

Base64 原理 及 Base64 隐写

因此使用 "QnZibVY= " 或是 "QnZibVa=" 解密均为 "BvbmV"

解密代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10000
int main()
{
	int n,m,p=0,k,t,c[MAX];
	char a[MAX],b[100]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	freopen("d:\\stego.txt","r",stdin);
	while (scanf("%s%*c",a) !=EOF )
	{
		m=strlen(a);
		if (a[m-1]!='=')
			continue;
		if (a[m-2]=='=')
		{
			for (n=0;n<64;n++)
				if (b[n]==a[m-3])
					break;
			k=32;
			while (k!=0)
			{
				if (k<=n)
				{
					n-=k;
					if (k<16)
						c[p++]=1;
					k/=2;
					continue;
				}
				if (k<16)
					c[p++]=0;
				k/=2;
			}
		}
		else
		{
			for (n=0;n<64;n++)
				if (b[n]==a[m-2])
					break;
			k=32;
			while (k!=0)
			{
				if (k<=n)
				{
					n-=k;
					if (k<4)
						c[p++]=1;
					k/=2;
					continue;
				}
				if (k<4)
					c[p++]=0;
				k/=2;
			}
		}
		memset(a,0,sizeof(a));
	}
	for (n=0;n<p;n+=8)
	{
		for (m=0,t=128,k=0;m<8;m++)
		{
			if (c[n+m]==1)
				k+=t;
			t/=2;
		}
		printf("%c",k);
	}
	return 0;
}

以攻防世界 MISC 中 新手练习区 base64stego 为例:

首先得到一个伪加密的压缩包,使用WinRAR 工具选项卡中 修复文件解开伪加密得到 stego.txt 文件 stego.txt 文件打开后均为base64

Base64 原理 及 Base64 隐写

解密后发现为base64隐写的介绍 使用base64隐写解码程序

Base64 原理 及 Base64 隐写

 把 stego.txt 使用解密代码解开得到

 Base64 原理 及 Base64 隐写

上一篇:【npm】 npm install 原理分析


下一篇:2020web_eeasyweb