RC4加密算法C语言实现

合集下载

C#开发RC4算法

C#开发RC4算法

RC4加密算法在C#中的实现不用想,没错,我就是用C++做客户端,用C#做服务端的,所以,服务端一样得有RC4的算法实现。

这次的RC4有个基类CryptoBase,这个基类,是为了为多种加密算法提供统一接口而设计的,我这里实现了RC4、DES、RSA三种算法。

和C++中一样,C#这里也要有一个十六进制字符串转换函数来编码解码。

经过测试,客户端C++的RC4能够很好的和服务端C#中的RC4结合工作,也就是说,一端加密的数据,另一端完全可以解密。

很遗憾,实在找不到能和C#中的RSA算法对应的C++实现的RSA算法,希望得到高人指点……代码文件有两个:CryptoBase.cs文件:以下是代码片段:using System;using System.Collections.Generic;using System.Text;namespace NewLife.Cryptography{/// <summary>/// 加密类基类/// </summary>public class CryptoBase{/// <summary>/// 编码转换器,用于字节码和字符串之间的转换,默认为本机编码/// </summary>static public Encoding Encode = Encoding.Default;public enum EncoderMode { Base64Encoder, HexEncoder };/// <summary>/// 带编码模式的字符串加密/// </summary>/// <param name="data">要加密的数据</param>/// <param name="pass">密码</param>/// <param name="em">编码模式</param>/// <returns>加密后经过编码的字符串</returns>public String Encrypt(String data, String pass, CryptoBase.EncoderMode em){if (data == null || pass == null) return null;if (em == EncoderMode.Base64Encoder)return Convert.ToBase64String(EncryptEx(Encode.GetBytes(data), pass));elsereturn ByteToHex(EncryptEx(Encode.GetBytes(data), pass));}/// <summary>/// 带编码模式的字符串解密/// </summary>/// <param name="data">要解密的数据</param>/// <param name="pass">密码</param>/// <param name="em">编码模式</param>/// <returns>明文</returns>public String Decrypt(String data, String pass, CryptoBase.EncoderMode em){if (data == null || pass == null) return null;if (em == EncoderMode.Base64Encoder)return Encode.GetString(DecryptEx(Convert.FromBase64String(data), pass));elsereturn Encode.GetString(DecryptEx(HexToByte(data), pass));}/// <summary>/// 加密/// </summary>/// <param name="data">要加密的数据</param>/// <param name="pass">密码</param>/// <returns>加密后经过默认编码的字符串</returns>public String Encrypt(String data, String pass){return Encrypt(data, pass, EncoderMode.Base64Encoder);}/// <summary>/// 解密/// </summary>/// <param name="data">要解密的经过编码的数据</param>/// <param name="pass">密码</param>/// <returns>明文</returns>public String Decrypt(String data, String pass){return Decrypt(data, pass, EncoderMode.Base64Encoder);}/// <summary>/// 加密/// </summary>/// <param name="data">要加密的数据</param>/// <param name="pass">密钥</param>/// <returns>密文</returns>virtual public Byte[] EncryptEx(Byte[] data, String pass) { return null; }/// <summary>/// 解密/// </summary>/// <param name="data">要解密的数据</param>/// <param name="pass">密码</param>/// <returns>明文</returns>virtual public Byte[] DecryptEx(Byte[] data, String pass) { return null; }static public Byte[] HexToByte(String szHex){// 两个十六进制代表一个字节Int32 iLen = szHex.Length;if (iLen <= 0 || 0 != iLen % 2){return null;}Int32 dwCount = iLen / 2;UInt32 tmp1, tmp2;Byte[] pbBuffer = new Byte[dwCount];for (Int32 i = 0; i < dwCount; i++){tmp1 = (UInt32)szHex[i * 2] - (((UInt32)szHex[i * 2] >= (UInt32)'A') ? (UInt32)'A' - 10 : (UInt32)'0');if (tmp1 >= 16) return null;tmp2 = (UInt32)szHex[i * 2 + 1] - (((UInt32)szHex[i * 2 + 1] >= (UInt32)'A') ? (UInt32)'A' - 10 : (UInt32)'0');if (tmp2 >= 16) return null;pbBuffer[i] = (Byte)(tmp1 * 16 + tmp2);}return pbBuffer;}static public String ByteToHex(Byte[] vByte){if (vByte == null || vByte.Length < 1) return null;StringBuilder sb = new StringBuilder(vByte.Length * 2);for (int i = 0; i < vByte.Length; i++){if ((UInt32)vByte[i] < 0) return null;UInt32 k = (UInt32)vByte[i] / 16;sb.Append((Char)(k + ((k > 9) ? 'A' - 10 : '0')));k = (UInt32)vByte[i] % 16;sb.Append((Char)(k + ((k > 9) ? 'A' - 10 : '0')));}return sb.ToString();}}interface ICrypto{/// <summary>/// 加密/// </summary>/// <param name="data">要加密的数据</param>/// <param name="pass">密钥</param>/// <returns>密文</returns>Byte[] EncryptEx(Byte[] data, String pass);/// <summary>/// 解密/// </summary>/// <param name="data">要解密的数据</param>/// <param name="pass">密码</param>/// <returns>明文</returns>Byte[] DecryptEx(Byte[] data, String pass);}}RC4.cs文件:以下是代码片段:using System;using System.Collections.Generic;using System.Text;namespace NewLife.Cryptography{public class RC4Crypto : CryptoBase{static public RC4Crypto RC4 = new RC4Crypto();public override Byte[] EncryptEx(Byte[] data, String pass){if (data == null || pass == null) return null;Byte[] output = new Byte[data.Length];Int64 i = 0;Int64 j = 0;Byte[] mBox = GetKey(Encode.GetBytes(pass), 256);// 加密for (Int64 offset = 0; offset < data.Length; offset++){i = (i + 1) % mBox.Length;j = (j + mBox[i]) % mBox.Length;Byte temp = mBox[i];mBox[i] = mBox[j];mBox[j] = temp;Byte a = data[offset];//Byte b = mBox[(mBox[i] + mBox[j] % mBox.Length) % mBox.Length];// mBox[j] 一定比mBox.Length 小,不需要在取模Byte b = mBox[(mBox[i] + mBox[j]) % mBox.Length];output[offset] = (Byte)((Int32)a ^ (Int32)b);}return output;}public override Byte[] DecryptEx(Byte[] data, String pass){return EncryptEx(data, pass);}/// <summary>/// 打乱密码/// </summary>/// <param name="pass">密码</param>/// <param name="kLen">密码箱长度</param>/// <returns>打乱后的密码</returns>static private Byte[] GetKey(Byte[] pass, Int32 kLen){Byte[] mBox = new Byte[kLen];for (Int64 i = 0; i < kLen; i++){mBox[i] = (Byte)i;}Int64 j = 0;for (Int64 i = 0; i < kLen; i++){j = (j + mBox[i] + pass[i % pass.Length]) % kLen;Byte temp = mBox[i];mBox[i] = mBox[j];mBox[j] = temp;}return mBox;}}}。

