Base58 加密(c实现)
base58加密与其他base系列不同的是:
base64是每6bit位一个映射
base32是每5bit位一个映射
base16是每bit4位一个映射
而base58不是根据bit位而来 而是直接模58而映射的
其算法很简单 就是将字符流转成256进制的一个超大数 然后不断的模58
最后得到的结果逆序即是结果
例如字符串 “abc”
组合成256进制即为 256 * (256 * ord(‘a’) + b) + c
即 abc的十六进制分别为0x61 0x62 0x63 每次移八位 然后拼合
即最后得到的大整数为0x616263
代码如下:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
char plainText[] = "abcdefg";
int i;
long long sum = 0;
int len = strlen(plainText) *138/100 + 1;// len * log(2)256 / log(2)(58) + 1
char base58Table[59] = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
char *encryption = (char *)malloc(len * sizeof(char));
int index = 0;
memset(encryption,0,len * sizeof(char));
//方法一
// for(i = 0; i < strlen(plainText); i++) {//可以首先获取累加和 但是这样做的风险就是 随着幂的增加 和会急速暴增
// sum += plainText[i] * pow(256,strlen(plainText)-i-1);
// }
//
// cout << sum << endl;
// for(i = len - 1; i >= 0; i--) {
// encryption[i] = base58Table[sum % 58];
// sum /= 58;
// if(0 == sum )
// break;
// }
//方法二 每次都模 这样就不会存在和超出最大范围
while(index < strlen(plainText) ) {
int each = plainText[index];
for(i = len-1; ;i--) {
each += encryption[i] * 256;
encryption[i] = each % 58;
each /= 58;
if(0 == each)
break;
}
i = 0;//输出
while(!encryption[i])
i++;
for(;i <= len-1; i++) {
printf("%d ",encryption[i]);
}
cout << endl;
index++;
}
i = 0;
while(!encryption[i])
i++;
for(;i <= len-1; i++) {
cout << base58Table[encryption[i]];
}
return 0;
}
最近的一次2019西湖论剑比赛的Testre就是利用此算法 当时不会看了好久猜到了可能时base58,ida F5后的算法如下