admin 管理员组文章数量: 1086019
2024年4月25日发(作者:laravel访问路由方式)
维普资讯
…………………………………………………………
实用第一 智慧密集
称加解密算 RC6 j的 实现ll
在各种对称加密算法中,RSA公司先后推出了RC2、RC5
和RC6等密码算法,其中RC6是由Rivest、Robshaw、Sidney
和Yin等人设计。RC6是为_『有效抵抗对RC5的攻击而设计出
的强化版本,同时RC6也是AES首批15个候选算法之一。可
以在许多领域找到RC6的身影,比如在无线数据传输应用方面
的AVR高速嵌入式单片机的加解密部分;为保护手机上的私
人照片、录音、视频和私人文件的Smartphoneware软件包等。
Windows Visual Studio.NET在System.Security.Cryptography命名
空间提供了众多的加解密类,其中就包括RC2,但未提供RC6
算法。笔者在对RC6算法进行认真的分析后,对由stirng型数
据读入的密钥数据是转换为128位密钥的过程进行了研究,同
时以128位输入和输出块,2O轮迭代和256位输入密钥为
例,结合.NET,用C#语言实现了RC6算法。
一
图程序运行效果
、
RC6算法
RC6可表示为RC6一w/r/b,其中W是RC6中数据运算单
charU asciiChars意new char、ascii.
GetCharCount(asciiBytest 0。asciiBytes.Length、
asciL GetChars(asciiBytes。0 asciiB ̄es Length,。 。
asciiChars
位“字”的长度,r是迭代轮数、b是密钥种子按字节的长
度,本算法由三部分组成,分别为密钥扩展算法、加密算法和
解密算法,共使用了六种基本运算:①模2w加法运算,表示
算法中使用两个常数P32和Q32,其中:
P32=odd《《e一2l¥2 ¥32)=Oxb7el5163;
为“+”;②模2w减法运算,表示为“一”;③逐位异或运
算,表示为o;④循环左移,字a循环左移b比特表示为
“
Q32=odd((phi一1) 2 32)=Ox9e3779b9;
e是自然对数的底(2.71828…),phi是黄金分割率
(1.61803…),循环左移函数RotL和循环右移函数RotR
public Uint RotL(Uintx,Uinty,intw) 0
a<<<b”;⑤循环右移,字a循环右移b比特表示为
a>>>b”;⑥模2w乘法,表示为“X”。为了满足AES的
“
要求,RC6的输入和输出块均为128位,迭代轮数为20轮,
密钥长度一般取128/192/256位等三种,其实现可在多种程
序设计语言下进行设计,但多数资料的源代码对其实现有几个
缺陷。一是均以卜六进制数给出128为密钥,从而对以string
型数据读入的密钥数据是怎样转换为128位密钥的过程进行了
回避;二是对w/r/b这!个重要参数进行硬编码,从而源代
return((x<<(int)(y&OxFF))I(x>>(int)((w-(y&
OxFFI)))):
、
publicUintRotR(Uintx.Uinty.intW、 I :
|
謦。
码的灵活性不强;二三足几乎都是以c语言实现其算法,其他程
序版本不易找到。程序运行界面如下图所示。
)
return{{x>>{int){y&OxFF))I{×<<{int)《{w 0{y&
OxFF)))));
二、公共部分
c撑下stirng型Unicode字符集转换为字节流char【】的代码
如下
byte【】asciiBytes=Encoding。Convert(unicode.asci
unicode。GetBytes(this.m_sEncryptionKey)):
三、密钥扩展
1.密钥类型转换
将密钥m sEneryptionKey从string型转换为Uint字数组
11一WordBoxo
≥“20 0翟8技.8巧与蠢护 鼍-嗜疆
维普资讯
… -
COMPUT硼PROG咖MING删眦舢C …………………………………………¨
为两字节16位。在这里我们使用“little—endian fashion”字节
序,即低位在前,高位在后的方式。为简明起见,输入明文均
一
般的密码学书籍均直接给出128位十六进制数作为用户
密钥,而对于以string型数据读入的密钥数据是怎样转换为128
位密钥的过程进行了回避。笔者采用两步来实现这一过程,其
一
为ASCII字符,由此,在byte型数组input中,低位的input
【0]、input[2]、.…input[30]这l6个字节共计128位数据就
是明文数据。这128位数据转换为4个32位值的方法的代码
如下:
En ̄ingeric_default=Encoding.Unicode;
byte【l input;enc_default.GetBytes
是将密钥m_sEncryptionKey从string型转换为字节数组asci-
ichars。其二将字节数组asciichars转换为Uint字数组
n ordBox。首先注意到ASCII字符集,通过对asciichars【j]做
0xFF运算,确保高位为零,然后进行循环左移运算。Uint为
32位长,于是256位密钥要填充8个Uint数,这8个Uint数
是怎样填充的呢?这里采取的步骤是,做32轮循环,每四轮
填充一个Uint数,那么32轮后就填充了8个Uint数。每四轮
是这样填充的,第一轮字节数不移位,填充Uint数的0—7
位,第二轮字节数左移8位,填充Uint的8—15位,第三轮字
节数左移16位,填充Uint的16—23位,第四轮字节数左移
24位,填充Uint的24—3l位,m_nchioherLen为密钥字节数,
本文为32字节,也就是256位密钥,核心代码如下:
for(j 0:j<m_nChipherLen;j++)
{
temp (Uint)(asciiChars…&0xFF)<<(8-k(j%4}):
n
_
WordBox【j/41+=(Uint)tem p:
)
2.混合密钥
这一步混合密钥字数组n_WordBox到扩展密钥数组
m
_
nKey—ExpandBox中,其中为了保证这两个数组在循环中不越
界,程序采取在单轮循环时i,j的值加l模各自对应的数组长
度的方法,实现的核心代码如下:
this.m-J1KeyExpandBox【01=P32;
fof(j=1:j<2* ̄RoundsLen+4Ij++)
{
this.mj1KeyExpandBox【j】=(byte)(m_nKeyExpandBox【j一
11+Q32):
} ,
k。3 Math.Max(m.,nWordLen,2 哪RoundsLen+4):
for(i=0,j:0:k>0;k一一)
{
A RotL(m_nKeyExpandBox【i1+A+B.3,m_nWord):
m_nKeyExpandBox…=(byte)A;
B 4- A:
B=RotL(n_WordBoxfj】+B,B,m_nWord):
n_WordBoxfjJ B
l=(i+1)%(2木rr1_ RoundsLen+4):
j=(j+1)%m_nWordLen;
)
四、RC6的加密
明文m__sInClearText由stirng型转换为字节数组input并进
而转换为4个32位值A、B、c、D。
在c#中,string型为unicode字符集,即每个输入字符均
(this.mjInClearText):
fof(k=0:k<4:k 4-+)
(
A+:(Uint)(input【2}k】&0xFF)<<(8}k):
B+=lUint)(input【2}k+8】&0xFF)<<(8 k):
C+=(Uim)(input【2}k+161&0xFF)<<(8}k):
D+=fUint)finputf2}k+24 J&0xFF)<<f8}k):
}
将扩展密钥数组n_I.ncExpandBox和输入A、B、C、D一起
进行基本的加密操作。
本步骤中涉及到A、B、C、D四个变量的循环赋值,即第
一
次为(A、B、C、D),第二次为(B、C、D、A),第三次为
(C、D、A、B)….
依此类推,为此程序使用一个中间变量temp,保证每次赋
值正常,实现核心代码为:
B+=n
_
LocKeyExpandBox【O1
D+=n
_
LocKeyExpandBox【1】:
for(i=1:i《=m_nRoundsLen;i++)
{
U;RotL(D I2¥D+1).5,m_nWord):
下t RotL(B}(2}B+1),5 m_nWord):
A=RotL(A^T.U,m』Word)+n_kocKeyExpandBox【2}i1:
C RotL(C U,T,m_nWord)+n_LocKeyExpandBox【2}i+
11:
temp=A:
A=B:
B=C:
C=D:
-
D:temp;
}
A+:n
_
LocKeyExpandBox【2 m_nRoundsLen+2】:
C+=n_LocKeyExpandBox【2 m_nRoundsLen+31:
转换A、B、C、D为一个字节数组output并进而转换为
stirng型m_sCryptedText。这一步是第一步的逆操作,实现代码
如下:
for(k t0:k《4;k++}
—
Ou ̄ut[2木kl茹(byte)((A>>(8栽k))&0xFF)
、 I
fOr(k k≮ k七年、
维普资讯
…………………………………………………………
实用第一 智慧密集
{
0utpLlt【2木k+8】=(byte)((B>>(8率k))&0xFF)
)
for(k=O:k<4:k++)
{
output【2 k+16】=(byte)((C>>(8 k))&0xFF):
}
for(k=O k<4:k++)
{
output【2 k+24】=(bVte)((D>>(8 k))&0xFF)=
}
charl】outarrchar=new char【enc_default.GetCharCount
(output 0,output.Length)】:
eric
_
default.GetChars(output,0,output.Length,outar-
rchar,O)=
this.m
_
sCryptedText=newstring(Outarrchar,0,outar-
rchar.Length);
byte[1 output1=enc_default.GetBytes
(this.m_sCryptedText):
五、RC6的解密
RC6的解密算法与加密算法差别较大,其核心代码如下:
C一:n
_
LocKeyExpandBox【2 m_nRoundsLen+3】:
A一:n_LocKeyExpandBox【2 m』RoundsLen+2】:
for(i=1:i<=m_nRoundsLen;i++)
{
temp=D:
D=C:
C=B:
B:A:
A=temp;
U:RotL(D (2 D+1) 5 m_nWord):
T=RotL(B (2 B+1),5,m-nWord):
C=RotR(C—n_LocKeyExpandBox【2
(m_nRoundsLen—i)+3】,T,m_nWord) U:
A=RotR(A—n_LocKeyExpandBox【2
(m_nRoundsLen—i)+2】,U,m_nWord) T:
}
D一=n
.
LocKeyExpandBox【1】:
B一=n LocKeyExpandBox【0】:
六、程序说明
提供了一种针对以string型数据读入的密钥数据转换为位
密钥字的过程,同时使用256位密钥。通过适当修改各参数的
值,就可以使用128/192位密钥。
(收稿日期:2008年6月5日)
葡iii 溆话与 l_}
暑期严防黑客潮!上网需“杀毒"
“密保”双保险
随着高、中考的结束,以及7月1日暑期长假的临
近,越来越多的中学生开始陆续放假。近日,在各大黑
客论坛以及贴吧中,关于学习和交流黑客技术的帖子开
始明显增多,其中发帖者不乏刚刚放假的中学生。江民
反病毒专家因此提醒广大电脑用户,暑假来临,上网时
务必谨防黑客利用病毒盗取各种有价帐号、密码,避免
自身财产遭到不必要的损失。
在黑客贴吧里,关于拜师或收徒学习黑客技术的帖
子近日格外多了起来,“如何破解QQ密码”“教你批量
抓鸡”等帖子随处可见。其中,初学者交流的内容包括
如何使用“流光”等端口扫描工具,扫描在线电脑的IP
地址和开放端El,然后通过运行一些命令得到对方的计
算机名和操作系统版本,最后通过对方的共享文件或默
认共享进入对方主机,其中还涉及到如何暴力破解密
码。层次稍高一些的发帖者已经开始交流如何通过
HOOK技术修改SSDT表,从而做出能够逃避杀毒软件的
免杀木马,进行在网上传播进行盗号窃密等违法行为。
据江民反病毒中心监测发现,6月第3周,网游盗
号类病毒疫情大幅上升,此类病毒占据了病毒排行榜前
三,其中”网游大盗”变种感染计算机数量较上周上升了
39.34%,位列病毒排行榜榜首,”网游窃贼”变种更是较
前一周暴增了148%,位列病毒排行榜亚军。此类病毒无
一
例外的把目标对准目前流行的网络游戏,盗取目标除
了帐号密码外,还包括游戏分值、虚拟装备、游戏币、
游戏点卡、仓库密码、角色等级、金钱数量、所在区
服、计算机名称等所有的信息资料。包括“征途” “天
堂”“魔兽世界”“完美世界Online”“剑侠情缘liOn—
line”等几乎所有的流行网游都被病毒盯上,严重威胁广
大网络游戏玩家的帐号、密码安全。
江民反病毒专家提醒广大电脑用户和网络游戏玩
家,暑假上网前,务必使用杀毒软件的“系统诊断”功
能,对电脑做全面的安全检查,打好系统漏洞补丁,关
闭不必要的端口和服务,关闭电脑中的所有共享。网络
游戏玩家可以配合使用“密保”软件,将游戏帐号密码
输入密保,配合杀毒软件给电脑加上双重保险,减少帐
号、密码被盗的风险。此外,反病毒专家也提醒广大对
黑客技术感兴趣的中学生朋友,暑假期间可以学习和研
究一下黑客技术,但千万不要用来进行盗号窃密等违法
行为,不要因为图一时之快,给自己带来终生遗憾。
版权声明:本文标题:对称加解密算法RC6的C#实现 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1714037257a662627.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论