基于RC4算法的数据加密技术研究

基于RC4算法的数据加密技术研究

基于RC4算法的数据加密技术研究近年来随着互联网技术的发展以及移动互联网的普及,数据的安全保障已成为我们不得不面对的一个问题。

在这样的背景下,加密技术也逐渐得到了广泛的重视和应用。

本文将介绍一种基于RC4算法的数据加密技术,并对其具体实现进行分析和探讨。

一、RC4算法基础RC4算法是一种流密码,也被称为弧形加密(ARC4)算法。

它的设计初衷是为了在WEP(有线等效隐私)中提供数据加密。

RC4算法采用“密钥流”的方式对数据进行加密和解密,具体的实现过程包括以下几个步骤:(1)初始化密钥初始化密钥需要一个密钥向量和一个密钥长度。

密钥向量是由算法生成的,而密钥长度是由用户指定的。

在初始化过程中,加密机会使用密钥向量和密钥长度,生成一个初始密钥流。

(2)生成密钥流生成密钥流的方法是通过对初始密钥流做变换。

这个变换包括了执行字节交换、置换和异或运算等多个操作,用来混淆初始密钥流。

这样处理之后,密钥流被加密机作为当前的加密密钥流使用。

(3)加密数据加密数据的方法是将数据与密钥流进行XOR运算。

这样,数据就被加密成了密文。

(4)解密数据解密数据的方法和加密类似,也是将密文和密钥流进行XOR运算,从而得到原始数据。

二、RC4算法的优缺点RC4算法的优点在于加密速度快、纯软件实现、实现简单、适用于实时加密传输等场景。

然而,RC4算法也存在一些不足之处:(1)安全性不足RC4算法在算法实现上存在问题,容易被攻击者发现和破解。

