Base64加密解密C语言实现

void encodeBase64(char* str,int len,char** in){
	char base64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	//读取3个字节zxc,转换为二进制01111010 01111000 01100011
    //转换为4个6位字节,011110 100111 100001 100011
    //不足8位在前补0,变成00011110 00100111 00100001 00100011
    //若剩余的字节数不足以构成4个字节,补等号
	int encodeStrLen = 1 + (len/3)*4 ,k=0;
	encodeStrLen += len%3 ? 4 : 0;
    char* encodeStr = (char*)(malloc(sizeof(char)*encodeStrLen));
    for(int i=0;i<len;i++){
    	if(len - i >= 3){
            encodeStr[k++] = base64[(unsigned char)str[i]>>2];
    		encodeStr[k++] = base64[((unsigned char)str[i]&0x03)<<4 | (unsigned char)str[++i]>>4];
    		encodeStr[k++] = base64[((unsigned char)str[i]&0x0f)<<2 | (unsigned char)str[++i]>>6];
            encodeStr[k++] = base64[(unsigned char)str[i]&0x3f];
    	}else if(len-i == 2){
            encodeStr[k++] = base64[(unsigned char)str[i] >> 2];
            encodeStr[k++] = base64[((unsigned char)str[i]&0x03) << 4 | ((unsigned char)str[++i] >> 4)];
            encodeStr[k++] = base64[((unsigned char)str[i]&0x0f) << 2];
            encodeStr[k++] = '=';
    	}else{
    		encodeStr[k++] = base64[(unsigned char)str[i] >> 2];
            encodeStr[k++] = base64[((unsigned char)str[i] & 0x03) << 4];                                                                                                              //末尾补两个等于号
            encodeStr[k++] = '=';
            encodeStr[k++] = '=';
    	}
    }
    encodeStr[k] = '\0';
    *in = encodeStr;
}

/**
* 解码既编码的逆过程,先找出编码后的字符在编码之前代表的数字
* 编码中将3位个字符变成4个字符,得到这4个字符的每个字符代表的原本数字
* 因为在编码中间每个字符用base64码表进行了替换,所以这里要先换回来
* 在对换回来的数字进行位运算使其还原成3个字符
*/
void decodeBase64(char* str,int len,char** in){
	char base64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    char ascill[129];
    int k = 0;
    for(int i=0;i<64;i++){
        ascill[base64[i]] = k++;
    }
	int decodeStrlen = len / 4 * 3 + 1;
	char* decodeStr = (char*)malloc(sizeof(char)*decodeStrlen);
	k = 0;
	for(int i=0;i<len;i++){
        decodeStr[k++] = (ascill[str[i]] << 2) | (ascill[str[++i]] >> 4);
		if(str[i+1] == '='){
			break;
		}
        decodeStr[k++] = (ascill[str[i]] << 4) |  (ascill[str[++i]] >> 2);
		if(str[i+1] == '='){
			break;
		}
        decodeStr[k++] = (ascill[str[i]] << 6) | (ascill[str[++i]]);
	}
	decodeStr[k] = '\0';
	*in = decodeStr;
}
在 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、付费专栏及课程。

余额充值