密文:密文第i字节=明文第i字节^密钥流第i字节
密钥流:根据明文和密钥生成,密钥流长度和明文长度一样
状态向量S或IV:长度256个8位,256个字节
临时向量T:长度也是256个8位,256个字节,如果密钥的长度是256字节,就直接把密钥的值赋给T,否则,轮转地将密钥的每个字节赋给T;
密钥K:密钥长度与明文长度、密钥流的长度没有必然关系,通常密钥的长度取为16字节(128比特)
1.初始化S和T:
S的值升序被置为0-255
T的值是密钥K的值的循环复制
2.S的初始置换
用T产生S的初始置换,置换伪码如下
j = 0
for (i = 0 i <256 i++){
j = (j + S[i] + T[i]) mod 256
swap(S[i] , S[j])
}
因为对S的操作仅是交换,S仍然包含所有值为0-255的元素。
3.密钥流的生成
i , j = 0
while (true){
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap(S[i] , S[j])
t = (S[i] + S[j]) mod 256
k = S[t]
}
k即为密钥流的一个字节
WEP加密、RC4算法
RC4
RSA实验室研发的对称加密 流 算法
实现简单
速度快
加密: 对明文流和密钥流进行XOR计算
解密: 对密文流和密钥流进行XOR计算
RC4算法key由两个过程生成
合并IV和PSK,利用Key Scheduling Algorithm (KSA)算法生成起始状态表
Pseudo-Random Generation Algorithm (PRGA)算法生成最终密钥流
rc4算法中加密用的key就是key本身,一般长度16字节128位
rc4md5中加密用的key是md5(key+iv)得到结果位16字节hash值128位
RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ronald Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。RC4起初是用于保护商业机密的。但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了。RC4也被叫做ARC4(Alleged RC4——所谓的RC4),因为RSA从来就没有正式发布过这个算法。
import javax.crypto.Cipherimport javax.crypto.spec.SecretKeySpec
import javax.xml.bind.DatatypeConverter
public class Test {
public static void main(String[] args) throws Exception{
Cipher cipher=Cipher.getInstance("RC4")
String pwd="123456"
String ptext="Hello World 你好"
SecretKeySpec key=new SecretKeySpec(pwd.getBytes("UTF-8"), "RC4")
cipher.init(Cipher.ENCRYPT_MODE, key)
byte[] cdata =cipher.update(ptext.getBytes("UTF-8"))
//解密
cipher.init(Cipher.DECRYPT_MODE, key)
byte[] ddata =cipher.update(cdata)
System.out.println("密码: "+pwd)
System.out.println("明文: "+ptext)
System.out.println("密文: "+DatatypeConverter.printHexBinary(cdata))
System.out.println("解密文: "+new String(ddata,"UTF-8"))
}
} 密码: 123456
明文: Hello World 你好
密文: 489D120B4B1342F30D5B46961D83E12B4875
解密文: Hello World 你好
RC4已经不太安全,只能用于一般加密,不能用于金融等紧要场合。