尤其是使用的密钥长度较短时,更容易受到攻击。

(2)密钥流重复密钥流的生成方式中存在密钥流重复的情况。

如果两个密钥序列的密钥相同,那么其生成的密钥流也是相同的,从而会导致密文也是相同的。

(3)算法过于简单RC4算法过于简单,容易被攻击者破解。

另外,其实现比较固定,容易受到针对性攻击。

三、RC4算法的优化为了使RC4算法有更高的安全性,在使用RC4算法时,需要注意一些事项,如密钥长度要足够长、密钥流不要重复等。

RC4流密码加密算法

RC4流密码加密算法

文中所提加密方案所使用的核心加密算法为RC4流密码加密算法,该算法简洁易于软件实现,加密速度快,安全性比较较高。

RC4算法:RC4算法非常简单,易于描述:用从1到256个字节(8到2048位)的可变长度密钥初始化一个256个字节的状态矢量S,S的元素记为S[0],S[1],⋯,S[255],从始至终置换后的S包含从0到255的所有8比特数.对于加密和解密,字节K由S中256个元素按一定方式选出一个元素而生成.每生成一个K的值,S中的元素就被重新置换一次.1 初始化S开始时,S中元素的值被置为按升序从0到255,即s[0]=0,S[1]=1,⋯,S[255]=255.同时建立一个临时矢量T.如果密钥K的长度为256字节,则将K赋给T.否则,若密钥长度为keylen字节,则将K的值赋给T的前keylen个元素,并循环重复用K的值赋给T剩下的元素,直到T的所有元素都被赋值.这些预操作可概括如下:/*初始化*/for i=0 to 255 doS[i]=i;T[i]=K[i mod keylen]然后用T产生S的初始置换.从S[0]到S[255],对每个S[i],根据由T[i]确定的方案,将S[i]置换为S中的另一字节:/*S的初始序列*/j=0for i=O to 255 doj=(j+s[i]+T[i])mod 256swap(s[i],s[j]);因为对S的操作仅是交换,所以惟一的改变就是置换.S仍然包含所有值为0到255的元素.2 密钥流的生成矢量S一旦完成初始化,输人密钥就不再被使用.密钥流的生成是从s[0]到S[255],对每个S[i],根据当前S的值,将S[i]与S中的另一字节置换.当S[255]完成置换后,操作继续重复,从S[0]开始:/*密钥流的产生*/i,j=0while(true)i=(i+1)mod 256j=(j+S[i])mod 256swap(sEi],s[j])t=(sEi]+s[j])mod 256;k=S[t]加密中,将k的值与下一明文字节异或;解密中,将k的值与下一密文字节异或.加密方案:本文以RC4算法为核心加密算法提出三种加密方案,其中方案一与方案二类似。

rc4加密算法流程 -回复

rc4加密算法流程 -回复

rc4加密算法流程-回复RC4加密算法流程RC4(Rivest Cipher 4)是一种对称加密算法,由罗纳德·李维斯特(Ron Rivest)在1987年设计,在数据传输、网络通信和信息安全领域广泛使用。

RC4加密算法由一个伪随机数生成器(PRNG)和一个密钥调度算法组成,它以密钥和明文作为输入,在XOR运算下生成密文。

1. 密钥和密钥调度算法:RC4算法使用一个可变长度的密钥,长度为1到256字节。

首先将密钥以字节为单位保存起来,并将其作为初始的S盒。

S盒用于混淆密钥和明文产生伪随机的密钥流,在加密和解密过程中保持不变。

密钥调度算法使用S盒,将其进行打乱和置换操作,产生初始状态的S 盒。

S盒的置换操作通过将字节与特定索引对应的字节交换位置来实现。

2. 伪随机数生成器:RC4算法的核心是伪随机数生成器,它以初始的S盒作为输入,不断生成密钥流。

密钥流由RC4的核心异或算法所生成。

伪随机数生成器的处理步骤如下:- 初始化:置换S盒并初始化两个指针i和j为0。

- 加密循环:循环处理明文中的每个字节- 交换S盒中两个字节的位置:使用i和j的值作为索引,将S[i]和S[j]交换位置。

- 计算密钥流中的伪随机字节:通过将第一个字节与当前字节所在索引指向的字节进行交换,并将它们的和作为新的索引更新。

- 生成密文:将密钥流字节与明文字节进行异或运算,得到密文字节。

