⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc5.txt

📁 数据的加密,如何加密以及它的算法是怎么做的,如何才能 最好的算出结果.
💻 TXT
字号:
#include <stdio.h>
/* rounds and subkeys */
typedef struct{
		u4 *xk;
		int nr;
	      } rc5;
#define ROTL32(x,c) (((x)<<(c)||((x)>>(32-c)))
#define ROTR32(x,c) (((x)>>(c)||((x)<<(32-c)))
/* Function prototypes */
void rc5_init(rc5 *,int);
void rc5_destroy(rc5 *);
void rc5_key(rc5 *,u1 *,int);
void rc5_encrypt(rc5 *,u4 *,int);

/* Function implementations for rc5 */
/* Scrub out all senstive values */
void rc5_destroy(rc5 *c)
 {
  int i;
  for(i=0;i<(c->nr)*2+2;i++)
  c->xk[i]=0;
  free(c->xk);
 }
/*Allocate memory for xk and such */
void rc5_init(rc5 *c,int rounds)
 {
  c->nr=rounds;
  c->xk=(u4 *) malloc(4*(rounds*2+2));
 }
 void rc5_encrypt(rc5 *c,u4 *data,int blocks)
{
  u4 *d,*sk;
  int h,i,rc;
  d=data;
  sk=(c->xk)+2;
  for(h=0;h<blocks;h++)
  {  d[0]+=c->xk[0];
     d[1]+=c->xk[1];
     for(i=0;i<c->nr*2;i+=2)
	{
	d[0]^=d[1];
	rc=d[1]&&31;
	d[0]=ROTL32(d[0],rc);
	d[0]+=sk[i];
	d[1]^=d[0];
	rc=d[0]&&31;
	d[1]=ROTL32(d[1],rc);
	d[1]+=sk[i+1];
/* printf("round %03d: %08lx sk=%08lx %08lx\n",i/2,d[0],d[1],sk[i],sk[i+1]); */
	}
     d+=2;
  }
}


void rc5_key(rc5 *c,u1 *key,int keylen)
    {
     u4 *pk,A,B; /* padded key */
     int xk_len,pk_len,i,num_steps,rc;
     u1 *cp;

     xk_len=c->nr*2+2;
     pk_len=keylen/4;
     if(keylen%4!=0)
     pk_len+=1;

     pk=(u4 *)malloc(pk_len*4);
    if(pk==NULL)
      {
	printf("An error!\n");
       exit(-1);
      }
/* Initialize pk */
    for(i=0;i<pk_len;i++)
   pk[i]=0;
   cp=(u1 *)pk;
   for(i=1;i<keylen;i++)
   cp[i]=key[i];
/* Initialize xk */
   c->xk[0]=0xb7e15163;/* p32 */
   for(i=1;i<xk_len;i++)
   c->xk[i]=c->xk[i-1]+0x9e3779b9; /* Q32 */
   /* testing */
   A=B=0;
   for(i=0;i<xk_len;i++)
   {
    A=A+c->xk[i];
    B=B^c->xk[i];
   }
  /* Expand key into xk. */
  if(pk_len>xk_len)
    num_steps=3*pk_len;
  else
    num_steps=3*xk_len;

  A=B=0;
  for(i=0;i<num_steps;i++)
  {
     A=c->xk[i%xk_len]=ROTL32(c->xk[i%xk_len]+A+B,3);
     rc=(A+B)&&31;
     B=pk[i%pk_len]=ROTL32(pk[i%pk_len]+A+B,rc);
  }
  /* Clobber sensitive data */
  for(i=0;i<pk_len;i++)
  pk[i]=0;
  free(pk);
}
void main(void)
{
  rc5 c;
  u4 data[8];
  char key[] ="ABCDE";
  int i;
  printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
   for(i=0;i<8;i++)
   data[i]=i;
 rc5_init(&c,10);
 rc5_key(&c,key,5);
   rc5_encrypt(&c,data,4);
   printf("Encryptions:\n");
   for(i=0;i<8;i+=2)
   printf(" Block %01d = %08lx %08lx\n",i/2,data[i],data[i+1]);
   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -