发新话题
打印

[原创]RC4算法 N=3(C语言)

[原创]RC4算法 N=3(C语言)

文章作者:侠客行
#include<stdio.h>
#include<string.h>

int m1[200];         //   明文 二进制
int s[8]={0,1,2,3,4,5,6,7};
int k3[200];         // 密钥二进制
char c[200];          //  密文
int count;

int main(void)
{
  int i,j,n;
  char m0[100];

  int T[8];
  printf("输入密钥长度:n");
  scanf("%d",&n);
  printf("初始密钥:n");
  for(i=0;i<n;i++)
    scanf("%d",&T);
    getchar();
  if(n<8)
    {
    for(i=0;i<8;i++)
    T=T[i%n];
    printf("初始T盒:n");
    for(i=0;i<8;i++)
    printf("%d",T);
    printf("n");

    }
    else
    {
    printf("输入错误,退出程序n");
     exit(1);
    }



   void  mingwenchuli(char m0[100]);// 明文处理
   mingwenchuli(m0);
   void  miyao(int T[8]);//  密钥生成
   miyao(T);
   void jiami(int m1[200],int k3[200]); // 加密
   jiami(m1,k3);
}

void mingwenchuli(char m0[100])            // 明文处理
{
        int i,j,r,n,temp;
    int m[200];
   printf("请输入明文字符:n");
   i=0;
   while((m0=getchar())!='n')
        i++;
       m0='';
   j=0;
   count=0;
   int z=strlen(m0);
   int y[200];
  for(i=0;i<z;i++)
   {
      r=0;
      int k=0;
      y=int(m0);
             do{
           m[r]=y%2;    //  转换 为 二进制
       y=y/2;
        m1[count]=m[r];
        r++;
        count++;
        }while(r!=7);
   for(j=count-1;j>=count-3;j--)
        {
        temp=m1[j];
        m1[j]=m1[j-6+k];
        m1[j-6+k]=temp;
        k=k+2;
        }
    }

    m1[count]='';

   printf("输出明文二进制形式:n");
   for(r=0;r <count; r++)
        printf("%d",m1[r]);
        printf("n");
}
void  miyao(int T[8])
{
        int j,p;
        int i,temp,t,l;
    int k[100];
    int k2[200];
        j=0;
        for(i=0;i<8;i++)  // 密钥调度
        {
                j=(j+s+T)%8;
                temp=s;
                s=s[j];
                s[j]=temp;
        }
         printf("输出s盒数组:n");
        for(i=0;i<8;i++)
        printf("%d",s);             // 输出  S 数组
    printf("n");

        i=0;
        j=0;
        for(t=0;t<(count/3+1);t++)//  伪随机调度算法
        {
                i=(i+1)%8;
                j=(j+s)%8;
                temp=s;
                s=s[j];
                s[j]=temp;
                l=(s+s[j])%8;
                k[t]=s[l];
        }
    printf("输出密钥十进制形式:n");
        for(t=0;t<(count/3+1);t++)
        printf("%d",k[t]);          // 输出 密钥  -----十进制
        printf("n");
       
  p=0;       
for(i=0;i<(count/3+1);i++)
   {
    j=0;
           do{
           k2[j]=k%2;          // 二进制转换
       k=k/2;
       k3[p]=k2[j];
        p++;
        j++;
      }while(j!=3);

      temp=k3[p-1];
      k3[p-1]=k3[p-3];
      k3[p-3]=temp;
   }
    k3[p]='';

    printf("输出密钥二进制形式:n");
   for(j=0;j<p;j++)
   printf("%d",k3[j]);
   printf("n");
}
                    
void jiami(int m1[200],int k3[200])
{
     int i,j;
   for(i=0;i<count;i++)            //异或加密
     c=m1^k3;
     printf("输出加密密文:n");
   for(i=0;i<count;i++)       
         printf("%d",c);
         printf("n");
}

附件

1.png (19.35 KB)

2011-4-21 08:52

运行结果

1.png

TOP

发新话题