- 重置状态:RC4算法可以通过简单的重新初始化来重置状态。

3. 加密流程:RC4的加密流程可以描述如下:- 输入密钥:选择一个合适的密钥,并将其转化为二进制格式。

- 密钥调度算法:使用密钥调度算法生成初始的S盒。

- 伪随机数生成器:根据密钥流生成密文。

- 异或运算:将密钥流与明文进行异或运算,得到相应的密文。

- 输出密文:将密文作为输出,发送给接收方。

4. 解密流程:RC4的解密流程与加密流程相似,只需使用相同的密钥和密钥调度算法即可。

将密文与密钥流进行异或运算,得到明文信息。

RC4加密的C#实现

RC4加密的C#实现

RC4加密的C#实现///<summary>RC4加密算法///返回进过rc4加密过的字符///</summary>///<param name="str">被加密的字符</param>///<param name="ckey">密钥</param>public static string EncryptRC4wq(string str, string ckey){int[] s = new int[256];for (int i = 0; i < 256; i++){s[i] = i;}//密钥转数组char[] keys = ckey.ToCharArray();//密钥转字符数组int[] key = new int[keys.Length];for (int i = 0; i < keys.Length; i++){key[i] = keys[i];}//明⽂转数组char[] datas = str.ToCharArray();int[] mingwen = new int[datas.Length];for (int i = 0; i < datas.Length; i++){mingwen[i] = datas[i];}//通过循环得到256位的数组(密钥)int j = 0;int k = 0;int length = key.Length;int a;for (int i = 0; i < 256; i++){a = s[i];j = (j + a + key[k]);if (j >= 256){j = j % 256;}s[i] = s[j];s[j] = a;if (++k >= length){k = 0;}}//根据上⾯的256的密钥数组和明⽂得到密⽂数组int x = 0, y = 0, a2, b, c;int length2 = mingwen.Length;int[] miwen = new int[length2];for (int i = 0; i < length2; i++){x = x + 1;x = x % 256;a2 = s[x];y = y + a2;y = y % 256;s[x] = b = s[y];s[y] = a2;c = a2 + b;c = c % 256;miwen[i] = mingwen[i] ^ s[c];}//密⽂数组转密⽂字符char[] mi = new char[miwen.Length];for (int i = 0; i < miwen.Length; i++){mi[i] = (char)miwen[i];}string miwenstr = new string(mi);return miwenstr;}///<summary>RC4解密算法///返回进过rc4解密过的字符///</summary>///<param name="str">被解密的字符</param>///<param name="ckey">密钥</param>public static string DecryptRC4wq(string str, string ckey){int[] s = new int[256];for (int i = 0; i < 256; i++){s[i] = i;}//密钥转数组char[] keys = ckey.ToCharArray();//密钥转字符数组int[] key = new int[keys.Length];for (int i = 0; i < keys.Length; i++){key[i] = keys[i];}//密⽂转数组char[] datas = str.ToCharArray();int[] miwen = new int[datas.Length];for (int i = 0; i < datas.Length; i++){miwen[i] = datas[i];}//通过循环得到256位的数组(密钥)int j = 0;int k = 0;int length = key.Length;int a;for (int i = 0; i < 256; i++){a = s[i];j = (j + a + key[k]);if (j >= 256){j = j % 256;}s[i] = s[j];s[j] = a;if (++k >= length){k = 0;}}//根据上⾯的256的密钥数组和密⽂得到明⽂数组int x = 0, y = 0, a2, b, c;int length2 = miwen.Length;int[] mingwen = new int[length2];for (int i = 0; i < length2; i++){x = x + 1;x = x % 256;a2 = s[x];y = y + a2;y = y % 256;s[x] = b = s[y];s[y] = a2;c = a2 + b;c = c % 256;mingwen[i] = miwen[i] ^ s[c];}//明⽂数组转明⽂字符char[] ming = new char[mingwen.Length];for (int i = 0; i < mingwen.Length; i++){ming[i] = (char)mingwen[i];}string mingwenstr = new string(ming);return mingwenstr;}View Codeprivate string StringToHexString(string s, Encoding encode){byte[] b = encode.GetBytes(s);//按照指定编码将string编程字节数组string result = string.Empty;for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符,以%隔开 {result += "%" + Convert.ToString(b[i], 16);}return result;}private string HexStringToString(string hs, Encoding encode){//以%分割字符串,并去掉空字符string[] chars = hs.Split(new char[] { '%' }, StringSplitOptions.RemoveEmptyEntries);byte[] b = new byte[chars.Length];//逐个字符变为16进制字节数据for (int i = 0; i < chars.Length; i++){b[i] = Convert.ToByte(chars[i], 16);}//按照指定编码将字节数组变为字符串return encode.GetString(b);}View Code。

