ios+android+rc4加密,密码学基础之RC4加密

RC4是比较容易理解的对称加密算法,又叫ARC4算法。

原理

初始化秘钥:根据输入的秘钥key,使用密钥调度算法(KSA)生成一个256字节的sbox。

再通过伪随机数生成算法(PRGA)得到密钥流(keystream)

加密:密钥流与明文进行异或运算得到密文

解密:秘文与密钥流进行异或运算得到明文

你只需要知道异或运算加密的原理就能理解RC4算法。

实现

RC4非常好实现,不用费心的去找库,按照[维基百科RC4](https://en.wikipedia.org/wiki/RC4)实现即可。

本实现只是为了演示RC4的加密过程,加解密都要使用两个函数,不太方便,实际应用是可封装成一个函数。

下面是实现和测试

#include

#include

#include

void swap(unsigned char *a, unsigned char *b) {

unsigned char t = *a;

*a = *b;

*b = t;

}

void rc4KSA(unsigned char *s, const unsigned char *key, int len) {

for (int i = 0; i < 256; i++) s[i] = i;

int j = 0;

for (int i = 0; i < 256; i++ ) {

j = (j + s[i] + *(key + i % len)) % 256;

swap(s + i, s + j);

}

}

void rc4PRGA(unsigned char *s, char *data, size_t len) {

int i = 0;

int j = 0;

for ( size_t idx = 0; idx < len; idx++ ) {

i = (i + 1) % 256;

j = (j + s[i]) % 256;

swap(s + i, s + j);

unsigned char k = s[(s[i] + s[j]) % 256];

data[idx] ^= k; // k是伪随机数,和明文进行XOR进行加密

}

}

int main(int argc, const char * argv[]) {

unsigned char s[256]; // S-box

unsigned char key[128]; // key的长度1到256字节,本例子使用128字节

arc4random_buf((unsigned char *)key, sizeof(key)); // 用伪随机数算法生成key

char data[1000] = "这里是要机密的数据";

// 加密

rc4KSA(s, key, sizeof(key));

rc4PRGA(s, data, strlen(data));

// 解密

rc4KSA(s, key, sizeof(key));

rc4PRGA(s, data, strlen(data));

return 0;

}

你留意到了随机生成key的arc4random_buf函数的名字了么?还有你平时使用的更多的arc4random。它们前面的4个字母arc4,表示这是基于RC4算法生成的(本文第一句话就说了,ARC4是RC4的另一个名字)。它们的实现和本文代码rc4PRGA类似,不过,arc4random系列函数比较新的实现可能不再是RC4算法,但名称仍保持不变。

注意:arc4random系列函数并不一定是安全的伪随机数,就是说上面的代码arc4random_buf((unsigned char *)key, sizeof(key));并不一定安全。伪随机数的更多内容请参考密码学基础之伪随机数

相关文章

参考资料

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值