Base32系列编码 代码实现过程

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Base32系列编码 代码实现过程

Base16

C++实现加解密过程

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
const char base16_table[] = "0123456789abcdef";
// Base16 编码
string base16_encode(const string& input) {
    string output;
    for (unsigned char c : input) {
        output += base16_table[c >> 4];
        output += base16_table[c & 0x0F];
    }
    return output;
}
// Base16 解码
string base16_decode(const string& input) {
    string output;
    for (int i = 0; i < input.length(); i += 2) {
        unsigned char c1 = input[i];
        unsigned char c2 = input[i + 1];
        if (isxdigit(c1) && isxdigit(c2)) {
            output += ((strchr(base16_table, c1) - base16_table) << 4) | (strchr(base16_table, c2) - base16_table);
        } else {
            break;
        }
    }
    return output;
}
int main() {
    string input = "Hello, world!";
    string encoded = base16_encode(input);
    string decoded = base16_decode(encoded);
    cout << "Input: " << input << endl;
    cout << "Encoded: " << encoded << endl;
    cout << "Decoded: " << decoded << endl;
    return 0;
}

Base32

C++实现加密过程

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
string base32padding(string input) {
    int len = input.length();
    int padding_len = 8 - len % 8;
    if (padding_len == 8) {
        return input;
    }
    input.append(padding_len, '=');
    return input;
}
string base32encry(string input) {
    int len = 0, str_len = 0;
    char *encry;
    char *table32 = "Z2CDEFGHIJKLMNOPQRSTUVWXY76543AB";
    len = input.length(); //获取输入长度 
    if (len % 5 == 0)
        str_len = len / 5 * 8;
    else
        str_len = ((len / 5) + 1) * 8;
    encry = new char[str_len + 1];
    for (int i = 0, j = 0; i < len; i += 5, j += 8) {
        encry[j] = table32[input[i] >> 3];
        encry[j + 1] = table32[((input[i] & 0x7) << 2) | ((input[i + 1]) >> 6)];
        encry[j + 2] = table32[(input[i + 1] >> 1) & 0x1f];
        encry[j + 3] = table32[((input[i + 1] & 0x1) << 4) | ((input[i + 2]) >> 4)];
        encry[j + 4] = table32[((input[i + 2] & 0xf) << 1) | ((input[i + 3]) >> 7)];
        encry[j + 5] = table32[(input[i + 3] >> 2) & 0x1f];
        encry[j + 6] = table32[((input[i + 3] & 0x3) << 3) | ((input[i + 4]) >> 5)];
        encry[j + 7] = table32[input[i + 4] & 0x1f];
    }
    switch (len % 5) {
    case 1:
        encry[str_len - 1] = '\0';
        encry[str_len - 2] = '\0';
        encry[str_len - 3] = '\0';
        encry[str_len - 4] = '\0';
        encry[str_len - 5] = '\0';
        encry[str_len - 6] = '\0';
        break;
    case 2:
        encry[str_len - 1] = '\0';
        encry[str_len - 2] = '\0';
        encry[str_len - 3] = '\0';
        encry[str_len - 4] = '\0';
        break;
    case 3:
        encry[str_len - 1] = '\0';
        encry[str_len - 2] = '\0';
        encry[str_len - 3] = '\0';
        break;
    case 4:
        encry[str_len - 1] = '\0';
        break;
    }
    encry[str_len] = '\0';
    string result(encry);
    result=base32padding(result);
    delete[] encry;
    return result;
}

Python实现过程

