本人写的C#类,该算法完善了《朱明海--维普资讯网--对称加解密算法RC6的C#实现》未完善的源码,以供大家学习!
该RC6加密解密算法如有错误,请大家批评指正。
更多内容请参考:本人写的 C#_RC6加密解密方法 http://download.youkuaiyun.com/source/2864830
#region
using System;
using System.Collections.Generic;
using System.Text;
namespace WindowsApplication1
{
class RC6
{
/// <summary>
/// 对称加解密算法RC6的C#实现
/// 公开维普网_朱明海先生未公布的源码
/// 程序完善设计者:四川威远_老耙子 先生
/// 2010-11-28
/// 本程序只提供了明文长度32的算法。
/// 如有需要,请与本人联系。
/// Mail:chscwyyg@163.com 电话:0832-8229211
/// </summary>
private string m_sEncryptionKey; //密码方法通过KEY属性返回值
public string m_sCryptedText; //加密解密字符串返回值
private int m_nChipherlen; //密码字节数,控制加密最低为128,最好256,间192,有三种选择种16,24,32
private const int m_nWord = 32;
private const int r = 20;
private const int c = 4;
private uint[] m_nKeyExpandBox; //系统密钥数组
uint[] n_WordBox; //用户私有密钥
public Encoding Enc_default = Encoding.Unicode;
/// <summary>
/// 左位移运算函数
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <param name="w"></param>
/// <returns></returns>
///
public uint ROTL(uint x, uint y, int w)
{ return ((x << (int)(y & (0xFF))) | (x >> (int)(w - (y & (0xFF))))); }//或:return ((x << (int)(y & (w-1))) | (x >> (int)(w - (y & (w-1)))));
/// <summary>
/// 右位移运算函数
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <param name="w"></param>
/// <returns></returns>
public uint ROTR(uint x, uint y, int w)
{ return ((x >> (int)(y & (0xFF))) | (x << (int)(w - (y & (0xFF))))); }//或:return ((x >> (int)(y & (w-1))) | (x << (int)(w - (y & (w-1)))));
/// <summary>
/// 构造函数
/// </summary>
public RC6()
{
IV = 16; //如果用户没有设置加密方式系统默认为128位加密
// IV返回m_nChipherlen
m_nKeyExpandBox = new uint[8 * m_nChipherlen]; //密钥数组大小为加IV*8
}
/// <summary>
/// 构造函数可输入加密向量
/// </summary>
/// <param name="iv"></param>
public RC6(int iv)
{
IV = iv; //返顺 m_nChipherlen
this.m_nKeyExpandBox = new uint[8 * m_nChipherlen];
}
/// <summary>
/// 定义一个属性,通过属性输入用户密钥并返回
/// 存储到m_sEncryptionKey
/// </summary>
public string KEY
{
get { return this.m_sEncryptionKey; }
set { this.m_sEncryptionKey = value; }
}
/// <summary>
/// 加密向量选择
/// 128方式IV=16
/// 192方法IV=24
/// 256方法IV=32
/// </summary>
public int IV
{
get { return m_nChipherlen; }
set { m_nChipherlen = value; }
}
/// <summary>
/// 加密向量验证函数
/// 有错误返回最小或最大的向量设置
/// </summary>
/// <returns></returns>