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

📄 idea.c

📁 IDEA对称算法的软件实现
💻 C
📖 第 1 页 / 共 3 页
字号:
/**********************************************************************
 *  idea.c
 *
 *	Author : Sunflower
 *	CopyRight 2001 DATech
 *	
 *	得安公司第二代加密卡idea运算程序。包括密钥生成、加解密
 **********************************************************************/
#include <stdlib.h>
#include <memory.h>
#include <stdio.h>
#include <conio.h>
#include "armtypes.h"
#include "idea.h"

ARM_RV test_IdeaEcb_Block(ARM_UINT8 *pbIdeaKey, ARM_UINT32 ulIdeaKeyLen);
ARM_RV test_IdeaCbc_Block(ARM_UINT8 *pbIdeaKey, ARM_UINT32 ulIdeaKeyLen);

void ideaCipher(ARM_UINT8 *inbuf, ARM_UINT8 *outbuf, ARM_UINT16 *key)
{
	register ARM_UINT16 x1,x2,x3,x4,s2,s3;
	register ARM_UINT16 t16;
	register ARM_UINT32 t32;
	int r = IDEAROUNDS;
	
	x1 = (ARM_UINT16)(inbuf[0] << 8 | inbuf[1]);
	x2 = (ARM_UINT16)(inbuf[2] << 8 | inbuf[3]);
	x3 = (ARM_UINT16)(inbuf[4] << 8 | inbuf[5]);
	x4 = (ARM_UINT16)(inbuf[6] << 8 | inbuf[7]);

	do { 
		MUL(x1,*key++);
		x2 = (unsigned short)(x2 + *key++);
		x3 = (unsigned short)(x3 + *key++);
		MUL(x4, *key++);

		s3 = x3;
		x3 ^= x1;
		MUL(x3, *key++);
		s2 = x2;
		x2 ^= x4;
		x2 = (unsigned short)(x2 + x3);
		MUL(x2, *key++);
		x3 = (unsigned short)(x2 + x3);

		x1 ^= x2;  x4 ^= x3;

		x2 ^= s3;  x3 ^= s2;
	} while (--r);
	MUL(x1, *key++);
	x3 = (unsigned short)(x3 + *key++);
	x2 = (unsigned short)(x2 + *key++);
	MUL(x4, *key);

	outbuf[0] = (ARM_UINT8)(x1>>8);
	outbuf[1] = (ARM_UINT8)x1;
	outbuf[2] = (ARM_UINT8)(x3>>8);
	outbuf[3] = (ARM_UINT8)x3;
	outbuf[4] = (ARM_UINT8)(x2>>8);
	outbuf[5] = (ARM_UINT8)x2;
	outbuf[6] = (ARM_UINT8)(x4>>8);
	outbuf[7] = (ARM_UINT8)x4;
}

void idea_enc(ARM_IDEA_CTX *c, ARM_UINT8 *data,int blocks)
{
	int i;
	unsigned char *d = data;
	
	for ( i = 0; i < blocks; i ++)
	{
		ideaCipher(d,d,c->ek);
		d += 8;
	}
}

void idea_dec(ARM_IDEA_CTX *c, ARM_UINT8 *data,int blocks)
{
	int  i;
	unsigned char *d = data;
	
	for ( i = 0; i < blocks; i ++)
	{
		ideaCipher(d,d,c->dk);
		d += 8;
	}
}

ARM_UINT16 mulInv(ARM_UINT16 x)
{    
	ARM_UINT16 t0,t1;
	ARM_UINT16 q,y;

	if (x<=1)
		return x;
	t1=(unsigned short)(0x10001l/x);
	y=(unsigned short)(0x10001l%x);
	if (y==1)
		return (ARM_UINT16)low16(1-t1);
	t0=1;
	do 
	{
		q=(unsigned short)(x/y);
		x=(unsigned short)(x%y);
		t0=(unsigned short)(t0 + q*t1);
		if (x==1)
			 return t0;
		q=(unsigned short)(y/x);
		y=(unsigned short)(y%x);
		t1=(unsigned short)(t1 + q*t0);
	}while (y != 1);

    return (ARM_UINT16)low16(1-t1);
}

