您的位置:首页 > 其它

RC4加密算法及其scala实现

2016-05-11 13:11 274 查看
最近用到了rc4算法和base64简单写一篇关于rc4的文章。 

RC4算法的特点是算法简单,运行速度快,而且密钥长度是可变的,可变范围为1-256字节(8-2048比特),在如今技术支持的前提下,当密钥长度为128比特时,用暴力法搜索密钥已经不太可行,所以可以预见RC4的密钥范围任然可以在今后相当长的时间里抵御暴力搜索密钥的攻击。实际上,如今也没有找到对于128bit密钥长度的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比特)。

下面是scala代码,由于scala中Byte型和Java中一样都是-128到127,所以有一些防止越界的操作:

class RC4( val data:Array[Byte],key:String){

private val s=new Array[Byte](256)//状态向量S
val len=key.length
rc4_init()
private def rc4_init(){
val t=new Array[Byte](256)//备用向量T
for (i <- 0 to 255){
s(i)=i.toByte
t(i)=key(i%len).toByte
}
var j=0
var tmp:Byte=0
for (i <- 0 to 255){
j=(j+s(i)+t(i)+256)%256
//println(j)
tmp =s(i)
s(i)=s(j)
s(j)=tmp
}
}
def rc4_crypt() :Array[Byte]={
val Data=new Array[Byte](data.length)
for (i <-0 until(data.length)){
Data(i)=data(i)
}
var k=0
var i=0
var j=0
var t=0
var tmp:Byte=0
for(k <- 0 until(Data.length)){
i=(i+1)%256
j=(j+s(i)+128)%256
tmp=s(i)
s(i)=s(j)
s(j)=tmp
t=(s(i)+s(j)+256)%256
Data(k)=(Data(k)^s(t)).toByte
}
Data
}
}

注意:使用new String()会改变非法字符的编码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: