RC4算法的一个实现(来自SourceForge)
下面贴出了RC4的一个实现。你可以从SourceForge上面下载得到。下载地址是:http://sourceforge.net/projects/rc4dotnet
另外在CodeProject(http://www.codeproject.com/cs/algorithms/rc4csharp.asp)上面也有一个实现,但是据http://rc4dotnet.devhome.org/说CodeProject的实现是有问题的。我没有仔细地测试过这两个实现。这儿的文件是SourceForge上面的源文件,供大家参考:/Files/FlyingBread/rc4dotnet.zip
下面贴出SourceForge的代码,供大家参考
/* vim: set expandtab shiftwidth=4 softtabstop=4 tabstop=4: */
/**
* RC4.NET 1.0
*
* RC4.NET is a petite library that allows you to use RC4
* encryption easily in the .NET Platform. It's OO and can
* produce outputs in binary and hex.
*
* (C) Copyright 2006 Mukul Sabharwal [http://mjsabby.com]
* All Rights Reserved
*
* @link http://rc4dotnet.devhome.org
* @author Mukul Sabharwal <mjsabby@gmail.com>
* @version $Id: RC4.cs,v 1.0 2006/03/19 15:35:24 mukul Exp $
* @copyright Copyright © 2006 Mukul Sabharwal
* @license http://www.gnu.org/copyleft/lesser.html
* @package RC4.NET
*/
using System;
using System.Text;
/**
* RC4 Class
* @package RC4.NET
*/
public class RC4 : System.Web.UI.Page { /* inherits Page for ASP.NET */
/**
* Get ASCII Integer Code
*
* @param char ch Character to get ASCII value for
* @access private
* @return int
*/
private static int ord(char ch)
{
return (int)(Encoding.GetEncoding(1252).GetBytes(ch + "")[0]);
}
/**
* Get character representation of ASCII Code
*
* @param int i ASCII code
* @access private
* @return char
*/
private static char chr(int i)
{
byte[] bytes = new byte[1];
bytes[0] = (byte)i;
return Encoding.GetEncoding(1252).GetString(bytes)[0];
}
/**
* Convert Hex to Binary (hex2bin)
*
* @param string packtype Rudimentary in this implementation
* @param string datastring Hex to be packed into Binary
* @access private
* @return string
*/
private static string pack(string packtype, string datastring)
{
int i, j, datalength, packsize;
byte[] bytes;
char[] hex;
string tmp;
datalength = datastring.Length;
packsize = (datalength/2) + (datalength % 2);
bytes = new byte[packsize];
hex = new char[2];
for (i = j = 0; i < datalength; i+=2)
{
hex[0] = datastring[i];
if (datalength - i == 1)
hex[1] = '0';
else
hex[1] = datastring[i + 1];
tmp = new string(hex, 0, 2);
try { bytes[j++] = byte.Parse(tmp, System.Globalization.NumberStyles.HexNumber); }
catch {} /* grin */
}
return Encoding.GetEncoding(1252).GetString(bytes);
}
/**
* Convert Binary to Hex (bin2hex)
*
* @param string bindata Binary data
* @access public
* @return string
*/
public static string bin2hex(string bindata)
{
int i;
byte[] bytes = Encoding.GetEncoding(1252).GetBytes(bindata);
string hexString = "";
for (i = 0; i < bytes.Length; i++)
{
hexString += bytes[i].ToString("x2");
}
return hexString;
}
/**
* The symmetric encryption function
*
* @param string pwd Key to encrypt with (can be binary of hex)
* @param string data Content to be encrypted
* @param bool ispwdHex Key passed is in hexadecimal or not
* @access public
* @return string
*/
public static string Encrypt(string pwd, string data, bool ispwdHex)
{
int a, i, j, k, tmp, pwd_length, data_length;
int[] key, box;
byte[] cipher;
//string cipher;
if (ispwdHex)
pwd = pack("H*", pwd); // valid input, please!
pwd_length = pwd.Length;
data_length = data.Length;
key = new int[256];
box = new int[256];
cipher = new byte[data.Length];
//cipher = "";
for (i = 0; i < 256; i++)
{
key[i] = ord(pwd[i % pwd_length]);
box[i] = i;
}
for (j = i = 0; i < 256; i++)
{
j = (j + box[i] + key[i]) % 256;
tmp = box[i];
box[i] = box[j];
box[j] = tmp;
}
for (a = j = i = 0; i < data_length; i++)
{
a = (a + 1) % 256;
j = (j + box[a]) % 256;
tmp = box[a];
box[a] = box[j];
box[j] = tmp;
k = box[((box[a] + box[j]) % 256)];
cipher[i] = (byte)(ord(data[i]) ^ k);
//cipher += chr(ord(data[i]) ^ k);
}
return Encoding.GetEncoding(1252).GetString(cipher);
//return cipher;
}
/**
* Decryption, recall encryption
*
* @param string pwd Key to decrypt with (can be binary of hex)
* @param string data Content to be decrypted
* @param bool ispwdHex Key passed is in hexadecimal or not
* @access public
* @return string
*/
public static string Decrypt(string pwd, string data, bool ispwdHex)
{
return Encrypt(pwd, data, ispwdHex);
}
}
/**
* RC4.NET 1.0
*
* RC4.NET is a petite library that allows you to use RC4
* encryption easily in the .NET Platform. It's OO and can
* produce outputs in binary and hex.
*
* (C) Copyright 2006 Mukul Sabharwal [http://mjsabby.com]
* All Rights Reserved
*
* @link http://rc4dotnet.devhome.org
* @author Mukul Sabharwal <mjsabby@gmail.com>
* @version $Id: RC4.cs,v 1.0 2006/03/19 15:35:24 mukul Exp $
* @copyright Copyright © 2006 Mukul Sabharwal
* @license http://www.gnu.org/copyleft/lesser.html
* @package RC4.NET
*/
using System;
using System.Text;
/**
* RC4 Class
* @package RC4.NET
*/
public class RC4 : System.Web.UI.Page { /* inherits Page for ASP.NET */
/**
* Get ASCII Integer Code
*
* @param char ch Character to get ASCII value for
* @access private
* @return int
*/
private static int ord(char ch)
{
return (int)(Encoding.GetEncoding(1252).GetBytes(ch + "")[0]);
}
/**
* Get character representation of ASCII Code
*
* @param int i ASCII code
* @access private
* @return char
*/
private static char chr(int i)
{
byte[] bytes = new byte[1];
bytes[0] = (byte)i;
return Encoding.GetEncoding(1252).GetString(bytes)[0];
}
/**
* Convert Hex to Binary (hex2bin)
*
* @param string packtype Rudimentary in this implementation
* @param string datastring Hex to be packed into Binary
* @access private
* @return string
*/
private static string pack(string packtype, string datastring)
{
int i, j, datalength, packsize;
byte[] bytes;
char[] hex;
string tmp;
datalength = datastring.Length;
packsize = (datalength/2) + (datalength % 2);
bytes = new byte[packsize];
hex = new char[2];
for (i = j = 0; i < datalength; i+=2)
{
hex[0] = datastring[i];
if (datalength - i == 1)
hex[1] = '0';
else
hex[1] = datastring[i + 1];
tmp = new string(hex, 0, 2);
try { bytes[j++] = byte.Parse(tmp, System.Globalization.NumberStyles.HexNumber); }
catch {} /* grin */
}
return Encoding.GetEncoding(1252).GetString(bytes);
}
/**
* Convert Binary to Hex (bin2hex)
*
* @param string bindata Binary data
* @access public
* @return string
*/
public static string bin2hex(string bindata)
{
int i;
byte[] bytes = Encoding.GetEncoding(1252).GetBytes(bindata);
string hexString = "";
for (i = 0; i < bytes.Length; i++)
{
hexString += bytes[i].ToString("x2");
}
return hexString;
}
/**
* The symmetric encryption function
*
* @param string pwd Key to encrypt with (can be binary of hex)
* @param string data Content to be encrypted
* @param bool ispwdHex Key passed is in hexadecimal or not
* @access public
* @return string
*/
public static string Encrypt(string pwd, string data, bool ispwdHex)
{
int a, i, j, k, tmp, pwd_length, data_length;
int[] key, box;
byte[] cipher;
//string cipher;
if (ispwdHex)
pwd = pack("H*", pwd); // valid input, please!
pwd_length = pwd.Length;
data_length = data.Length;
key = new int[256];
box = new int[256];
cipher = new byte[data.Length];
//cipher = "";
for (i = 0; i < 256; i++)
{
key[i] = ord(pwd[i % pwd_length]);
box[i] = i;
}
for (j = i = 0; i < 256; i++)
{
j = (j + box[i] + key[i]) % 256;
tmp = box[i];
box[i] = box[j];
box[j] = tmp;
}
for (a = j = i = 0; i < data_length; i++)
{
a = (a + 1) % 256;
j = (j + box[a]) % 256;
tmp = box[a];
box[a] = box[j];
box[j] = tmp;
k = box[((box[a] + box[j]) % 256)];
cipher[i] = (byte)(ord(data[i]) ^ k);
//cipher += chr(ord(data[i]) ^ k);
}
return Encoding.GetEncoding(1252).GetString(cipher);
//return cipher;
}
/**
* Decryption, recall encryption
*
* @param string pwd Key to decrypt with (can be binary of hex)
* @param string data Content to be decrypted
* @param bool ispwdHex Key passed is in hexadecimal or not
* @access public
* @return string
*/
public static string Decrypt(string pwd, string data, bool ispwdHex)
{
return Encrypt(pwd, data, ispwdHex);
}
}