rc4和rc4md5

JavaScript025

rc4和rc4md5,第1张

IV及初始化向量S,

密文:密文第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.Cipher

import 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已经不太安全,只能用于一般加密,不能用于金融等紧要场合。