openssl 中base64编解码的c语言实现

openssl 中base64编解码的c语言实现,比较简洁。理论上base64 编码后的长度会变成编码前长度的4/3倍。

#define B64_WS			0xE0
#define B64_ERROR       	0xFF
#define B64_NOT_BASE64(a)	(((a)|0x13) == 0xF3)

#define conv_bin2ascii(a)   (data_bin2ascii[(a)&0x3f])  
#define conv_ascii2bin(a)   (data_ascii2bin[(a)&0x7f])

static const unsigned char data_bin2ascii[65] =  
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  
  
static const unsigned char data_ascii2bin[128] =  
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0xFF, 0xFF,  
        0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF,  
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xF2, 0xFF, 0x3F, 0x34,  
        0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF, 0xFF, 0xFF,  
        0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  
        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13,  
        0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  
        0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,  
        0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31,  
        0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, };  
    

/* Base64 Encode */  
int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int dlen)  
{  
    int i, ret = 0;  
    unsigned long l;  
  
    for (i = dlen; i > 0; i -= 3)  
    {  
        if (i >= 3)  
        {  
            l = (((unsigned long) f[0]) << 16L) | (((unsigned long) f[1]) << 8L) | f[2];  
            *(t++) = conv_bin2ascii(l>>18L);  
            *(t++) = conv_bin2ascii(l>>12L);  
            *(t++) = conv_bin2ascii(l>> 6L);  
            *(t++) = conv_bin2ascii(l );  
        }  
        else  
        {  
            l = ((unsigned long) f[0]) << 16L;  
            if (i == 2)  
                l |= ((unsigned long) f[1] << 8L);  
  
            *(t++) = conv_bin2ascii(l>>18L);  
            *(t++) = conv_bin2ascii(l>>12L);  
            *(t++) = (i == 1) ? '=' : conv_bin2ascii(l>> 6L);  
            *(t++) = '=';  
        }  
        ret += 4;  
        f += 3;  
    }  
  
    *t = '\0';  
    return (ret);  
} 

/* Base64 Decode */
int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n)
{
	int i, ret = 0, a, b, c, d;
	unsigned long l;

	/* trim white space from the start of the line. */
	while ((conv_ascii2bin(*f) == B64_WS) && (n > 0))
	{
		f++;
		n--;
	}

	/* strip off stuff at the end of the line
	 * ascii2bin values B64_WS, B64_EOLN, B64_EOLN and B64_EOF */
	while ((n > 3) && (B64_NOT_BASE64(conv_ascii2bin(f[n-1]))))
		n--;

	if (n % 4 != 0)
		return (-1);

	for (i = 0; i < n; i += 4)
	{
		a = conv_ascii2bin(*(f++));
		b = conv_ascii2bin(*(f++));
		c = conv_ascii2bin(*(f++));
		d = conv_ascii2bin(*(f++));
		if ((a & 0x80) || (b & 0x80) || (c & 0x80) || (d & 0x80))
			return (-1);
		l = ((((unsigned long) a) << 18L) | (((unsigned long) b) << 12L)
				| (((unsigned long) c) << 6L) | (((unsigned long) d)));
		*(t++) = (unsigned char) (l >> 16L) & 0xff;
		*(t++) = (unsigned char) (l >> 8L) & 0xff;
		*(t++) = (unsigned char) (l) & 0xff;
		ret += 3;
	}
	return (ret);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言,您可以使用 OpenSSL 库来实现 Base64 解码。以下是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/bio.h> #include <openssl/evp.h> int base64_decode(const unsigned char* encoded_data, size_t encoded_length, unsigned char* decoded_data, size_t* decoded_length) { BIO *bio, *b64; size_t length = 0; // 创建 Base64 解码的 BIO b64 = BIO_new(BIO_f_base64()); bio = BIO_new_mem_buf(encoded_data, encoded_length); bio = BIO_push(b64, bio); // 解码 BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); length = BIO_read(bio, decoded_data, encoded_length); // 清理并设置解码后的长度 BIO_free_all(bio); *decoded_length = length; return 0; } int main() { const char* encoded_text = "SGVsbG8gd29ybGQh"; // 输入要解码的 Base64 编码字符串 size_t encoded_length = strlen(encoded_text); size_t decoded_length = ((encoded_length + 3) / 4) * 3; unsigned char* decoded_text = (unsigned char*)malloc(decoded_length + 1); if (decoded_text == NULL) { printf("内存分配失败!\n"); return 1; } int result = base64_decode((const unsigned char*)encoded_text, encoded_length, decoded_text, &decoded_length); if (result != 0) { printf("解码失败:%d\n", result); free(decoded_text); return 1; } decoded_text[decoded_length] = '\0'; printf("解码结果:%s\n", decoded_text); free(decoded_text); return 0; } ``` 在上述示例代码,我们使用了 OpenSSL 的 `BIO`(I/O 抽象)和 `EVP`(加密算法)来实现 Base64 解码。需要注意的是,您需要先安装 OpenSSL 库并确保编译时链接了正确的库文件。 编译和运行上述代码后,将输出解码结果:"Hello world!"。 请注意,此示例仅演示了如何使用 OpenSSL 库来进行 Base64 解码。如果您需要进行更复杂的加密/解密操作,可以参考 OpenSSL 的官方文档或其他资源获取更多信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值