JAVA实现RC4加密

本文详细介绍了RC4算法,包括其简洁的构造、输出反馈工作方式、密钥生成过程以及在编码和解码中的应用。重点讲解了初始化S和T数组、密钥流生成和异或操作。通过实例演示了如何在Java中实现RC4算法及其在实际加密过程中的使用。
摘要由CSDN通过智能技术生成

 RC4算法

RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码

RC4算法特点:(1)、算法简洁易于软件实现,加密速度快,安全性比较高;

                       (2)、密钥长度可变,一般用256个字节。

        对称密码算法的工作方式有四种:电子密码本(ECB, electronic codebook)方式、密码分组链接(CBC, cipherblock chaining)方式、密文反馈(CFB, cipher-feedback)方式、输出反馈(OFB, output-feedback)方式。

         RC4算法采用的是输出反馈工作方式,所以可以用一个短的密钥产生一个相对较长的密钥序列

         OFB方式的最大的优点是消息如果发生错误(这里指的是消息的某一位发生了改变,而不是消息的某一位丢失),错误不会传递到产生的密钥序列上;缺点是对插入攻击很敏感,并且对同步的要求比较高。

步骤:1.  ST初始化

        2. 数据表S的初始置换

        3. 密钥流生成   ---- 伪随机数生成方法(PGRA

        4. 加密    ---异或

        5. 解密    ---异或

 

1、初始化S和T

for i=0 to 255 do

   S[i]=i;

   T[i]=K[ imod keylen ];

2、初始排列S

j=0;

for i=0 to 255 do

   j= ( j+S[i]+T[i])mod256;

   swap(S[i],S[j]);//循环执行完成后,数据表S被伪随机化;

3、产生密钥流

i,j=0;

for r=0 to len do  //r为明文长度,r字节

   i=(i+1) mod 256;

   j=(j+S[i])mod 256;

   swap(S[i],S[j]);

   t=(S[i]+S[j])mod 256;

   k[r]=S[t];

import java.util.Scanner;
public class RC4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 codebooksc c1 = new codebooksc();
         Scanner sc =new Scanner(System.in);
         System.out.println("密钥:");
         String k1 = sc.next();
         int m = k1.length();//密钥长度
         char K[] = new char[m];//密钥空间
         
         for(int i=0;i<m;i++)
         {
        	 K[i] = k1.charAt(i);
         }
         Integer S[] = new Integer [256];//S表
 		 Integer T[] = new Integer [256];//T表
 		 
 	      c1.permutateS(S, T, K);//S表排序
 	      System.out.println("明文:");
 		String p = sc.next();
 		int n = p.length();
 		char P[] = new char[n];//明文空间;
 		for(int i=0;i<n;i++) {
 			P[i]=p.charAt(i);
 		}
 		char keys[] = new char[n];//密钥流;
 	    c1.GenerateKeys(S, n,keys);//产生密钥流
 		
 		char C[] = new char[n];//密文空间;
 		System.out.println();
 		String ccc = c1.encrypt(keys, n, P,C);
 		System.out.println("密文:");
 		System.out.print(ccc);
 		for(int i=0;i<n;i++)
		 {
			 C[i] = ccc.charAt(i);
		 }
 		System.out.println();
 		String pp =c1.decrypt( keys, n, C);
 		System.out.println("明文是:");
 		System.out.println(pp);
 		
	}

}
class codebooksc{
	public void permutateS(Integer S[],Integer T[],char K[]) {//初始排列S表;
		for(int i=0;i<256;i++) {
			
			S[i] = i;
		}
		int t[] = new int[256];
			for(int i=0;i<256;i++) {				
		   t[i] = K[i%K.length ];
		   T[i] = t[i];
			}
		int j=0;
		for(int i=0;i<255;i++)
		{
			j = (j+S[i]+T[i])%256;
			int temp;         //交换S【i】与S【j】;
			temp = S[i];
			S[i] = S[j];
			S[j] = temp;
		}
		
	}
	public void GenerateKeys(Integer S[],int n,char keys[]) {//产生密钥流
		int i=0,j=0,r;
		for(int u=0;u<n;u++)
		{
			i = (i+1)%256;
			j = (j+S[i])%256;			
			int temp;
			temp = S[i];
			S[i] = S[j];
			S[j] = temp;
			r = (S[i]+S[j])%256;
			 keys[u] =(char) S[r].intValue(); 
			 
		}
		System.out.println("密钥流:");
		System.out.print(keys);
	}
	public String encrypt(char keys[],int n,char P[],char C[]) {//加密
		for(int i=0;i<n;i++)
		{
			int op;
			op= P[i] ^ keys[i]; 
			C[i] = (char)op;
			//System.out.println("op"+op);
			//System.out.println("C[i]"+C[i]);
			
		}
		String o4 = new String(C);
		return o4;
	}
	public String decrypt(char keys[],int n,char C[]) {//解密
		char D[] = new char[256];
		for(int i=0;i<n;i++)
		{
			int op;
			op= C[i] ^ keys[i]; 
			D[i] = (char)op;
		}
		String o4 = new String(D);
		return o4;
}
}

运行结果

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值