RC4加/解密算法c++

1. RC4算法介绍

1)密钥长度为1~256B,安全起见密钥长度至少8B3

2)密钥调度算法:

for(i=0,j=0;i<256;i++){  //初始化状态表S,临时表T

S[i]=i;  T[i]=K[i mod L];   //密钥长度L(B)

}

for(i=0,j=0;i<256;i++){   //利用T表对S表进行初始置换

j=(j+S[i]+T[i]) mod 256;

S[i]óS[j];  //位置交换

}

3)伪随机序列生成算法:

i=0, j=0;

for(k=0;k<Len(m);k++){  //Len(m)代表明文长度(B)

i = (i + 1) mod 256;

j = (j + S[i]) mod 256;

S[i]óS[j];  //位置交换

t = (S[i] + S[j]) mod 256;

z = S[t];   //z为第k个密钥流元素

}

4)加密:ci = mi ⊕ zi (i = 0, 1, 2, ···)

5)解密: mi = ci ⊕ zi (i = 0, 1, 2, ···)    ps:^= 为异或运算

下面为一段实现字符串加/解密代码:

#include <iostream>
#include <string>
using namespace std;
class RC4 {
private:
	unsigned char s[256];
	void swap(unsigned char& a, unsigned char& b)  //交换函数
	{
		unsigned char tmp = a;
		a = b;
		b = tmp;
	}
	void init_s(string key)
	{
		for (unsigned int i = 0; i < 256; i++)	//初始化s表
			s[i] = i;
		unsigned char T[256] = { 0 };           
		unsigned keylen = key.length();             //密钥长度
		for (int i = 0; i < 256; i++)
			T[i] = key[i % keylen];				//根据密钥初始化t表
		for (int j = 0, i = 0; i < 256; i++)    //利用T表对S表进行初始化置换
		{
			j = (j + s[i] + T[i]) % 256;		//打乱s表(制造密文)  
			swap(s[i], s[j]);                  //位置交换
		} 
	}
public:
	void jia_mi(string& data, string key) {
		init_s(key);
		unsigned int datalen = data.length();
		unsigned char k, i = 0, j = 0, t;
		for (unsigned int h = 0; h < datalen; h++) //datelen代表明文长度(B)
		{
			i = (i + 1) % 256;
			j = (j + s[i]) % 256;
			swap(s[i], s[j]);
			t = (s[i] + s[j]) % 256;
			k = s[t];
			data[h] ^= k;     //将第K个密钥流元素按位异或赋值给date[h]
		}

	}
	void jie_mi(string& data, string key) {

		init_s(key);
		unsigned int datalen = data.length();
		unsigned char k, i = 0, j = 0, t;
		for (unsigned int h = 0; h < datalen; h++) //datelen代表明文长度(B)
		{
			i = (i + 1) % 256;
			j = (j + s[i]) % 256;
			swap(s[i], s[j]);
			t = (s[i] + s[j]) % 256;
			k = s[t];
			data[h] ^= k;     //将第K个密钥流元素按位异或赋值给date[h]
		}

	}
};

int main()
{
	RC4 rc4;                              //创建rc4对象
	string data, key,key1;                    //创建date,key变量
	cout << "请输入需要加密的明文:" << endl;
	cin >> data;
	cout << "请输入密钥key:" << endl;
	cin >> key;
	rc4.jia_mi(data, key);              //调用加密函数对明文进行加密
	cout << "加密后的内容是:\n" << data << endl;
	cout << "请输入密钥key:" << endl;
	cin >> key1;
	if (key1 == key)
	{
		rc4.jie_mi(data, key);               //调用解密函数对密文进行解密 
		cout << "解密后的内容是:\n" << data << endl;
	}
	else {
		cout << "密钥错误" << endl;
	}
	return 0;
}

 

 

因为加密解密过程是一样的 故此 可以用同一个函数 调用两次就完成了加/解密过程,本代码为了方便理解将两部分分开写。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CSVN.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值