c语言RC4加密返回base64编码,base64加密原理以及C语言实现 | 赤道企鹅的博客

按照二进制学习的路线,了解二进制程序常用的加密方式以及对应的汇编、伪代码特征是很必要的。我在CSDN上看了很多篇方法都不一样,而且很冗长,于是打算自己用C实现一下。

0x00 base64的原理

编码方式

计算机储存数据以字节为单位,一个位有八个字节,比如“abc”字符串,这是底层的数据结构

a b c

01100001 01100010 01100011

三个字符对应3×8=24个位,同时24可以看成6×4的积,故把三个字节组合后,以六个字节为一组分割可以分割出4组,但是为了符合计算机的储存结构,每组空出来的两个高位要补上0。

00011000 00010110 00001001 00100011

同时,新的四个字节每个可以表示一个整数,如果将这些整数映射到一张特定的码表上,便会得到一个新的字符串。例如这是标准base64的码表:

3e5dff146cdd84f68fea7fed6133c4d0.png由于base64有效位只有6位,意味着最大可以表示64个元素,故码表为0至63

那么刚刚新的四个字节就被表示成了:

Y(24) W(22) J(9) Z(25)

于是一串base64码就出来了:abc->YWJj

假如加密内容长度不是3的倍数怎么办?

我们可以通过补全字节的方法用0补全字节数到3的倍数,然后在base64码后用‘=’表明补全字节的数量。例如“abcd”字符串:

a b c d

01100001 01100010 01100011 01100100

00011000(Y) 00010110(W) 00001001(J) 00100011(j) 00011001(Z) 00000000(A) 00000000(A) 00000000(A)

//最后两个A要替换为=,因为转换后具有有效信息的只是前6个字节

得到base64码YWJjZA==

代码实现

利用3变4,不够3补为3的逻辑,我们可以利用C语言以三个字节为一组利用位运算符进行base64转换(个人认为三个字节一组循环处理是最高效的)

这是编码部分的C程序,标明了一些细节:

void base64_encode(char *src,char *result){

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Linux C语言实现Base64加密的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> static const char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char *base64_encode(const unsigned char *data, size_t input_length, size_t *output_length) { *output_length = 4 * ((input_length + 2) / 3); char *encoded_data = malloc(*output_length + 1); if (encoded_data == NULL) return NULL; for (size_t i = 0, j = 0; i < input_length;) { uint32_t octet_a = i < input_length ? (unsigned char)data[i++] : 0; uint32_t octet_b = i < input_length ? (unsigned char)data[i++] : 0; uint32_t octet_c = i < input_length ? (unsigned char)data[i++] : 0; uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; encoded_data[j++] = base64_chars[(triple >> 3 * 6) & 0x3F]; encoded_data[j++] = base64_chars[(triple >> 2 * 6) & 0x3F]; encoded_data[j++] = base64_chars[(triple >> 1 * 6) & 0x3F]; encoded_data[j++] = base64_chars[(triple >> 0 * 6) & 0x3F]; } for (size_t i = 0; i < (*output_length % 4); i++) { encoded_data[*output_length - 1 - i] = '='; } return encoded_data; } int main(int argc, char *argv[]) { const char *input_str = "hello, world!"; size_t input_len = strlen(input_str); size_t output_len = 0; char *encoded_str = base64_encode((const unsigned char *)input_str, input_len, &output_len); printf("Encoded string: %s\n", encoded_str); free(encoded_str); return 0; } ``` 这个示例代码使用了一个包含64个字符的字符表(base64_chars),以及一个base64_encode函数,该函数将输入的数据编码Base64格式,并返回编码后的字符串。在main函数中,我们首先声明一个字符串,然后计算它的长度,并将其传递给base64_encode函数。该函数将返回一个指向编码后的字符串的指针,我们可以将其打印出来。最后,我们释放了分配给编码字符串的内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值