import base64
# 自定义 base32 编码表
base32_table = b"JKLMNEFGHIXY7654OPQRSTUVWZ2CD3AB"
# 加密函数,使用自定义编码表
def encode_base32(text):
    return base64.b32encode(bytes(text, 'utf-8')).translate(bytes.maketrans(b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", base32_table)).decode('utf-8')
# 解密函数,使用自定义编码表
def decode_base32(text):
    return base64.b32decode(bytes(text.translate(bytes.maketrans(base32_table, b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567")), 'utf-8')).decode('utf-8')
# 测试加密和解密函数
text = "Hello Base32"
encrypted_text = encode_base32(text)
print("加密后的字符串:", encrypted_text)
decrypted_text = decode_base32(encrypted_text)
print("解密后的字符串:", decrypted_text)

Base58

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
const string base58_table = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
// Base58 编码
string base58_encode(const vector<unsigned char>& data) {
    // 计算编码后的长度
    int zeros = 0;
    while (zeros < data.size() && data[zeros] == 0) {
        zeros++;
    }
    int size = (data.size() - zeros) * 138 / 100 + 1;
    vector<unsigned char> result(size, 0);
    // 从低位到高位计算编码值
    for (int i = zeros; i < data.size(); i++) {
        int carry = data[i];
        for (int j = size - 1; j >= 0; j--) {
            carry += 256 * result[j];
            result[j] = carry % 58;
            carry /= 58;
        }
    }
    // 将编码值转换为 Base58 编码字符串
    int j = 0;
    while (j < result.size() && result[j] == 0) {
        j++;
    }
    string output;
    output.reserve(zeros + result.size() - j);
    output.assign(zeros, '1');
    for (int i = j; i < result.size(); i++) {
        output += base58_table[result[i]];
    }
    return output;
}
// Base58 解码
vector<unsigned char> base58_decode(const string& data) {
    // 计算解码后的长度
    int zeros = 0;
    while (zeros < data.length() && data[zeros] == '1') {
        zeros++;
    }
    int size = (data.length() - zeros) * 733 / 1000 + 1;
    vector<unsigned char> result(size, 0);
    // 从低位到高位计算解码值
    for (int i = zeros; i < data.length(); i++) {
        char c = data[i];
        if (c < '1' || c > '9') {
            break;
        }
        int carry = base58_table.find(c);
        for (int j = size - 1; j >= 0; j--) {
            carry += 58 * result[j];
            result[j] = carry % 256;
            carry /= 256;
        }
    }
    return vector<unsigned char>(result.begin(), result.end());
}
int main() {
    string input = "Hello, world!";
    vector<unsigned char> data(input.begin(), input.end());
    string encoded = base58_encode(data);
    vector<unsigned char> decoded = base58_decode(encoded);
    string output(decoded.begin(), decoded.end());
    cout << "Input: " << input << endl;
    cout << "Encoded: " << encoded << endl;
    cout << "Decoded: " << output << endl;
    return 0;
}

Base64

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
const string base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// Base64 编码
string base64_encode(const vector<unsigned char>& data) {
    string output;
    int i = 0;
    int j = 0;
    int b = 0;
    for (i = 0; i < data.size(); i++) {
        b |= data[i] << (16 - 8 * j);
        j++;
        if (j == 3) {
            output += base64_table[(b >> 18) & 0x3F];
            output += base64_table[(b >> 12) & 0x3F];
            output += base64_table[(b >> 6) & 0x3F];
            output += base64_table[b & 0x3F];
            j = 0;
            b = 0;
        }
    }
    if (j == 1) {
        output += base64_table[(b >> 2) & 0x3F];
        output += base64_table[(b << 4) & 0x3F];
        output += "==";
    } else if (j == 2) {
        output += base64_table[(b >> 10) & 0x3F];
        output += base64_table[(b >> 4) & 0x3F];
        output += base64_table[(b << 2) & 0x3F];
        output += "=";
    }
    return output;
}
// Base64 解码
vector<unsigned char> base64_decode(const string& data) {
    vector<unsigned char> output;
    int i = 0;
    int j = 0;
    int b = 0;
    for (i = 0; i < data.length(); i++) {
        char c = data[i];
        if (c == '=') {
            break;
        }
        int index = base64_table.find(c);
        if (index == string::npos) {
            break;
        }
        b |= index << (18 - 6 * j);
        j++;
        if (j == 4) {
            output.push_back((b >> 16) & 0xFF);
            output.push_back((b >> 8) & 0xFF);
            output.push_back(b & 0xFF);
            j = 0;
            b = 0;
        }
    }
    if (j == 2) {
        output.push_back((b >> 10) & 0xFF);
    } else if (j == 3) {
        output.push_back((b >> 16) & 0xFF);
        output.push_back((b >> 8) & 0xFF);
    }
    return output;
}
int main() {
    string input = "Hello, world!";
    vector<unsigned char> data(input.begin(), input.end());
    string encoded = base64_encode(data);
    vector<unsigned char> decoded = base64_decode(encoded);
    string output(decoded.begin(), decoded.end());
    cout << "Input: " << input << endl;
    cout << "Encoded: " << encoded << endl;
    cout << "Decoded: " << output << endl;
    return 0;
}
相关文章
|
6月前
|
存储 前端开发 数据安全/隐私保护
Base64详解:从编码原理到应用实践
Base64详解:从编码原理到应用实践
|
7月前
|
存储 安全 数据安全/隐私保护
Base64编码的优缺点
Base64 是一种常用于将二进制数据编码为 ASCII 字符串的编码方法。下面是 Base64 编码的一些优点和缺点: ### 优点: 1. **可读性**:Base64 编码后的数据是纯文本形式的,这使得它可以轻松地在各种文本传输协议和环境中传输,而不会被误解或破坏。 2. **平台无关性**:Base64 编码是基于 ASCII 字符集的,这使得它在几乎所有的操作系统和编程语言中都是可用的。 3. **数据完整性**:Base64 可以确保数据的完整性,因为它是基于 ASCII 字符进行传输的,不会受到二进制数据在不同系统中解释方式的影响。 4. **简单易用**:许多编程语言
271 0
|
Java API 索引
一文读懂Base64编码
一文读懂Base64编码
112 0
|
数据采集 算法 安全
Base64 编码原理 && 实现
Base64 编码原理 && 实现
105 0
C#使用base64对字符串进行编码和解码的测试
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
C#使用base64对字符串进行编码和解码的测试
|
Java
小程序中base64解码/编码
很多人都在为小程序如何实现base64编码/解码困扰,于是我参考前端大佬们对JavaScript中实现base64的文章进行了改写。简单实现了一个。。希望能帮助到小程序开发一线的大家吧、 不多说直接上代码: /** * UTF16和UTF8转换对照表 * U+00000000 – U+000000...
4917 13
|
XML 存储 算法
为啥要 base64 编码?
为啥要 base64 编码?
283 0
为啥要 base64 编码?
|
编解码 Go 区块链
Go语言实现Base64、Base58编码与解码
目录 1. 常见的编码 2. go语言实现base64的编码与解码 2.1 Base64编码原理 2.2 实现Base64的编码与解码 3. go语言实现base58编码与解码 3.1 base58的编码过程 3.2 base58编解码具体实现 4. 最后
405 0
Go语言实现Base64、Base58编码与解码
|
算法 区块链 索引
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)
449 0
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)
|
存储 编解码 Java
一篇文章彻底弄懂Base64编码
一篇文章彻底弄懂Base64编码
735 0
一篇文章彻底弄懂Base64编码