本文已参与「新人创作礼」活动,一起开启掘金创作之路。
public class RC4 {
/**
* RC4算法加密与解密文本
* @author ArtemisKhryso
* @param textInput 文本输入
* @param key 密匙
* @return
*/
public static String RivestCipher4(String textInput,String key) {
// 状态适量S
int[] S = new int[256];
// 临时矢量T
byte[] T = new byte[256];
// S中元素的值被置为从0~255按升序赋初始值
for (int i = 0;i<256;i++) {
S[i] = i;
}
/**
* 如果密钥K的长度为256字节,则将K赋给T。
* 否则,若密钥长度为keylen个字节,则将K的值赋给T的前keylen个元素,
* 并循环重复用K的值赋给T剩下的元素,直到T的所有元素都被赋值。
*/
if(key.length() == 256){
for (int i = 0;i<256;i++) {
T[i]=(byte)key.charAt(i);
}
}else{
for (int i = 0;i<256;i++) {
T[i]=(byte)key.charAt((i % key.length()));
}
}
/**
* 然后用T产生S的初始置换。从S[0]~S[255],对每个S[i],
* 根据由T[i]确定的方案,将S[i]置换为S中的另一字节
*/
int j=0;
int temp;
for (int i = 0;i<255;i++) {
j=(j+S[i]+T[i]) % 256;
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
int i=j=0;
// 输入文本字符数组,加密解密字符数组
char[] inputChar = textInput.toCharArray();
char[] outputChar = new char[inputChar.length];
for(short x = 0;x<inputChar.length;x++) {
/**
* 矢量S一旦完成初始化,输入密钥就不再被使用。
* 密钥流的生成是从S[0]到S[255],对于每个S[i],
* 根据当前S的值,将S[i]与S的另一字节置换。
*/
i = (i+1) % 256;
j = (j+S[i]) % 256;
temp = S[i];
S[i]=S[j];
S[j]=temp;
// 根据这两个置换的数组元素内容,将其相加
int t = (S[i]+S[j]) % 256;
// 取出相加后的数字指向的数组元素内容
int Y = S[t];
// 转成字符
char CY = (char)Y;
// 加密中,将Key的值与明文字节异或;解密中,将key的值与密文字节异或。
outputChar[x] =(char)( CY ^ inputChar[x] ) ;
}
return new String(outputChar);
}
public static void main(String[] args) {
String inputStr = "May the Force be with you!";
String key = "gdupt";
String str = RivestCipher4(inputStr,key);
//打印加密后的字符串
System.out.println("加密后的字符串:" + str);
//打印解密后的字符串
System.out.println("解密后的字符串:" + RivestCipher4(str,key));
}
}