RC4 objective-c和C#加解密结合

RC4 objective-c和C#加解密结合
j = (j + is + ik)%256;
NSNumber *temp = [iS objectAtIndex:i];
[iS replaceObjectAtIndex:i withObject:[iS objectAtIndex:j]];
for (short i = 0; i < 256; i++)
{
char c = EncodeKeyString.ToCharArray()[i % EncodeKeyString.Length];
charArray[i] = c;
}
int_j = 0;
for (int i = 0; i < 255; i++)
{
int _int_a = intArray[i];
char _char_a = charArray[i];
public static string Rc4EncryptMethod(string DataString, string EncodeKeyString)
{
int[] intArray = new int[256];
char[] charArray = new char[256];
int _int_is = intArray[int_i];
int_j = (int_j + _int_is) % 256;
int _int_is_i = intArray[int_i];
int _int_is_j = intArray[int_j];
char _char_y = (char)(_char_c ^ _int_iY);

易语言rc4写法

易语言rc4写法

易语言rc4写法RC4(Rivest Cipher 4)是一种对称密钥流密码算法,常用于加密通信中的数据。

以下是一个使用易语言编写的简单的RC4算法实现:```easylanguage' RC4算法实现Dim S(255), T(255)' 初始化RC4密钥Sub RC4_Init(key)Dim keyLen, i, j, tempkeyLen = Len(key)For i = 0 To 255S(i) = iT(i) = Asc(Mid(key, i Mod keyLen + 1, 1))Nextj = 0For i = 0 To 255j = (j + S(i) + T(i)) Mod 256' 交换S(i)和S(j)temp = S(i)S(i) = S(j)S(j) = tempNextEnd Sub' RC4加解密Function RC4_Crypt(data)Dim i, j, temp, k, cipherDim dataLendataLen = Len(data)i = 0j = 0ReDim cipher(dataLen - 1)For k = 0 To dataLen - 1i = (i + 1) Mod 256j = (j + S(i)) Mod 256' 交换S(i)和S(j)temp = S(i)S(i) = S(j)S(j) = temp' 生成伪随机数,并与数据异或cipher(k) = Asc(Mid(data, k + 1, 1)) Xor S((S(i) + S(j)) Mod 256)NextRC4_Crypt = Join(cipher, "")End Function' 测试Dim key, plaintext, ciphertextkey = "SecretKey"plaintext = "Hello, RC4!"' 初始化RC4密钥RC4_Init key' 加密ciphertext = RC4_Crypt(plaintext)Print "加密后:" + ciphertext' 重新初始化RC4密钥RC4_Init key' 解密plaintext = RC4_Crypt(ciphertext)Print "解密后:" + plaintext```上述代码中,`RC4_Init` 函数用于初始化RC4密钥,`RC4_Crypt` 函数用于加解密数据。

RC4加密算法

RC4加密算法

原理
密钥调度算法(KSA)
• 指定一个key,其长度为1~ for (i=0; i<256; i++){ 256字节,存在数组key中 S[i] = i; • 数组S[256],初始化为S[i]=i T[i]=key[i%KeyLenth]; • 利用数组KEY来对数组S做 } 一个置换,即对S数组里的 for (i=0; i<256; i++) { j = (j + S[i] + T[i]) % 256; 数重新排列 tmp = S[i]; • 排列算法为: S[i] = S[j]; S[j] = tmp; }
• 严重威胁802.11无线网络的安全
• 不威胁RC4-based SSL,因为不同的SLL会话的密 钥彼此无关 • 解决办法:抛弃密钥流最初的部分数据
KLEIN'S ATTACK
• Andreas Klein 提出了RC4流密码的一种分析,表 明密码流和key之间的相互关系
• Erik Tews, Ralf-Philipp Weinmann and Andrei Pychkine使用该 分析写了一个可以破解128-bit WEP 中使用的104-bit RC4
对明文加密
• 用密码流对明文迚行加密或解密,将密码流与明 文相加(相或) • 算法描述为: for (i=0; i<textlength; i++) ciphertext[i] = keystream[i] ^ plaintext[i];
安全性
• RC4算法加密是采用的xor,一旦子密钥序列出现了重复, 密文就有可能被破解。存在部分弱密钥,使得子密钥序 列在不到100万字节内就发生了完全的重复,如果是部分 重复,则可能在不到10万字节内就能发生重复,所以在 使用RC4算法时,必须对加密密钥迚行测试,判断其是 否为弱密钥
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sub_k=s((s+s[j])% n);
}
得到的子密码sub_k用以和明文进行xor运算,得到密文,解密过程也完全相同。
RC4加密算法在C++中的实现:
RC4函数(加密/解密):其实RC4只有加密,将密文再加密一次,就是解密了。
GetKey函数:随机字符串产生器。
ByteToHex函数:把字节码转为十六进制码,一个字节两个十六进制。十六进制字符串 非常适合在HTTP中传输。
HexToByte函数:把十六进制字符串,转为字节码。。
Encrypt函数:把字符串经RC4加密后,再把密文转为十六进制字符串返回,可直接用 于传输。
Decrypt函数:直接密码十六进制字符串密文,再解密,返回字符串明文。
源代码
以下为Encrypt.h文件代码
#ifndef _ENCRYPT_RC4_
#defi ne _ENCRYPT_RC4_
#in clude <stri ng.h>
#defi ne BOX_LEN 256
int GetKey(c onst un sig ned char* pass, int pass_le n, un sig ned char *out);
int RC4(c onst un sig ned char* data, int data_le n, const un sig ned char* key, int key_le n, un sig ned char* out, i nt* out_le n);
char* ByteToHex(c onst un sig ned char* vByte, const int vLe n); //把字节码pbBuffer转为十六进
制字符串,方便传输
unsigned char* HexToByte(const char* szHex); //把十六进制字符串转为字节码pbBuffer,解
{
if(szSource == NULL || szPassWord == NULL) retur n NULL;
un sig ned char* ret = new un sig ned char[strle n( szSource)];
int ret_le n = 0;
if(RC4((unsigned char*)szSource,

#e ndif//#ifndef _ENCRYPT_RC4_
以下为RC4.cpp文件代码
////////////////////////////////////////////////////////////
///Biblioteka 版权信息////////////////////////////////////////////////////////////////
RC4
代码文件名
RC4.cpp Encrypt.h(代码详见后文) 备注:将以上两个文件放在相同的路径(建议不要放在中文路径下)编译执行!编译环境
Microsoft Visual C++6.0
C-Free5.0
代码解释
RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇, 是由于其核心部分的S-box长度可为任意,但 一般为256字节。该算法的速度可以达到DES加密的10倍左右。
return NULL;
un sig ned char* src = HexToByte(szSource);
un sig ned char* ret = new un sig ned char[strle n( szSource)/2+1];
int ret_le n = 0;
static void swap_byte( un sig ned char* a, un sig ned char* b);
char* En crypt(co nst char* szSource, const char* szPassWord); //加密,返回加密结果
char* Decrypt(co nst char* szSource, con st char* szPassWord); //解密,返回解密结果
#in elude <iostream>
#in elude <stri ng>
#i nclude <stdio.h>
#in elude "En crypt.h".
const int max n=256+10;
char* En crypt(co nst char* szSource, const char* szPassWord) //加密,返回加密结果
strle n( szSource),
(un sig ned char*)szPassWord,
strle n( szPassWord),
ret,
&ret_le n) == NULL)
return NULL;
char* ret2 = ByteToHex(ret, ret_le n);
delete[] ret;
return ret2;
}
char* Decrypt(co nst char* szSource, con st char* szPassWord) //解密,返回解密结果
{
if(szSource == NULL || (strle n(szSource)%2 != 0) || szPassWord == NULL)
RC4算法的原理很简单, 包括初始化算法和伪随机子密码生成算法两大部分。 假设S-box长度和密钥长度均为为n。先来看看算法的初始化部分(用类C伪代码表示):
for (i=0; i<n; i++)
s=i;
j=0;
for (i=0; i<n; i++)
{
j=(j+s+k)%256;
swap(s, s[j]);
}
在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到
处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理 后可以得到不同的子密钥序列,并且,该序列是随机的:
i=j=0;
while(明文未结束)
{
++i%=n;
j=(j+s)%n;
swap(s, s[j]);
相关文档
最新文档