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的字节。例如:
倘若字符串的长度不为3的倍数时,则在该字符串二进制后添加 0 使字节数为6的倍数,然后在编码后的字符串后添加 1-2 个 = 。例如:
而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隐写解码程序
把 stego.txt 使用解密代码解开得到