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

📄 rc5.cpp

📁 rc5 c语言源代码。可修改性强。适合学习调试使用~
💻 CPP
字号:
/* RC5-32/12/16*/

#include <stdio.h>
#include "rc5.h"

#define w 32	/*u32 size in bits*/
#define r 12	/*number of rounds*/
#define b 16	/*number of bits in key*/
#define c 4	/*number of u32 in key, c = max( 1, ceil(8*b/w) )*/
#define t 26	/*size of tables S = 2*(r+1) u32s*/
u32 S[t];	/*expanded key table*/
u32 P = 0xb7e15163, Q = 0x9e3779b9;	/*magic constants*/



void rc5_encrypt( u16 *data )	/*input pt,ouput ct*/
{
	u32 in[2]={0,0};
	u32 i,A,B;
	in[0] = ((u32)data[0]<<24) ^ ((u32)data[1]<<16) ^ ((u32)data[2]<<8) ^ (u32)data[3];
	in[1] = ((u32)data[4]<<24) ^ ((u32)data[5]<<16) ^ ((u32)data[6]<<8) ^ (u32)data[7];
	A=in[0]+S[0];
	B=in[1]+S[1];
	for( i=1; i<=r; i++ )
		{
			A = ROTL( A^B, B ) + S[2*i];
			B = ROTL( B^A, A ) + S[2*i+1];
		}
	in[0] = A;
	in[1] = B;

	data[0] = (u16)((in[0]>>24)	&0x000000ff);
	data[1] = (u16)((in[0]>>16)	&0x000000ff);
	data[2] = (u16)((in[0]>>8)	&0x000000ff);
	data[3] = (u16)(in[0]		&0x000000ff);
	data[4] = (u16)((in[1]>>24)	&0x000000ff);
	data[5] = (u16)((in[1]>>16)	&0x000000ff);
	data[6] = (u16)((in[1]>>8)	&0x000000ff);
	data[7] = (u16)(in[1]		&0x000000ff);

}

void rc5_decrypt( u16 *data )	/*input ct,ouput pt*/
{
	u32 in[2]={0,0};
	u32 i,B,A;
	in[0] = ((u32)data[0]<<24) ^ ((u32)data[1]<<16) ^ ((u32)data[2]<<8) ^ (u32)data[3];
	in[1] = ((u32)data[4]<<24) ^ ((u32)data[5]<<16) ^ ((u32)data[6]<<8) ^ (u32)data[7];
	B=in[1];
	A=in[0];
	for( i=r; i>0; i-- )
	{
		B = ROTR( B-S[2*i+1], A ) ^ A;
		A = ROTR( A-S[2*i], B ) ^ B;
	}
	in[1] = B - S[1];
	in[0] = A - S[0];

	data[0] = (u16)((in[0]>>24)	&0x000000ff);
	data[1] = (u16)((in[0]>>16)	&0x000000ff);
	data[2] = (u16)((in[0]>>8)	&0x000000ff);
	data[3] = (u16)(in[0]		&0x000000ff);
	data[4] = (u16)((in[1]>>24)	&0x000000ff);
	data[5] = (u16)((in[1]>>16)	&0x000000ff);
	data[6] = (u16)((in[1]>>8)	&0x000000ff);
	data[7] = (u16)(in[1]		&0x000000ff);
}

void rc5_key_setup( u16 *K )	/*secret input key K[b]*/
{
	u32 i,j,k,u=w/8,A,B,L[c];
/*Initialize L, then S, then mix key into S*/
	for( i=b-1,L[c-1]=0; i!=-1; i-- )
	{
		L[i/u] = ( L[i/u]<<8 ) + K[i];
	}
	for( S[0]=P,i=1; i<t; i++ )
	{
		S[i] = S[i-1] + Q;
	}
	for( A=B=i=j=k=0; k<3*t; k++,i=(i+1)%t,j=(j+1)%c )	/*3*t > 3*c*/
	{
		A = S[i] = ROTL( S[i]+(A+B), 3 );
		B = L[j] = ROTL( L[j]+(A+B), (A+B) ); 
	}
}


void main()

{
	int i;
	u16 data[8]={ 0x32,0x02,0x56,0x15,
				  0x16,0x77,0x62,0x64};
	unsigned char key[b] = 
	{
		0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
	};

	rc5_key_setup( key );
	rc5_encrypt( data );
	for( i=0; i<8; i++ )
		printf( "%4.02X",data[i] );
	printf( "\n" );
	rc5_decrypt( data );
	for( i=0; i<8; i++ )
		printf( "%4.02X",data[i] );
	printf( "\n" );

}

⌨️ 快捷键说明

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