RC4加密解密算法原理与完整源代码实例演示

RC4加密算法

RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。RC4起初是用于保护商业机密的。但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了。RC4也被叫做ARC4(Alleged RC4——所谓的RC4),因为RSA从来就没有正式发布过这个算法。

原理

RC4算法的原理很简单,包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。假设S-box的长度为256,密钥长度为Len。先来看看算法的初始化部分(用C代码表示):

其中,参数1是一个256长度的char型数组,定义为: unsigned char sBox[256];

参数2是密钥,其内容可以随便定义:char key[256];

参数3是密钥的长度,Len = strlen(key);

void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len)

{

int i =0, j = 0, k[256] = {0};

unsigned char tmp = 0;

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

{

s[i]=i;

k[i]=key[i%Len];

}

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

{

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

tmp = s[i];

s[i] = s[j];     //交换s[i]和s[j]

s[j] = tmp;

}

}

在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将S-box和明文进行xor运算,得到密文,解密过程也完全相同。

再来看看算法的加密部分(用C代码表示):

其中,参数1是上边rc4_init函数中,被搅乱的S-box;

参数2是需要加密的数据data;

参数3是data的长度.

void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len)

{

int x = 0, y = 0, t = 0, i = 0;

unsigned char tmp;

for(i=0;i<Len;i++)

{

x=(x+1)%256;

y=(y+s[x])%256;

tmp = s[x];

s[x] = s[y];     //交换s[x]和s[y]

s[y] = tmp;

t=(s[x]+s[y])%256;

Data[i] ^= s[t];

}

}

最后,在main函数中,调用顺序如下:

void main()

{

unsigned char s[256] = {0};//S-box

char key[256] = {"just for test"};

char pData[512] = "这是一个用来加密的数据Data";

ULONG len = strlen(pData);

printf("pData = %s\n",pData);

printf("key = %s, length = %d\n",key,strlen(key));

rc4_init(s,(unsigned char *)key,strlen(key));//初始化

rc4_crypt(s,(unsigned char *)pData,len);//加密

printf("pData = %s\n\n",pData);

rc4_crypt(s,(unsigned char *)pData,len);//解密

printf("pData = %s\n\n",pData);

}

因此最终的完整程序是:

//程序开始

#include<stdio.h>

#include<string.h>

typedef unsigned long ULONG;

void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len) //初始化函数

{

int i =0, j = 0;

char k[256] = {0};

unsigned char tmp = 0;

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

{

s[i]=i;

k[i]=key[i%Len];

}

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

{

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

tmp = s[i];

s[i] = s[j]; //交换s[i]和s[j]

s[j] = tmp;

}

}

void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len) //加解密

{

int i = 0, j = 0, t = 0;

unsigned long k = 0;

unsigned char tmp;

for(k=0;k<Len;k++)

{

i=(i+1)%256;

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

tmp = s[i];

s[i] = s[j]; //交换s[x]和s[y]

s[j] = tmp;

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

Data[k] ^= s[t];

}

}

void main()

{

unsigned char s[256] = {0},s2[256] = {0};    //S-box

char key[256] = {"just for test"};

char pData[512] = "这是一个用来加密的数据Data";

ULONG len = strlen(pData);

printf("pData = %s\n",pData);

printf("key = %s, length = %d\n\n",key,strlen(key));

rc4_init(s,(unsigned char *)key,strlen(key));   //已经完成了初始化

printf("完成对S[i]的初始化,如下:\n\n");

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

{

printf("%-3d ",s[i]);

}

printf("\n\n");

for(i=0;i<256;i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!

{

s2[i]=s[i];

}

printf("已经初始化,现在加密:\n\n");

rc4_crypt(s,(unsigned char *)pData,len);//加密

printf("pData = %s\n\n",pData);

printf("已经加密,现在解密:\n\n");

rc4_init(s,(unsigned char *)key, strlen(key));   //初始化密钥

rc4_crypt(s2,(unsigned char *)pData,len);//解密

printf("pData = %s\n\n",pData);

}

//程序完

漏洞

由于RC4算法加密是采用的xor,所以,一旦子密钥序列出现了重复,密文就有可能被破解。关于如何破解xor加密,请参看Bruce Schneier的Applied Cryptography一书的1.4节Simple XOR,在此我就不细说了。那么,RC4算法生成的子密钥序列是否会出现重复呢?由于存在部分弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,如果是部分重复,则可能在不到10万字节内就能发生重复,因此,推荐在使用RC4算法时,必须对加密密钥进行测试,判断其是否为弱密钥。其不足主要体现于,在无线网络中IV(初始化向量)不变性漏洞。

而且,根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,大家可以放心使用!

时间: 2024-11-15 08:00:56

RC4加密解密算法原理与完整源代码实例演示的相关文章

RC4加密解密算法

RC4相对是速度快.安全性高的加密算法.在实际应用中,我们可以对安全系数要求高的文本进行多重加密,这样破解就有一定困难了.如下测试给出了先用RC4加密,然后再次用BASE64编码,这样双重锁定,保证数据信息安全(个人见解,不周之处请谅解!). package com.bao.tools.encryption; import java.io.Console;import java.io.IOException;import java.util.Scanner; import org.junit.T

java加密解密算法位运算

一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算会把加密后的字符串还原为原有字符串的值.效果图如下: 二.实现过程 1 package com.itxxz; 2 3 import java.util.Scanner; 4 5 /** 6 * java加密解密算法 7 * 8 * @author 螃蟹 9 * 网站:IT学习者 10 * 网址:ht

javascript DES加密解密算法

原文:javascript DES加密解密算法 源代码下载地址:http://www.zuidaima.com/share/1550463672044544.htm javascript DES加密解密算法,java通过ScriptEngineManager调用的例子. 源码截图:

DES加密解密算法

DES加密解密算法 // 仿射变换加解密.cpp : 定义控制台应用程序的入口点. // #include <stdio.h> #include <conio.h> static char key[10], key_a[5], code[8], key_b[5], temp[10], key_aa[8], key_bb[8], l[4], r[4], l_a[4], r_a[4], V[8] = { 0, 1, 0, 1, 0, 1, 0, 1 }, b[8]; char Code

php与java通用AES加密解密算法

php与java通用AES加密解密算法 AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的AES加密解密算法. php版代码如下: <?php class CryptAES { protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB; protected

java/php DES/CBC/PKCS5Padding加密解密算法实现过程

先看java代码 Java代码   public static String encrypt(String message, String key) throws Exception { Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); SecretKeyFactory k

java 实现 DES加密 解密算法

DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种:加密或解密.  DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果:如 Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果.在通信网络的两端,双方约定一致

一次一密加密解密算法

static int MAX=100; static char[] key=new char[MAX]; //用于保存密钥 static int len; static char[] bitcode(char[] str) //一次一密加密算法 { int i; char[] wen; if((wen=new char[len+1])==null) { System.out.printf("申请内存失败!\n"); System.exit(1); } for(i=0;i<len;

数据的加密传输——单片机上实现TEA加密解密算法(转)

源:数据的加密传输——单片机上实现TEA加密解密算法 各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实现起来比较困难,但一种叫TEA的加密算法特别适合单片机使用. TEA(Tiny Encryption Algorithm)是一种简单高效的加密算法,以加密解密速度快,实现简单著称.算法很简单,TEA算法每一次可以操作64-bit(8-byte),