Convert hex to base64
题目
https://cryptopals.com/sets/1/challenges/1
C++
#include <bits/stdc++.h>
using namespace std;
char *bin(char s[], int l, int y); //将十六进制 转换为二进制
void base(char b[], int v); //二进制转换为base64并输出
int main()
{
char a[] = {"49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d"};
int size = sizeof(a) - 1; //判断多少位十六进制数
char *m;
m = bin(a, size, 1);
base(m, 4 * size);
system("pause");
return 0;
}
char *bin(char s[], int l, int y) //将十六进制 转换为二进制
{
int e;
char aaa[100];
//将十六进制数利用ASCII分别与十进制整数对应并存储到数组中
for (e = 0; e < l; e++)
{
if (s[e] <= 'f' && s[e] >= 'a')
aaa[e] = int(s[e]) - 87;
else
aaa[e] = int(s[e]) - 48;
}
static char ss[3][1000];
//十六进制的组合从0到e(15),4个二进制数字表示十进制数字
char as[] = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1};
int x = 0, v = 0, k;
//将十进制数转换为二进制存入数组中
do
{
k = 0;
while (k < 4)
{
int c;
c = 4 * aaa[x] + k;
ss[y][v++] = as[c];
k++;
}
x++;
} while (x < l);
return ss[y];
}
void base(char b[], int v) //二进制转换为base64并输出
{
int i = 0, n = 0, q = 0;
char s[100];
//将二进制每六位一组转换成十进制数
while (1)
{
n = 2 * n + b[i++];
if (i % 6 == 0 || i == v)
{
s[q++] = n;
n = 0;
if (i == v)
break;
}
}
printf("十六进制数转换成base64为:\n");
//将十进制数利用ASCII分别与base64的字符对应,然后输出
for (i = 0; i < q; i++)
{
if (s[i] <= 25 && s[i] >= 0)
printf("%c", s[i] + 65);
else if (s[i] >= 26 && s[i] <= 51)
printf("%c", s[i] + 71);
else if (s[i] >= 52 && s[i] <= 61)
printf("%c", s[i] - 4);
else if (s[i] == 62)
printf("%c", s[i] - 19);
else
printf("%c", s[i] - 16);
}
printf("\n");
}
Python——调用base64工具包
import base64
msg = '49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d'
s = bytes.fromhex(msg) # 将hex的数据转换为str,并以Byte 形式存储
ans = base64.b64encode(s) # base64编码后的形式
print(ans)