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()会改变非法字符的编码
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()会改变非法字符的编码
相关文章推荐
- POJ 1769 Minimizing maximizer
- Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
- samba配置
- 蓝桥杯 BASIC_02 基础练习 01字串
- 设计模式之单例设计模式(Singleton)
- xcode里面的查找功能
- Java 文件上传组件 Apache Commons FileUpload 应用指南(二)——FileUpload如何工作?
- 第5次作业
- Highcharts无法绘制半饼图
- apache、tomcat部署——在一台主机内
- 蓝桥杯 BASIC_01 基础练习 闰年判断
- 《java入门第一季》之正则表达式小案例
- 《java入门第一季》之正则表达式小案例
- 表达式组成方案
- Hust oj 1334 最好的心情(DP+DFS)
- zh-cn en-uk、zh-tw表示语言(文化)代码与国家地区对照表(最全的各国地区对照表)
- Javascript中循环时怎么传递参数值
- rsync+inotify实现对web服务器上的文件自动同步
- Yii AR Model查询
- 工具类IOS应用