用CBC加密模式实现IDEA算法

本文详细介绍了如何使用CBC(密文反馈模式)加密模式实现IDEA(国际数据加密算法)。通过分组加密,IDEA可以处理任意长度的数据,文章提供了IDEA的加密和解密过程,包括关键的函数实现,如SetKey、idea_encrypt和idea_decrypt。此外,还展示了如何在CBC模式下进行加解密操作,涉及到了初始向量和密钥的使用。
摘要由CSDN通过智能技术生成

用CBC加密模式实现IDEA算法

分组加密算法加密的数据块长度是固定的。为了安全地加密任意长度的数据,人们引入了加密模式。通过加密模式,加密算法可加密任意长度的数据。密文反馈模式(CBC)是一种常用的加密模式,它首先将输入数据分块,每块的长度为加密算法可处理的块长度,最后一块若不到块长度,则通过填充0比特使其达到块长。上图给出了CBC的原理。其中+代表异或操作,Ek代表使用密钥k进行加密的操作,Dk代表使用密钥k解密的操作。图中上半部分为加密的过程,下半部为解密过程。

//IDEA.h

 

bool SetKey( unsigned short *key, unsigned short kLen );

void idea_encrypt( unsigned short *in, unsigned short *out );

void idea_decrypt( unsigned short *in, unsigned short *out );


//IDEA.c

 

#include <string.h>

#include <stdlib.h>

#include "idea.h"


//! 宏定义,IDEA迭代轮次

#define ROUNDS 8

//! 宏定义,参与加密过程的子密钥数目

#define KEYLEN (6*ROUNDS+4)

//! 宏定义,获取低16位字

#define low16(x) ((x) & 0xffff)


//! 用于保存52个加密子密钥

unsigned short gEnkey[52];

//! 用于保存52个解密子解钥

unsigned short gDekey[52];

typedef unsigned short IDEAkey[KEYLEN];


struct IDEA_MSG_ITEM

{

unsigned short X[4];

unsigned short Z[6];

unsigned short W[4];

};

struct IDEA_MSG

{

IDEA_MSG_ITEM items[8];

unsigned short Y[4];

unsigned short LZ[4];


};

IDEA_MSG gIDEA_MSG;


unsigned int inv( unsigned int x )

{

unsigned int t0,t1;

unsigned int q,y;

if( x <= 1 )

return x;


t1 = (unsigned int)(0x10001l / x);

y = (unsigned int)(0x10001l % x);

if( y == 1 )

return low16( 1 - t1 );


t0 = 1 ;

do

{

q = x / y;

x = x % y;

t0 += q * t1;

if (x == 1)

return t0;


q = y / x;

y = y % x;

t1 += q * t0;

} while( y != 1 );


return low16( 1-t1 );

}


unsigned short mul( unsigned int a, unsigned int b )

{

unsigned int p;


if(a)

{

if(b)

{

p=(unsigned int)a*b;

b=(unsigned int)(low16(p));

a=(unsigned int)(p>>16);

return b-a+(b<a);

}

else

{

return 1-a;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值