RC4加密算法C语言实现
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算法是一种流密码,也被称为弧形加密(ARC4)算法。
它的设计初衷是为了在WEP(有线等效隐私)中提供数据加密。
RC4算法采用“密钥流”的方式对数据进行加密和解密,具体的实现过程包括以下几个步骤:(1)初始化密钥初始化密钥需要一个密钥向量和一个密钥长度。
密钥向量是由算法生成的,而密钥长度是由用户指定的。
在初始化过程中,加密机会使用密钥向量和密钥长度,生成一个初始密钥流。
(2)生成密钥流生成密钥流的方法是通过对初始密钥流做变换。
这个变换包括了执行字节交换、置换和异或运算等多个操作,用来混淆初始密钥流。
这样处理之后,密钥流被加密机作为当前的加密密钥流使用。
(3)加密数据加密数据的方法是将数据与密钥流进行XOR运算。
这样,数据就被加密成了密文。
(4)解密数据解密数据的方法和加密类似,也是将密文和密钥流进行XOR运算,从而得到原始数据。
二、RC4算法的优缺点RC4算法的优点在于加密速度快、纯软件实现、实现简单、适用于实时加密传输等场景。
然而,RC4算法也存在一些不足之处:(1)安全性不足RC4算法在算法实现上存在问题,容易被攻击者发现和破解。
尤其是使用的密钥长度较短时,更容易受到攻击。
(2)密钥流重复密钥流的生成方式中存在密钥流重复的情况。
如果两个密钥序列的密钥相同,那么其生成的密钥流也是相同的,从而会导致密文也是相同的。
(3)算法过于简单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(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#实现///<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#加解密结合
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(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加密算法
原理
密钥调度算法(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算法时,必须对加密密钥迚行测试,判断其是 否为弱密钥
rc4加密算法流程 -回复
rc4加密算法流程-回复RC4加密算法流程RC4是一种流密码算法,它以密钥为基础生成伪随机比特流,然后通过对待加密的信息进行异或运算来实现加密。
RC4算法简单而高效,在实际应用中得到广泛使用。
本文将详细介绍RC4加密算法的流程,并逐步回答相关问题。
一、生成S盒RC4算法的第一步是生成一个被称为S盒的数组,该数组用于存储字节0到255的排列顺序。
生成S盒的具体过程如下:1. 初始化一个长度为256的字节数组S,将其元素按顺序初始化为0到255。
2. 根据密钥的内容,将S盒进行一系列的置换操作。
这些操作主要是通过交换S盒中的元素来打乱其顺序。
a. 首先,将S盒的每个元素与密钥中对应位置的元素进行交换。
b. 然后,用每个元素对应位置的密钥字节对S盒中的每个元素进行置换,这是置换操作的关键步骤。
c. 重复上述置换操作多次,通常为256次,以确保在S盒中元素的排列具有足够的随机性。
生成S盒的目的是为了在后续的加密中使用,通过索引S盒中的元素值来生成伪随机数流。
二、初始化加密过程在加密开始之前,需要对RC4算法进行初始化设置,具体过程如下:1. 选择一个合适的密钥,密钥长度可以是一定的范围内(一般为40至2048位)。
2. 根据所选密钥的内容,生成初始的伪随机比特流。
这是通过将S盒的内容与密钥进行一系列的置换和交换操作得到的。
a. 首先,对S盒进行一定次数的置换和交换操作,以增加密钥的影响力。
b. 然后,使用生成的伪随机数流初始化两个指针(i和j)的位置,这两个指针在加密过程中将起到重要的作用。
初始化过程目的是为了为加密过程提供必要的初始状态。
三、加密过程RC4算法的加密过程可以概括为以下几个步骤:1. 根据初始化过程生成的S盒和指针位置,将待加密的信息进行逐字节的处理。
处理结果即为加密后的信息。
a. 首先,根据当前位置指针i和j分别选择S盒中的两个元素Si和Sj。
b. 接着,将Si和Sj进行交换,并将其相加(使用模256进行运算)得到一个新的索引值k。
rc4 cryptoapi encryption加密原理
RC4(Rivest Cipher 4)是一种对称加密算法,由Ron Rivest 在1987年设计。
它广泛应用于网络通信、无线通讯和各种安全协议中。
RC4算法简单高效,可以快速加密和解密数据。
本文将详细介绍RC4算法的加密原理。
一、RC4算法概述RC4算法使用一个长度为256字节的密钥表(S盒),并通过密钥对表进行初始化。
然后,根据密钥表生成伪随机数流,并将明文与伪随机数流进行异或操作,得到密文。
解密时,使用相同的密钥重新生成伪随机数流,并再次与密文进行异或操作,还原出明文。
二、密钥表初始化1. 密钥表生成RC4算法首先将0-255的数值依次填入密钥表中。
然后,根据给定的密钥,对密钥表进行重排。
密钥的每个字节都会与密钥表中的某个位置进行交换,以达到混淆的目的。
2. 初始化向量初始化向量(IV)是一个伪随机数流,用于进一步加密密钥表。
通过将密钥表与伪随机数流进行交换,可以增加密钥表的复杂性,提高算法的安全性。
三、伪随机数流生成RC4算法通过对密钥表进行进一步处理,生成伪随机数流。
伪随机数流的长度与明文或密文的长度相同。
具体生成方法如下:1. 生成初始伪随机数流根据初始化向量和密钥表,生成初始的伪随机数流。
这一步骤只需执行一次。
2. 生成更多的伪随机数流使用密钥表中的值作为索引,不断交换密钥表中的元素,生成更多的伪随机数流。
这一步骤可以多次重复,以增加伪随机数流的复杂性。
四、加密过程1. 密钥扩展将生成的伪随机数流作为密钥流,与明文进行异或操作,得到密文。
密钥流的生成方式与前述的伪随机数流生成类似。
2. 明文与密钥流异或将明文按字节与密钥流进行异或操作,得到密文。
异或操作的结果是一个新的字节流,其中每个字节都是明文字节与密钥流字节的异或结果。
五、解密过程解密过程与加密过程相似,只是使用相同的密钥表和相同的密钥流进行异或操作,还原出明文。
六、安全性分析RC4算法由于其简单性和高效性而得到了广泛应用。
RC4加密算法的原理及实现
RC4加密算法的原理及实现RC4于1987年提出,和DES算法⼀样。
是⼀种对称加密算法,也就是说使⽤的密钥为单钥(或称为私钥)。
但不同于DES的是。
RC4不是对明⽂进⾏分组处理,⽽是字节流的⽅式依次加密明⽂中的每个字节。
解密的时候也是依次对密⽂中的每个字节进⾏解密。
RC4算法的特点是算法简单,执⾏速度快。
并且密钥长度是可变的,可变范围为1-256字节(8-2048⽐特),在现在技术⽀持的前提下,当密钥长度为128⽐特时,⽤暴⼒法搜索密钥已经不太可⾏,所以能够预见RC4的密钥范围任然能够在今后相当长的时间⾥抵御暴⼒搜索密钥的攻击。
实际上,现在也没有找到对于128bit密钥长度的RC4加密算法的有效攻击⽅法。
在介绍RC4算法原理之前。
先看看算法中的⼏个关键变量:1、密钥流:RC4算法的关键是依据明⽂和密钥⽣成相应的密钥流,密钥流的长度和明⽂的长度是相应的。
也就是说明⽂的长度是500字节,那么密钥流也是500字节。
当然,加密⽣成的密⽂也是500字节。
由于密⽂第i字节=明⽂第i字节^密钥流第i字节;2、状态向量S:长度为256。
S[0],S[1].....S[255]。
每⼀个单元都是⼀个字节。
算法执⾏的不论什么时候。
S都包含0-255的8⽐特数的排列组合,仅仅只是值的位置发⽣了变换;3、暂时向量T:长度也为256,每⼀个单元也是⼀个字节。
假设密钥的长度是256字节。
就直接把密钥的值赋给T,否则,轮转地将密钥的每⼀个字节赋给T。
4、密钥K:长度为1-256字节。
注意密钥的长度keylen与明⽂长度、密钥流的长度没有必定关系。
通常密钥的长度趣味16字节(128⽐特)。
RC4的原理分为三步:1、初始化S和Tfor i=0 to 255 doS[i]=i;T[i]=K[ imodkeylen ];2、初始排列Sj=0;for i=0 to 255 doj= ( j+S[i]+T[i])mod256;swap(S[i],S[j]);3、产⽣密钥流i,j=0;for r=0 to len do //r为明⽂长度,r字节i=(i+1) mod 256;j=(j+S[i])mod 256;swap(S[i],S[j]);t=(S[i]+S[j])mod 256;k[r]=S[t];以下给出RC4加密解密的C++实现:加密类:/*加密类*/class RC4 {public:/*构造函数。
RC4算法说明
1.概述RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。
之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。
该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。
2.原理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-boxchar 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];}}int main(){unsigned char s[256] = {0},s2[256] = {0}; //S-boxchar 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);return 0;}//程序完。
RC4流密码算法之C语言实现
RC4流密码算法之C语言实现RC4加密算法RC4算法的原理很简单,包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。
假设S-box长度和密钥长度均为为n。
先来看看算法的初始化部分(用类C伪代码表示):for (i=0; i<n; i++)s=i;在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。
而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,并且,该序列是随机的:j=0;for (i=0; i<n; i++){j=(j+s+k)%256;swap(s, s[j]);}i=j=0;得到的子密码sub_k用以和明文进行xor运算,得到密文,解密过程也完全相同。
根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,大家可以放心使用!while (明文未结束){++i%=n;j=(j+s)%n;swap(s, s[j]);sub_k=s((s+s[j])%n);}位长可以自己随意设置,将256设置为你希望的即可我的C语言源码:平台:windowsXP,VC++6.0有什么大家可以讨论的地方请留言或发邮件至我邮箱:#include<stdio.h>#include<stdlib.h>#include<string.h>void swap(unsigned char *s1,unsigned char *s2) {char temp;temp=*s1;*s1=*s2;*s2=temp;}void re_S(unsigned char *S){unsigned int i;for(i=0;i<256;i++)S[i]=i;}void re_T(unsigned char *T,char *key){int i;int keylen;keylen=strlen(key);for(i=0;i<256;i++)T[i]=key[i%keylen];}void re_Sbox(unsigned char *S,unsigned char *T) {int i;int j=0;for(i=0;i<256;i++){j=(j+S[i]+T[i])%256;swap(&S[i],&S[j]);}}void re_RC4(unsigned char *S,char *key){char T[255]={0};re_S(S);re_T(T,key);re_Sbox(S,T);}void RC4(FILE *readfile,FILE *writefile,char *key) {unsigned char S[255]={0};unsigned char readbuf[1];int i,j,t;re_RC4(S,key);i=j=0;while(fread(readbuf,1,1,readfile)) {i = (i + 1) % 256;j = (j + S[i]) % 256;swap(&S[i],&S[j]);t = (S[i] + (S[j] % 256)) % 256; readbuf[0]=readbuf[0]^S[t]; fwrite(readbuf,1,1,writefile); memset(readbuf,0,1);}printf("加密|解密成功!!!\n");}int main(int argc,char *argv[]) {char *Filename1,*Filename2; char *key;FILE *file1,*file2;Filename1 = argv[1];Filename2 = argv[2];key=argv[3];if ( argc == 4){printf("**********************正在加密中*******************\n"); }else{printf("输入格式:\n");printf("文件名|加密或解密文件名|存放文件名|密钥\n");return -1;}if ((file1= fopen(Filename1,"rb")) == NULL|| (file2 =fopen(Filename2,"wb"))==NULL){printf("Can't open file\n");return -1;}RC4(file1,file2,key);fclose(file1);fclose(file2);return 0;}加密解密算法RC5- -#include <iostream.h>#include "math.h"#include <stdio.h>static const w=32;static const r=12;static const b=16;static const t=26;//2*r+2=12*2+2static const c=4; //r*8/b = 16*8/32typedef unsigned long int FOURBYTEINT;typedef unsigned char BYTE;/*** 循环左移和右移函数* x : 被循环的数* y : 将要循环的位数*/#define ROTL(x,y) (((x)<<(y&(w-1))) | ((x)>>(w-(y&(w-1)))))#define ROTR(x,y) (((x)>>(y&(w-1))) | ((x)<<(w-(y&(w-1)))))/** 产生子密钥的函数*/void generateChildKey(unsigned char*,FOURBYTEINT*);/** 产生初试密钥的函数*/void InitialKey(unsigned char* KeyK,int b){for(int i=0;i<b;i++){KeyK[i]=0;}int intiSeed=3;KeyK[0]=intiSeed;for(i=1;i<b;i++){KeyK[i] = (BYTE) ( ((int)(pow(3,i)))%(255-i) );//KeyK[i] = KeyK[i-1]*intiSeed % 256;}}/** 取最近奇数的函数*/int Odd(double fl){int floorOffl = (int)floor(fl);if (floorOffl% 2==0) return floorOffl+1;return floorOffl;}/** 加密函数*/void Encipher(FOURBYTEINT* In,FOURBYTEINT* Out,FOURBYTEINT* S){ FOURBYTEINT X,Y;X = In[0]+S[0];Y = In[1]+S[1];for(int i=1;i<=r;i++){X=ROTL((X^Y),Y) + S[2*i];Y=ROTL((Y^X),X) + S[2*i+1];}Out[0]=X;Out[1]=Y;}/** 解密函数*/void Decipher(FOURBYTEINT* In,FOURBYTEINT* Out,FOURBYTEINT* S){FOURBYTEINT X,Y;X = In[0];Y = In[1];for(int i=r;i>0;i--){Y = ROTR(Y-S[2*i+1],X)^X;X = ROTR(X-S[2*i],Y)^Y;}Out[0]=X - S[0];Out[1]=Y - S[1];}/** 主函数*/void main(){FOURBYTEINT ChildKeyS[2*r+2]; //64bit unsigned char KeyK[b];//8bit=byteInitialKey(KeyK,b);int k;generateChildKey(KeyK,ChildKeyS); FOURBYTEINT Source[2]={8888,6666};//cout<<Source[0]<<" "<<Source[1]<<endl;printf("加密以前的明文:");for (k=0;k<2;k++) {printf("%.8lX ",Source[k]);}FOURBYTEINT Dest[2];Encipher(Source,Dest,ChildKeyS);//cout<<Dest[0]<<" "<<Dest[1]<<endl; printf("\n");printf("加密以后的密文:");for (k=0;k<2;k++) {printf("%.8lX ",Dest[k]);}printf("\n");Decipher(Dest,Source,ChildKeyS);//cout<<Source[0]<<" "<<Source[1]<<endl; printf("解密以后的明文:");for (k=0;k<2;k++) {printf("%.8lX ",Source[k]);}printf("\n");/*printf("加密以前的明文:");for (k=0;k<6;k++) {printf("%.8lX ",mingwen_org[k]);}printf("\n");printf("加密以后的密文:");for (k=0;k<6;k++) {printf("%.8lX ",miwen[k]);}printf("\n");printf("解密以后的明文:");for (k=0;k<6;k++) {printf("%.8lX ",mingwen_final[k]);}printf("\n");*/}void generateChildKey(unsigned char* KeyK,FOURBYTEINT* ChildKeyS) {const double e = 2.718281828459;const double Phia = 1.618033988749;//int PW = Odd((e-1)*pow(2,w));int PW = 0xb7e15163;//int QW = Odd((Phia -1)*pow(2,w));int QW = 0x9e3779b9;int i;FOURBYTEINT L[c];//初试化数组SChildKeyS[0]=PW;for ( i=1;i<t;i++){ChildKeyS[i]=(ChildKeyS[i-1]+ QW);//% (2<<w)不需要}//transform from K to L//initialization Lfor(i=0;i<c;i++){L[i]=0;}int u = w/8;for (i=b-1;i!=-1; i--)L[i/u] = (L[i/u]<<8)+KeyK[i];for (i=0;i<4;i++)printf("%.8X\n",L[i]);/generate child keysFOURBYTEINT A,B,X,Y;A=B=X=Y=0;for(i=0;i<3*t;i++){X = ChildKeyS[A] = ROTL(ChildKeyS[A]+X+Y,3);A = (A+1) % t;Y = L[B] = ROTL(L[B]+X+Y,(X+Y));B = (B+1) % c;}/*for (i=0;i<t;i++){printf("%.8X",ChildKeyS[i]);printf("\n");}*/}。
RC4、RC5、RC6密码介绍
RC4、RC5、RC6密码介绍黎狸1.RC4的原理long Len){int i=0,j=0;//char k[256]={0};unsigned 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];printf("copy for dongdeng");s[i]=s[j];//交换s[i]和s[j]s[j]=tmp;}}其中,参数1是一个256长度的char型数组,定义为: unsigned char sBox[256];参数2是密钥,其内容可以随便定义:char key[256];参数3是密钥的长度,Len = strlen(key);初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。
而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将S-box和明文进行xor 运算,得到密文,解密过程也完全相同。
2)加密部分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];}}其中,参数1是上边rc4_init函数中,被搅乱的S-box;参数2是需要加密的数据data;参数3是data的长度.2.RC5原理2.1RC5简介RC5分组密码算法是1994由麻萨诸塞技术研究所的Ronald L. Rivest教授发明的,并由RSA实验室分析。
rc4加密算法流程 -回复
rc4加密算法流程-回复RC4加密算法流程是一种流密码,基于对称加密算法。
它由罗纳德·里夫斯(Ron Rivest)在1987年设计,并以他和他两个同事名字的首字母命名。
RC代表"Ron's Code",也是里夫斯的名字大写首字母。
RC4算法是一种面向字节流的加密算法,因此在加密和解密过程中都是按字节进行操作的。
它通过使用一个密钥对数据流进行加密,使得除了具备密钥的用户外,其他人无法解密数据。
RC4算法的基本流程如下:1. 密钥初始化:选择一个合适的密钥,长度通常为8到256个字节。
密钥的选择对RC4的安全性有很大的影响,因此应该选择一个足够长且随机的密钥。
2. S盒初始化:S盒是一个256个元素的数组,用于存储0到255的所有可能的字节值。
初始化S盒的方法是将数组的第一个元素到最后一个元素分别赋值为0到255的连续整数。
然后,根据密钥中字节的顺序,对S 盒进行一系列交换操作。
3. 伪随机数生成:RC4算法的核心是伪随机数生成算法。
通过重复以下步骤生成密文流:- 初始化:通过将S盒拷贝到一个新的盒子S'中,用于每次生成一个新的密文字节流。
- 锁定密钥:使用密钥来修改S'的初始状态。
- 生成密文:通过交换S'中的元素,并按顺序生成密文字节流。
4. 加密数据:将明文数据与生成的密文流进行异或运算,得到密文数据。
以上就是RC4加密算法的基本流程。
下面我们一步一步详细解释每个步骤。
1. 密钥初始化:首先,选择一个合适的密钥。
密钥的长度通常为8到256个字节。
可以使用随机数生成器来生成一个足够随机的密钥。
密钥长度的选择是一个权衡,过短的密钥可能容易被破解,而过长的密钥可能会造成加密和解密过程的性能下降。
因此,需要根据具体的应用场景来选择合适的密钥长度。
2. S盒初始化:S盒是一个256个元素的数组,用于存储0到255的所有可能的字节值。
初始化S盒的方法是将数组的第一个元素到最后一个元素分别赋值为0到255的连续整数。
RC4加密算法的实现网络安全课程设计报告书
枣庄学院信息科学与工程学院课程设计任务书题目:RC4加密算法的实现学号:姓名:专业:计算机网络技术课程:计算机网络安全教程指导教师:职称:教师完成时间: 2012年 11月----2012 年 12 月枣庄学院信息科学与工程学院制一.系统设计的目标随着信息化的发展,人们在信息传递,数据共享等方面的要求越来越高。
但与此同时,数据的、个人的隐私保护也越来越困难,迫使人们不得不采取相应的措施来提高信息的安全性。
在此条件下,加密技术应运而生。
加密作为一把系统安全的钥匙,是实现信息安全的重要手段之一,正确的使用加密技术可以确保信息的安全。
人们所熟悉的加密技术很多,比如数字签名、注册、软盘加密、软件锁等等。
本人的设计思想是利用文件夹的加密来实现对软件或文件的安全加密。
在此设计基础上编写了一个程序,该软件操作简单方便,适用于个人PC上对文件的加密。
用户可自选密钥对重要文件或可执行程序进行加密,防止未授权用户窃密。
本文描述了利用文件夹的加密来实现对文件或程序的保护方案。
采用了“对称式”加密技术即采用文件逐字节与密码异或方式对文件或可执行程序加密。
选用C++编程语言,设计了一个加密程序,该程序不拘泥于花俏的界面,仅使用了一个简单的对话框,具有简单实用的特点。
在该方案的实现中,由于使用了可靠的密码学算法,使软件加密的强度大大提高。
二.系统原理:1. RC4加密算法原理:RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。
之所以称其为簇,是由于其核心部分的S-bo x长度可为任意,但一般为256字节。
该算法的速度可以达到DES加密的10倍左右。
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的搅乱是随机的。
RC4加密算法
RC4加密算法什么是RC4 ?RC4加密算法是⼤名⿍⿍的RSA三⼈组中的头号⼈物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇,之所以称其为簇,是由于其核⼼部分的S-box长度可为任意,但⼀般为256字节。
在密码学中,RC4(来⾃Rivest Cipher 4的缩写)是⼀种流加密算法,密钥长度可变。
它加解密使⽤相同的密钥,因此也属于对称加密算法。
所谓对称加密,就是加密和解密的过程是⼀样的。
RC4是有线等效加密(WEP)中采⽤的加密算法,也曾经是TLS 可采⽤的算法之⼀。
RC4已经成为⼀些常⽤的协议和标准的⼀部分,如1997年的WEP和2003/2004年⽆线卡的WPA; 和1995年的SSL,以及后来1999年的TLS。
让它如此⼴泛分布和使⽤的主要因素是它不可思议的简单和速度,不管是软件还是硬件,实现起来都⼗分容易。
基本原理对明⽂使⽤同⼀个密钥异或两次最后得到的是原⽂加密:原⽂和Keystream进⾏异或得到密⽂解密:密⽂和Keystream进⾏异或得到原⽂图⽚来源:《802.11⽆线⽹络权威指南》第 5 章图5-1 串流密码锁的⼀般运作程序流程图解图⽚来源:⽣成秘钥流(KeyStream)从上图可以看出来,RC4加密原理很简单,只需要⼀个KeyStream与明⽂进⾏异或即可,密钥流的长度和明⽂的长度是对应的。
RC4算法的的主要代码还是在于如何⽣成秘钥流。
密钥流的⽣成由两部分组成:1. KSA(the Key-Scheduling Algorithm)2. PRGA(the Pseudo-Random Generation Algorithm)利⽤Key⽣成S盒——The key-scheduling algorithm (KSA)/* 得到S-box */int i = 0;for (i = 0; i < 256; i++) {S[i] = i;T[i] = puc_key[i % key_length];}for (i = 0; i < 256; i++) {j = (j + S[i] + T[i]) % 256;swap_uchar(&S[i], &S[j]); //交换S[i]和S[j]}利⽤S盒⽣成密钥流——The pseudo-random generation algorithm(PRGA)图⽚来源:/* ⽣成密钥流 Keystream */int i = 0;int j = 0;int t = 0;unsigned long k = 0;for (k = 0; k < ul_data_length; k++) {i = (i + 1) % 256;j = (j + puc_sbox[i]) % 256;swap_uchar(&puc_sbox[i], &puc_sbox[j]);t = (puc_sbox[i] + puc_sbox[j]) % 256;puc_key_stream[k] = puc_sbox[t];}代码实现#include<stdio.h>#include<string.h>#define SBOX_LEN 256#define rc4_encrypt rc4_crypt#define rc4_decrypt rc4_cryptstatic inline void swap_uchar(unsigned char *puc_x, unsigned char *puc_y){*puc_x = *puc_x ^ *puc_y;*puc_y = *puc_x ^ *puc_y;*puc_x = *puc_x ^ *puc_y;}void hexdump(unsigned char *puc_data, int length){int i = 0;for (i = 0; i < length; i++) {printf("%02X", puc_data[i]);if (i && (i + 1) % 16 == 0) {putchar('\n');}}printf("\n");}/*** 利⽤Key⽣成S盒* the Key-Scheduling Algorithm*/static void rc4_ksa(unsigned char *puc_sbox, unsigned char *puc_key, int key_length){int i = 0;int j = 0;char tmp[SBOX_LEN] = {0};for (i = 0; i < SBOX_LEN; i++) {puc_sbox[i] = i;tmp[i] = puc_key[i % key_length];}for (i = 0; i < SBOX_LEN; i++) {j = (j + puc_sbox[i] + tmp[i]) % SBOX_LEN;swap_uchar(&puc_sbox[i], &puc_sbox[j]); //交换puc_sbox[i]和puc_sbox[j]}}/*** 利⽤S盒⽣成密钥流* The pseudo-random generation algorithm(PRGA)*/static void rc4_prga(unsigned char *puc_sbox, unsigned char *puc_key_stream, unsigned long ul_data_length) {int i = 0;int j = 0;int t = 0;unsigned long k = 0;for (k = 0; k < ul_data_length; k++) {i = (i + 1) % SBOX_LEN;j = (j + puc_sbox[i]) % SBOX_LEN;swap_uchar(&puc_sbox[i], &puc_sbox[j]);t = (puc_sbox[i] + puc_sbox[j]) % SBOX_LEN;/* 为了更清晰理解rc4算法流程,此处保存keystream,不直接进⾏XOR运算 */puc_key_stream[k] = puc_sbox[t];}}/*加解密*/void rc4_crypt(unsigned char *puc_data, unsigned char *puc_key_stream, unsigned long ul_data_length) {unsigned long i = 0;/* 把PRGA算法放在加解密函数中可以不需要保存keystream */for (i = 0; i < ul_data_length; i++) {puc_data[i] ^= puc_key_stream[i];}}int main(int argc, char *argv[]){unsigned char sbox[SBOX_LEN] = {0};char key[SBOX_LEN] = {"abcdefghijklmnopqrstuvwxyz"}; //秘钥内容随便定义char data[512] = "lsRJ@.0 lvfvr#9527";unsigned char puc_keystream[512] = {0};unsigned long ul_data_length = strlen(data);printf("key=%s, length=%d\n\n", key, strlen(key));printf("Raw data string:%s\n", data);printf("Raw data hex:\n");hexdump(data, ul_data_length);/* ⽣成S-box */rc4_ksa(sbox, (unsigned char *)key, strlen(key));/* ⽣成keystream并保存,S-box也会被更改 */rc4_prga(sbox, puc_keystream, ul_data_length);printf("S-box final status:\n");hexdump(sbox, sizeof(sbox));printf("key stream:\n");hexdump(puc_keystream, ul_data_length);/* 加密 */rc4_encrypt((unsigned char*)data, puc_keystream, ul_data_length);printf("cipher hexdump:\n");hexdump(data, ul_data_length);/* 解密 */rc4_decrypt((unsigned char*)data, puc_keystream, ul_data_length);printf("decypt data:%s\n", data);return0;}运⾏⽰例:参考《802.11⽆线⽹络权威指南》第5章百度百科。
C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)
C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)⼀:异或^简单加解密(数字类型)1:原理:异或⽤于⽐较两个⼆进制数的相应位,在执⾏按位"异或"运算时,如果两个⼆进制数的相应位都为1或者都为0,则返回0;如果两个⼆进制数的相应位其中⼀个为1另⼀个为0,则返回1.//对数字加密int P_int_Num, P_int_Key;//定义两个值类型变量string Encryptstr = (P_int_Num ^ P_int_Key).ToString();//加密数值//对数字解密int P_int_Key, P_int_Encrypt;//定义两个值类型变量string Encryptstr =(P_int_Encrypt ^ P_int_Key).ToString();//解密数值⼆:加密解密类public class JiaMiJieMi{#region DES对称加密解密///<summary>加密字符串///</summary>///<param name="strText">需被加密的字符串</param>///<param name="strEncrKey">密钥</param>///<returns></returns>public static string DesEncrypt(string strText, string strEncrKey){try{byte[] byKey = null;byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };byKey = Encoding.UTF8.GetBytes(strEncrKey.Substring(0, 8));DESCryptoServiceProvider des = new DESCryptoServiceProvider();byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);MemoryStream ms = new MemoryStream();CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);cs.Write(inputByteArray, 0, inputByteArray.Length);cs.FlushFinalBlock();return Convert.ToBase64String(ms.ToArray());}catch{return"";}}///<summary>解密字符串///</summary>///<param name="strText">需被解密的字符串</param>///<param name="sDecrKey">密钥</param>///<returns></returns>public static string DesDecrypt(string strText, string sDecrKey){try{byte[] byKey = null;byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };byte[] inputByteArray = new Byte[strText.Length];byKey = Encoding.UTF8.GetBytes(sDecrKey.Substring(0, 8));DESCryptoServiceProvider des = new DESCryptoServiceProvider();inputByteArray = Convert.FromBase64String(strText);MemoryStream ms = new MemoryStream();CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);cs.Write(inputByteArray, 0, inputByteArray.Length);cs.FlushFinalBlock();Encoding encoding = new UTF8Encoding();return encoding.GetString(ms.ToArray());}catchreturn null;}}///<summary>加密⽂件//////</summary>///<param name="m_InFilePath">原路径</param>///<param name="m_OutFilePath">加密后的⽂件路径</param>///<param name="strEncrKey">密钥</param>public static void DesEncryptFile(string m_InFilePath, string m_OutFilePath, string strEncrKey){try{byte[] byKey = null;byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };byKey = Encoding.UTF8.GetBytes(strEncrKey.Substring(0, 8));FileStream fin = new FileStream(m_InFilePath, FileMode.Open, FileAccess.Read);FileStream fout = new FileStream(m_OutFilePath, FileMode.OpenOrCreate, FileAccess.Write);fout.SetLength(0);//Create variables to help with read and write.byte[] bin = new byte[100]; //This is intermediate storage for the encryption.long rdlen = 0; //This is the total number of bytes written.long totlen = fin.Length; //This is the total length of the input file.int len; //This is the number of bytes to be written at a time.DES des = new DESCryptoServiceProvider();CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);//Read from the input file, then encrypt and write to the output file.while (rdlen < totlen){len = fin.Read(bin, 0, 100);encStream.Write(bin, 0, len);rdlen = rdlen + len;}encStream.Close();fout.Close();fin.Close();}catch{}}///<summary>解密⽂件//////</summary>///<param name="m_InFilePath">被解密路径</param>///<param name="m_OutFilePath">解密后的路径</param>///<param name="sDecrKey">密钥</param>public static void DesDecryptFile(string m_InFilePath, string m_OutFilePath, string sDecrKey){try{byte[] byKey = null;byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };byKey = Encoding.UTF8.GetBytes(sDecrKey.Substring(0, 8));FileStream fin = new FileStream(m_InFilePath, FileMode.Open, FileAccess.Read);FileStream fout = new FileStream(m_OutFilePath, FileMode.OpenOrCreate, FileAccess.Write);fout.SetLength(0);//Create variables to help with read and write.byte[] bin = new byte[100]; //This is intermediate storage for the encryption.long rdlen = 0; //This is the total number of bytes written.long totlen = fin.Length; //This is the total length of the input file.int len; //This is the number of bytes to be written at a time.DES des = new DESCryptoServiceProvider();CryptoStream encStream = new CryptoStream(fout, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);//Read from the input file, then encrypt and write to the output file.while (rdlen < totlen){len = fin.Read(bin, 0, 100);encStream.Write(bin, 0, len);rdlen = rdlen + len;}encStream.Close();fout.Close();fin.Close();catch{}}#endregion#region对称加密算法AES RijndaelManaged加密解密private static readonly string Default_AES_Key = "@#kim123";private static byte[] Keys = { 0x41, 0x72, 0x65, 0x79, 0x6F, 0x75, 0x6D, 0x79,0x53,0x6E, 0x6F, 0x77, 0x6D, 0x61, 0x6E, 0x3F };public static string AES_Encrypt(string encryptString){return AES_Encrypt(encryptString, Default_AES_Key);}public static string AES_Decrypt(string decryptString){return AES_Decrypt(decryptString, Default_AES_Key);}///<summary>对称加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是块式加密算法) //////</summary>///<param name="encryptString">待加密字符串</param>///<param name="encryptKey">加密密钥,须半⾓字符</param>///<returns>加密结果字符串</returns>public static string AES_Encrypt(string encryptString, string encryptKey){encryptKey = GetSubString(encryptKey, 32, "");encryptKey = encryptKey.PadRight(32, '');RijndaelManaged rijndaelProvider = new RijndaelManaged();rijndaelProvider.Key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 32));rijndaelProvider.IV = Keys;ICryptoTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor();byte[] inputData = Encoding.UTF8.GetBytes(encryptString);byte[] encryptedData = rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length);return Convert.ToBase64String(encryptedData);}///<summary>对称加密算法AES RijndaelManaged解密字符串//////</summary>///<param name="decryptString">待解密的字符串</param>///<param name="decryptKey">解密密钥,和加密密钥相同</param>///<returns>解密成功返回解密后的字符串,失败返回空</returns>public static string AES_Decrypt(string decryptString, string decryptKey){try{decryptKey = GetSubString(decryptKey, 32, "");decryptKey = decryptKey.PadRight(32, '');RijndaelManaged rijndaelProvider = new RijndaelManaged();rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);rijndaelProvider.IV = Keys;ICryptoTransform rijndaelDecrypt = rijndaelProvider.CreateDecryptor();byte[] inputData = Convert.FromBase64String(decryptString);byte[] decryptedData = rijndaelDecrypt.TransformFinalBlock(inputData, 0, inputData.Length);return Encoding.UTF8.GetString(decryptedData);}catch{return string.Empty;}}///<summary>///按字节长度(按字节,⼀个汉字为2个字节)取得某字符串的⼀部分///</summary>///<param name="sourceString">源字符串</param>///<param name="length">所取字符串字节长度</param>///<param name="tailString">附加字符串(当字符串不够长时,尾部所添加的字符串,⼀般为"...")</param> ///<returns>某字符串的⼀部分</returns>private static string GetSubString(string sourceString, int length, string tailString){return GetSubString(sourceString, 0, length, tailString);}///<summary>///按字节长度(按字节,⼀个汉字为2个字节)取得某字符串的⼀部分///</summary>///<param name="sourceString">源字符串</param>///<param name="startIndex">索引位置,以0开始</param>///<param name="length">所取字符串字节长度</param>///<param name="tailString">附加字符串(当字符串不够长时,尾部所添加的字符串,⼀般为"...")</param>///<returns>某字符串的⼀部分</returns>private static string GetSubString(string sourceString, int startIndex, int length, string tailString){string myResult = sourceString;//当是⽇⽂或韩⽂时(注:中⽂的范围:\u4e00 - \u9fa5, ⽇⽂在\u0800 - \u4e00, 韩⽂为\xAC00-\xD7A3)if (System.Text.RegularExpressions.Regex.IsMatch(sourceString, "[\u0800-\u4e00]+") ||System.Text.RegularExpressions.Regex.IsMatch(sourceString, "[\xAC00-\xD7A3]+")){//当截取的起始位置超出字段串长度时if (startIndex >= sourceString.Length){return string.Empty;}else{return sourceString.Substring(startIndex,((length + startIndex) > sourceString.Length) ? (sourceString.Length - startIndex) : length); }}//中⽂字符,如"中国⼈民abcd123"if (length <= 0){return string.Empty;}byte[] bytesSource = Encoding.Default.GetBytes(sourceString);//当字符串长度⼤于起始位置if (bytesSource.Length > startIndex){int endIndex = bytesSource.Length;//当要截取的长度在字符串的有效长度范围内if (bytesSource.Length > (startIndex + length)){endIndex = length + startIndex;}else{ //当不在有效范围内时,只取到字符串的结尾length = bytesSource.Length - startIndex;tailString = "";}int[] anResultFlag = new int[length];int nFlag = 0;//字节⼤于127为双字节字符for (int i = startIndex; i < endIndex; i++){if (bytesSource[i] > 127){nFlag++;if (nFlag == 3){nFlag = 1;}}else{nFlag = 0;}anResultFlag[i] = nFlag;}//最后⼀个字节为双字节字符的⼀半if ((bytesSource[endIndex - 1] > 127) && (anResultFlag[length - 1] == 1)){length = length + 1;}byte[] bsResult = new byte[length];Array.Copy(bytesSource, startIndex, bsResult, 0, length);myResult = Encoding.Default.GetString(bsResult);myResult = myResult + tailString;return myResult;}return string.Empty;}///<summary>///加密⽂件流///</summary>///<param name="fs"></param>///<returns></returns>public static CryptoStream AES_EncryptStrream(FileStream fs, string decryptKey){decryptKey = GetSubString(decryptKey, 32, "");decryptKey = decryptKey.PadRight(32, '');RijndaelManaged rijndaelProvider = new RijndaelManaged();rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);rijndaelProvider.IV = Keys;ICryptoTransform encrypto = rijndaelProvider.CreateEncryptor();CryptoStream cytptostreamEncr = new CryptoStream(fs, encrypto, CryptoStreamMode.Write);return cytptostreamEncr;}///<summary>///解密⽂件流///</summary>///<param name="fs"></param>///<returns></returns>public static CryptoStream AES_DecryptStream(FileStream fs, string decryptKey){decryptKey = GetSubString(decryptKey, 32, "");decryptKey = decryptKey.PadRight(32, '');RijndaelManaged rijndaelProvider = new RijndaelManaged();rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);rijndaelProvider.IV = Keys;ICryptoTransform Decrypto = rijndaelProvider.CreateDecryptor();CryptoStream cytptostreamDecr = new CryptoStream(fs, Decrypto, CryptoStreamMode.Read);return cytptostreamDecr;}///<summary>///对指定⽂件加密///</summary>///<param name="InputFile"></param>///<param name="OutputFile"></param>///<returns></returns>public static bool AES_EncryptFile(string InputFile, string OutputFile){try{string decryptKey = "";FileStream fr = new FileStream(InputFile, FileMode.Open);FileStream fren = new FileStream(OutputFile, FileMode.Create);CryptoStream Enfr = AES_EncryptStrream(fren, decryptKey);byte[] bytearrayinput = new byte[fr.Length];fr.Read(bytearrayinput, 0, bytearrayinput.Length);Enfr.Write(bytearrayinput, 0, bytearrayinput.Length);Enfr.Close();fr.Close();fren.Close();}catch{//⽂件异常return false;}return true;}///<summary>///对指定的⽂件解压缩///</summary>///<param name="InputFile"></param>///<param name="OutputFile"></param>///<returns></returns>public static bool AES_DecryptFile(string InputFile, string OutputFile){try{string decryptKey = "";FileStream fr = new FileStream(InputFile, FileMode.Open);FileStream frde = new FileStream(OutputFile, FileMode.Create);CryptoStream Defr = AES_DecryptStream(fr, decryptKey);byte[] bytearrayoutput = new byte[1024];int m_count = 0;do{m_count = Defr.Read(bytearrayoutput, 0, bytearrayoutput.Length);frde.Write(bytearrayoutput, 0, m_count);if (m_count < bytearrayoutput.Length)break;} while (true);Defr.Close();fr.Close();frde.Close();}catch{//⽂件异常return false;}return true;}#endregion#region Base64加密解密///<summary>/// Base64是⼀種使⽤64基的位置計數法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
得到的子密码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]);