密码学RC4算法 C语言实现

1 篇文章 0 订阅
1 篇文章 0 订阅

密码学RC4算法 C语言实现

加密程序
L为秘钥种子个数

#include <stdio.h>
int main()
{
	int n,L;
	int k[10];int x=0;char c;
	char m[50];int msize=0;
	printf("请输入n和L:"); 
	scanf("%d %d",&n,&L);
	printf("请输入秘钥种子:");
	do
	   {
	    scanf("%d%c",&k[x],&c);
	   	x=x+1;
	   }while(c!='\n');
	printf("请输入明文:"); 
	while((m[msize]=getchar())!='\n')  
       {
	    msize=msize+1;
	   }
	if(msize>=50)
	{
		printf("输入个数不小于50");
		return 0; 
	}
	int j,y;
	int merjinzhi[250];
	for(j=0;j<msize;j++)
	{
		y=(int)(m[j])-97;
		if(y<0||y>25)
		{
			printf("输入了不合规明文");
			return 0; 
		}
		if(y>=16)
		{
			merjinzhi[j*5]=1;
			y=y-16;
		}
		else merjinzhi[j*5]=0;
		if(y>=8)
		{
			merjinzhi[j*5+1]=1;
			y=y-8;
		}
		else merjinzhi[j*5+1]=0;
		if(y>=4)
		{
			merjinzhi[j*5+2]=1;
			y=y-4;
		}
		else merjinzhi[j*5+2]=0;
		if(y>=2)
		{
			merjinzhi[j*5+3]=1;
			y=y-2;
		}
		else merjinzhi[j*5+3]=0;
		if(y>=1)
		{
			merjinzhi[j*5+4]=1;
		}
		else merjinzhi[j*5+4]=0;
	}
	int ssize=2,i;
	for(i=0;i<n-1;i++)ssize=2*ssize;
	int s[100],t[100];
	for(i=0;i<ssize;i++)
	{
		s[i]=i;
		t[i]=k[i%L];
	}
	printf("第一步\n");
	for(i=0;i<ssize;i++)printf("%d",s[i]);printf("\n");
	for(i=0;i<ssize;i++)printf("%d",t[i]);printf("\n");
	int d;
	j=0;
	for(i=0;i<ssize;i++)
	{
		j=(j+s[i]+t[i])%ssize;
		d=s[i];s[i]=s[j];s[j]=d;
		
	}
	i=0,j=0;
	int kerjinzhi[250];
	int kerjinzhigeshu=0;
	int p,z,g;
	printf("第二步\n");
	while(kerjinzhigeshu<msize*5)
	{
		i=(i+1)%ssize;
		j=(j+s[i])%ssize;
		d=s[i];s[i]=s[j];s[j]=d;
		p=(s[i]+s[j])%ssize;
		z=s[p];
		printf("%d ",z);
		for(g=0;g<n;g++)
	    {
	    	if(z>=(ssize/((g+1)*2)))
	    	{
	    		kerjinzhi[kerjinzhigeshu+g]=1;
	    		z=z-ssize/((g+1)*2);
			}
			else kerjinzhi[kerjinzhigeshu+g]=0;
		}
		kerjinzhigeshu=kerjinzhigeshu+n;
	}
	printf("\n");
	int cerjinzhi[250];
	for(i=0;i<msize*5;i++)
	{
		if(1==(merjinzhi[i]+kerjinzhi[i]))    cerjinzhi[i]=1;
		else cerjinzhi[i]=0;
	}
	for(i=0;i<msize;i++)
	{
		printf("%c",(char)(cerjinzhi[i*5]*16+cerjinzhi[i*5+1]*8+cerjinzhi[i*5+2]*4+cerjinzhi[i*5+3]*2+cerjinzhi[i*5+4]+97));
	}
    return 0;	
}

解密程序

#include <stdio.h>
int main()
{
	int n,L;
	int k[10];int x=0;char c;
	char m[50];int csize=0;
	printf("请输入n和L:"); 
	scanf("%d %d",&n,&L);
	printf("请输入秘钥种子:");
	do
	   {
	    scanf("%d%c",&k[x],&c);
	   	x=x+1;
	   }while(c!='\n');
	printf("请输入密文:"); 
	while((m[csize]=getchar())!='\n')  
       {
	    csize=csize+1;
	   }
	if(csize>=50)
	{
		printf("输入个数不小于50");
		return 0; 
	}
	int j,y;
	int cerjinzhi[250];
	for(j=0;j<csize;j++)
	{
		y=(int)(m[j])-97;
		if(y<0||y>25)
		{
			printf("输入了不合规密文");
			return 0; 
		}
		if(y>=16)
		{
			cerjinzhi[j*5]=1;
			y=y-16;
		}
		else cerjinzhi[j*5]=0;
		if(y>=8)
		{
			cerjinzhi[j*5+1]=1;
			y=y-8;
		}
		else cerjinzhi[j*5+1]=0;
		if(y>=4)
		{
			cerjinzhi[j*5+2]=1;
			y=y-4;
		}
		else cerjinzhi[j*5+2]=0;
		if(y>=2)
		{
			cerjinzhi[j*5+3]=1;
			y=y-2;
		}
		else cerjinzhi[j*5+3]=0;
		if(y>=1)
		{
			cerjinzhi[j*5+4]=1;
		}
		else cerjinzhi[j*5+4]=0;
	}
	int ssize=2,i;
	for(i=0;i<n-1;i++)ssize=2*ssize;
	int s[100],t[100];
	for(i=0;i<ssize;i++)
	{
		s[i]=i;
		t[i]=k[i%L];
	}
	printf("第一步\n");
	for(i=0;i<ssize;i++)printf("%d",s[i]);printf("\n");
	for(i=0;i<ssize;i++)printf("%d",t[i]);printf("\n");
	int d;
	j=0;
	for(i=0;i<ssize;i++)
	{
		j=(j+s[i]+t[i])%ssize;
		d=s[i];s[i]=s[j];s[j]=d;
		
	}
	i=0,j=0;
	int kerjinzhi[250];
	int kerjinzhigeshu=0;
	int p,z,g;
	printf("第二步\n");
	while(kerjinzhigeshu<csize*5)
	{
		i=(i+1)%ssize;
		j=(j+s[i])%ssize;
		d=s[i];s[i]=s[j];s[j]=d;
		p=(s[i]+s[j])%ssize;
		z=s[p];
		printf("%d ",z);
		for(g=0;g<n;g++)
	    {
	    	if(z>=(ssize/((g+1)*2)))
	    	{
	    		kerjinzhi[kerjinzhigeshu+g]=1;
	    		z=z-ssize/((g+1)*2);
			}
			else kerjinzhi[kerjinzhigeshu+g]=0;
		}
		kerjinzhigeshu=kerjinzhigeshu+n;
	}
	printf("\n");
	int merjinzhi[250];
	for(i=0;i<csize*5;i++)
	{
		if(1==cerjinzhi[i])    merjinzhi[i]=1-kerjinzhi[i];
		else if(kerjinzhi[i]==1)merjinzhi[i]=1;
		     else merjinzhi[i]=0;
	}
	for(i=0;i<csize;i++)
	{
		printf("%c",(char)(merjinzhi[i*5]*16+merjinzhi[i*5+1]*8+merjinzhi[i*5+2]*4+merjinzhi[i*5+3]*2+merjinzhi[i*5+4]+97));
	}
    return 0;	
}
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值