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后的算法如下
Base58 加密(c实现)