ARM_RV ideaExpandKey(ARM_UINT8 const *userkey, ARM_UINT32 userkeyLen,
				   ARM_UINT16 *EK, ARM_UINT32 *EKbytes)
{
	int i,j;
      
	if (userkeyLen != 16)
		return ARMERR_PARAM;

	for (j=0;j<8;j++)
	{
		EK[j]=(unsigned short)((userkey[0]<<8 )+ userkey[1]);
		userkey +=2;
	}
	for (i=0;j<IDEAKEYLEN;j++)
	{
		i++;
		EK[i+7] = (unsigned short)(EK[i & 7] <<9 | EK[(i+1) & 7]>> 7);
		EK += i & 8;
		i &= 7;
	}
	*EKbytes = IDEAKEYLEN * 2; // 1 short = 2 bytes;
	return ARMERR_SUCCESS;
}

ARM_RV ideaInvertKey(ARM_UINT16 const *EK, ARM_UINT32	ekBytes,
				   ARM_UINT16 DK[IDEAKEYLEN], ARM_UINT32 *dkBytes)
{
	int i;
	ARM_UINT16 t1,t2,t3;
	ARM_UINT16 temp[IDEAKEYLEN];
	ARM_UINT16 *p=temp+IDEAKEYLEN;
      
	if (ekBytes != IDEAKEYBYTES)
		return ARMERR_PARAM;

	t1   = mulInv(*EK++);
	t2   = (unsigned short)-*EK++;
	t3   = (unsigned short)-*EK++;
	*--p = mulInv(*EK++);
	*--p = t3;
	*--p = t2; 
	*--p = t1;
      
	for (i =0;i< IDEAROUNDS-1;i++){
		t1   = *EK++;
		*--p = *EK++;
		*--p = t1;

		t1   =  mulInv(*EK++);
		t2   = (unsigned short)-*EK++; 
		t3   = (unsigned short)-*EK++;
		*--p = mulInv(*EK++);
		*--p = t2;
		*--p = t3;
		*--p = t1;
	}
	t1   = *EK++;
	*--p = *EK++;
	*--p = t1;

	t1   = mulInv(*EK++);
	t2   = (unsigned short)-*EK++;
	t3   = (unsigned short)-*EK++;

	*--p = mulInv(*EK++);
	*--p = t3;
	*--p = t2;
	*--p = t1;

	memcpy(DK,temp,sizeof(temp));
	for(i = 0; i < IDEAKEYLEN; i++) 
		temp[i] = 0;

	*dkBytes = IDEAKEYLEN * 2;
	return ARMERR_SUCCESS;
} 

