?? rc5.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 + -