RC4密码算法-C语言实现

        RC4算法时Ron Rivest在1987年设计的一种流密码,它非常简单,易于描述,其加密密钥和解密密钥相同,密钥长度可变,但为了确保密码算法的安全强度,目前RC4使用至少128位的密钥。

代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef unsigned long ULONG;
void swap(unsigned char * S,unsigned int i,unsigned int j)
{
    unsigned char temp = S[i];
    S[i]=S[j];
    S[j]=temp;
}

void rc4_init(unsigned char * S,unsigned char * K,unsigned long Len)
{
    int i=0,j=0,T[256]={0};
    for(i=0;i<256;i++)
    {
        S[i]=i;
        T[i]=K[i%Len];
    }
    for(i=0;i<256;i++)
    {
        S[i]=i;
        T[i]=K[i%Len];
        for(i=0;i<256;i++)
        {
            j=(j+S[i]+T[i])%256;
            swap(S,i,j);
        }
    }
}

void rc4_crypt(unsigned char *S,unsigned char *Data,unsigned long Len)
{
    int x=0,y=0,t=0;
    unsigned long i=0;
    for(i=0;i<Len;i++)
    {
        x=(x+1)%256;
        y=(y+S[x])%256;
        t=(S[x]+S[y])%256;
        swap(S,x,y);
        Data[i]^=S[t];
    }
}

int main()
{
    int function=1;
    unsigned char S[256]={0};
    char K[256]={"其实RC4算法很简单!"};
    char pData[256]={"\0"};
    while(1)
    {
        if(function == 1)
        {
            printf("输入要加密的明文:");
            scanf("%s",&pData);
            ULONG len=strlen(pData);
            printf("输入加密所用的密钥:%s\n",K);
            printf("输入密钥的长度:%d\n",strlen(K));
            rc4_init(S,(unsigned char *)K,strlen(K));
            rc4_crypt(S,(unsigned char *)pData,len);
            printf("输出加密后的密文:%s",pData);
        }
        else if(function==2)
        {
            ULONG len =strlen(pData);
            rc4_init(S,(unsigned char *)K,strlen(K));
            rc4_crypt(S,(unsigned char *)pData,len);
            printf("输出解密后的明文:%s",pData);
        }
        else if(function==3)
        {
            printf("退出RC4加解密系统!\n");
            break;
        }
        else
        {
            printf("请输入正确的命令符:\n");
        }
        printf("\n");
        printf("输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:\n");
        printf("请输入命令符:\n");
        scanf("%d",&function);
    }
    system("pause");    // 防止运行后自动退出,需头文件stdlib.h
    return 0;
}

结果

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值