/*****************************************************************
	Arm_IdeaExpandEncKey	: Expand Idea Enc Key 扩展idea加密密钥
	Return value:
		ARMERR_SUCCESS		: Success
		other				: failed
	Parameters:
		pbIdeaKey			: 扩展前的IDEA密钥(8字节)		input
		ulIdeaKeyLen		: 扩展前的IDEA密钥长度			input
		pbIdeaEncKey		: 扩展后的IDEA加密密钥(128字节)	output
		*ulIdeaEncKeyLen	: 扩展后的IDEA加密密钥长度		output
*****************************************************************/
ARM_RV Arm_IdeaExpandEncKey(
			ARM_UINT8   *pbIdeaKey,
			ARM_UINT32  ulIdeaKeyLen,
			ARM_UINT8   *pbIdeaEncKey,
			ARM_UINT32  *ulIdeaEncKeyLen)
{
	ideaExpandKey(pbIdeaKey, ulIdeaKeyLen, (ARM_UINT16*)pbIdeaEncKey, ulIdeaEncKeyLen);
	if (*ulIdeaEncKeyLen != IDEAKEYLEN)
		return ARMERR_GENERIC_ERROR;
	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_IdeaExpandDecKey	: Expand Idea Dec Key 扩展idea加密密钥
	Return value:
		ARMERR_SUCCESS		: Success
		other				: failed
	Parameters:
		pbIdeaKey			: 扩展前的IDEA密钥(8字节)		input
		ulIdeaKeyLen		: 扩展前的IDEA密钥长度			input
		pbIdeaEncKey		: 扩展后的IDEA解密密钥(128字节)	output
		*ulIdeaEncKeyLen	: 扩展后的IDEA解密密钥长度		output
*****************************************************************/
ARM_RV Arm_IdeaExpandDecKey(
			ARM_UINT8   *pbIdeaKey,
			ARM_UINT32  ulIdeaKeyLen,
			ARM_UINT8   *pbIdeaDecKey,
			ARM_UINT32  *ulIdeaDecKeyLen)
{
	ARM_UINT16	pbIdeaEncKey[IDEAKEYLEN];
	ARM_UINT32	ulIdeaEncKeyLen;

	ideaExpandKey(pbIdeaKey, ulIdeaKeyLen, pbIdeaEncKey, &ulIdeaEncKeyLen);
	ideaInvertKey(pbIdeaEncKey, ulIdeaEncKeyLen, (ARM_UINT16*)pbIdeaDecKey, ulIdeaDecKeyLen);
	*ulIdeaDecKeyLen = ulIdeaEncKeyLen;

	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_IdeaEncRaw		: Idea算法加密小整块明文8字节 
	Return value:
		ARMERR_SUCCESS	: Success
		other			: failed
	Parameters:
		pbIdeaEncKey	: IDEA加密密钥					input
		ulIdeaEncKeyLen	: IDEA加密密钥长度				input
		pbInData		: 待加密的明文					input
		ulInDataLen		: 待加密的明文长度				input
		pbOutData		: 加密后的密文					output
		*ulOutDataLen	: 加密后的密文长度				output
*****************************************************************/
ARM_RV Arm_IdeaEncRaw(
			ARM_UINT8   *pbIdeaEncKey,
			ARM_UINT32  ulIdeaEncKeyLen,
			ARM_UINT8   *pbInData,
			ARM_UINT32  ulInDataLen,
			ARM_UINT8   *pbOutData,
			ARM_UINT32  *ulOutDataLen)
{
	if ((ulIdeaEncKeyLen != IDEAKEYBYTES) || (ulInDataLen != IDEABLOCKBYTES))
		return ARMERR_PARAM;

	ideaCipher(pbInData, pbOutData, (ARM_UINT16*)pbIdeaEncKey);
	*ulOutDataLen = IDEABLOCKBYTES;

	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_IdeaDecRaw		: Idea算法解密小整块密文8字节 
	Return value:
		ARMERR_SUCCESS	: Success
		other			: failed
	Parameters:
		pbIdeaDecKey	: IDEA解密密钥					input
		ulIdeaDecKeyLen	: IDEA解密密钥长度				input
		pbInData		: 待解密的密文					input
		ulInDataLen		: 待解密的密文长度				input
		pbOutData		: 解密后的明文					output
		*ulOutDataLen	: 解密后的明文长度				output
*****************************************************************/
ARM_RV Arm_IdeaDecRaw(
			ARM_UINT8   *pbIdeaDecKey,
			ARM_UINT32  ulIdeaDecKeyLen,
			ARM_UINT8   *pbInData,
			ARM_UINT32  ulInDataLen,
			ARM_UINT8   *pbOutData,
			ARM_UINT32  *ulOutDataLen)
{
	if ((ulIdeaDecKeyLen != IDEAKEYBYTES) || (ulInDataLen != IDEABLOCKBYTES))
		return ARMERR_PARAM;

	ideaCipher(pbInData, pbOutData, (ARM_UINT16*)pbIdeaDecKey);
	*ulOutDataLen = IDEABLOCKBYTES;

	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_IdeaEncEcbInitialize: Idea算法Ecb模式加密初始化(扩展加密密钥) 
	Return value:
		ARMERR_SUCCESS		: Success
		other				: failed
	Parameters:
		ideaCtx				: IDEA密钥,包含加密密钥		output
		pbIdeaKey			: IDEA扩展前的密钥				input
		ulIdeaKeyLen		: IDEA扩展前的密钥长度字节数(=8)input
*****************************************************************/
ARM_RV Arm_IdeaEncEcbInitialize(
			ARM_IDEA_CTX	*ideaCtx,
			ARM_UINT8	*pbIdeaKey,
			ARM_UINT32	ulIdeaKeyLen) 
{ 
	ideaExpandKey(pbIdeaKey, ulIdeaKeyLen, ideaCtx->ek, &(ideaCtx->ekBytes));
	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_IdeaEncEcbUpdate	: Idea算法Ecb模式加密小整块密文8字节(update) 
	Return value:
		ARMERR_SUCCESS		: Success
		other				: failed
	Parameters:
		ideaCtx				: IDEA密钥						input
		pbInData			: 待加密的明密文				input
		ulInDataLen			: 待加密的明文长度				input
		pbOutData			: 加密后的密文					output
		*ulOutDataLen		: 加密后的密文长度				output
*****************************************************************/
ARM_RV Arm_IdeaEncEcbUpdate(
			ARM_IDEA_CTX	*ideaCtx,
			ARM_UINT8	*pbInData,
			ARM_UINT32	ulInDataLen,
			ARM_UINT8	*pbOutData,
			ARM_UINT32	*ulOutDataLen)
{
	if (ulInDataLen != IDEABLOCKBYTES)
		return ARMERR_PARAM;

⌨️ 快捷键说明

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