杨记

碎片化学习令人焦虑,系统化学习使人进步

0%

base64

使用C++实现base64伪加密

base64

编码原理

将其它编码转化为如下编码

Value Char Value Char Value Char Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

步骤

  1. 将所有字符转化为ASCII码
  2. 将ASCII码转化为8位二进制
  3. 每3位ASCII码(即24位二进制)为一组,最后一组若不足24位,则补0补齐
  4. 重新分组,每6位二进制为一个字符,对应上表的字符($2^6-1=63$)
  5. 最后一组若有字符的值为0,且其6位二进制都是补0补足的,则其所对应的字符为=而不是A

示例:(有一定的规律)

  • 输入:a
  • 转化为二进制: 01100001 (8位)
  • 补0: 01100001 00000000 00000000 补了16个0
  • 分组: 011000 010000 000000 000000 (后两个字符不是AA,是==,0全部是补足的)
  • 对应的base64编码: YQ==
  • 输入:abc
  • 二进制: 01100001 01100010 01100011
  • 不需要补0
  • 分组: 011000 010110 001001 100011
  • 对应base64编码:YWJj
  • 输入:abcde
  • 二进制: 01100001 01100010 01100011 01100100 01100101
  • 补0: 01100001 01100010 01100011 01100100 01100101 00000000 补了8个0
  • 分组: 011000 010110 001001 100011 011001 000110 010100 000000 最后一个分组的0都是补足的
  • 对应base64编码:YWJjZGU=

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//base64.cpp
#include <iostream>
#include <string>
#include <bitset>
#include <unordered_map>
using namespace std;

string to_base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

//输入字符串 并转化为 二进制序列 存入字符串bits
void strToBits(string &bits)
{
string str;
cin>>str;
for(char c : str)
{
bitset<8> bs(c);
bits += bs.to_string();
}
}

//6位一组进行分组,转化为base64编码
void group(string &bits, string &encryptStr)
{
//若bits长度不是6的倍速,补0
int sur = bits.size() % 6;
if(sur != 0)
{
bits += string(6 - sur, '0');
}
//将bits中的二进制每6位一个字符转化位base64编码字符,存入字符串encryptStr中
int pos = 6;
while(pos <= bits.size())
{
bitset<6> bs(bits.substr(pos - 6, pos));
int temp = bs.to_ulong();
encryptStr += to_base64[temp];
pos += 6;
}
//若得到的encryptStr不是4的倍数,补=
sur = encryptStr.size() % 4;
if(sur != 0)
{
encryptStr += string(4 - sur, '=');
}
}

int main() {
string bits;
strToBits(bits);
string encryptStr;
group(bits, encryptStr);
cout<<encryptStr<<endl;
return 0;
}

在linux上使用g++编译链接

1
2
3
4
5
6
7
8
9
10
11
yang@Ubuntu18:~$ g++ -o base64 base64.cpp
yang@Ubuntu18:~$ ./base64
yang
eWFuZw==
yang@Ubuntu18:~$

# 试了一下,中文也行
yang@Ubuntu18:~$ ./base64
我的世界你不懂
5oiR55qE5LiW55WM5L2g5LiN5oeC
yang@Ubuntu18:~$

欢迎关注我的其它发布渠道