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

📄 idea.c.bak

📁 IDEA对称算法的软件实现
💻 BAK
📖 第 1 页 / 共 3 页
字号:
	
	if (ideaCtx->dkBytes != IDEAKEYBYTES)
		return ARMERR_PARAM;

	Arm_IdeaDecRaw((unsigned char*)ideaCtx->dk, ideaCtx->dkBytes, 
		pbInData, ulInDataLen, data, ulOutDataLen);

	if (*ulOutDataLen != IDEABLOCKBYTES)
		return ARMERR_GENERIC_ERROR;
	/**************************************************************
	 *       解密后与CbcCtx(上组密文)异或恢复本组明文
	 ***************************************************************/
	if (!(ideaCtx->IsFirstBlock))
	{
		for ( i = 0; i < ulInDataLen; i ++)
			pbOutData[i] = (unsigned char)(ideaCtx->CbcCtx[i] ^ data[i]);
	}
	else
	{
		memcpy(pbOutData, data, *ulOutDataLen);
		ideaCtx->IsFirstBlock = 0;
	}

	/*******************本组密文作为下组CbcCtx*********************/
	memcpy(ideaCtx->CbcCtx, pbInData, ulInDataLen);

	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_IdeaDecCbcFinalize	: Idea算法Cbc模式解密最后一块,减pad 
	Return value:
		ARMERR_SUCCESS		: Success
		other				: failed
	Parameters:
		ideaCtx				: IDEA Cbc 解密上下文			input
		pbInData			: 待解密的密文					input
		ulInDataLen			: 待解密的密文长度				input
		pbOutData			: 解密后的明文					output
		*ulOutDataLen		: 解密后的明文长度				output
*****************************************************************/
ARM_RV Arm_IdeaDecCbcFinalize(
			ARM_IDEA_CTX	*ideaCtx,
			ARM_UINT8	*pbInData,
			ARM_UINT32	ulInDataLen,
			ARM_UINT8	*pbOutData,
			ARM_UINT32	*ulOutDataLen)
{
	unsigned char	data[IDEABLOCKBYTES];
	ARM_UINT32		dataLen;
	int			pad_bytes;
	int			i;

	if (ulInDataLen != IDEABLOCKBYTES)
		return ARMERR_PARAM;
	
	if (ideaCtx->dkBytes != IDEAKEYBYTES)
		return ARMERR_PARAM;

	Arm_IdeaDecCbcUpdate(ideaCtx, pbInData, ulInDataLen,
		data, &dataLen);
	/**************************************************************
	 *              对此最后一块解密减pad,得到明文
	 *************************************************************/
	pad_bytes = data[7];
	
	if ((pad_bytes < 0) || (pad_bytes > 8))
		return ARMERR_GENERIC_ERROR;

	for (i=8; i>(8-pad_bytes); i--)
	{
		if (data[i-1]!=pad_bytes)
			return ARMERR_GENERIC_ERROR;
	}

	*ulOutDataLen = dataLen - pad_bytes;
	memcpy(pbOutData, data, *ulOutDataLen);

	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_Idea_Block		: Idea Operation 对idea函数进行功能测试
	Return value:
		ARMERR_SUCCESS	: Success
		other			: failed
	Parameters:
		Command		: command data buffer
					: nLength			for keyLen
					: nInstruction		for IDEA_BLOCK
					: pParameter		for key be expanded
		Result		: Result data buffer
*****************************************************************/
ARM_RV Arm_Idea_Block(CardCommand *Command, CardResult *Result)
{
	ARM_UINT8   *pbIdeaKey;
	ARM_UINT32  ulIdeaKeyLen;

	pbIdeaKey = (unsigned char *)Command->pParameter;
	ulIdeaKeyLen = Command->nLength;
	test_IdeaEcb_Block(pbIdeaKey, ulIdeaKeyLen);
	getch();
	test_IdeaCbc_Block(pbIdeaKey, ulIdeaKeyLen);

	Result->nLength = 8;
//	memcpy(Result->pResult, ideaCtx.ek, 128);

	return ARMERR_SUCCESS;
}

/******************************Ecb*功能测试****************************/
ARM_RV test_IdeaEcb_Block(ARM_UINT8 *pbIdeaKey, ARM_UINT32 ulIdeaKeyLen)
{
	ARM_UINT32		i;
	unsigned char	x[8];
	ARM_IDEA_CTX		ideaCtx;
	ARM_UINT32		ulOutDataLen, len;
	unsigned char	pbInData[60], pbOutData[60], data[16];
	unsigned long	message[10];

	for ( i = 0; i < 8; i ++)
		x[i] = (unsigned char)i;
	/**************************对x 8 字节加解密************************/
	printf("\nTesting Idea Encrypt (Ecb mode) 8 bytes........\n");

	memcpy(pbInData, x, 8);
	Arm_IdeaEncEcbInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
	Arm_IdeaEncEcbFinalize(&ideaCtx, pbInData, 8,
			pbOutData, &ulOutDataLen);
	printf("Encrypt...\n  ");
	for ( i = 0; i < ulOutDataLen; i ++)
		printf("%02x   ", ((unsigned int) pbOutData[i])&0x00ff);
	memcpy(pbInData, pbOutData, ulOutDataLen);

	Arm_IdeaDecEcbInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
	Arm_IdeaDecEcbUpdate(&ideaCtx, pbInData, 8,
			data, &len);
	memcpy(pbOutData, data, 8);
	ulOutDataLen = len;
	Arm_IdeaDecEcbFinalize(&ideaCtx, &pbInData[8], 8,
			data, &len);
	memcpy(&pbOutData[8], data, len);
	ulOutDataLen += len;
	printf("\nDecrypt...\n  ");
	for ( i = 0; i < ulOutDataLen; i ++)
		printf("%02x   ", ((unsigned int) pbOutData[i])&0x00ff);
	printf("\n");

	if (memcmp(x, pbOutData, ulOutDataLen) != 0)
	{
		printf("ERROR!!!!_____Idea ECB(8 bytes)_____\n\n");
		return ARMERR_GENERIC_ERROR;
	}
	else
	{
		printf("SUCCESS!!!!_____Idea ECB(8 bytes)_____\n\n");
	}

	/**************************对message 40个字节加解密************************/
	{
		ARM_UINT32	messageLen, leftbytes;
		ARM_UINT32	blocks;

		printf("\nTesting Idea Encrypt (Ecb mode) 10 longs........\n");

		for ( i = 0; i < 10; i ++)
			message[i] = i;
		messageLen = 40;  //10 longs = 40 bytes

		Arm_IdeaEncEcbInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
		ulOutDataLen = 0;
		blocks = (messageLen + 7) / 8;
		for ( i = 0; i < blocks - 1; i ++)
		{
			memcpy(pbInData, &message[i*2], 8);
			Arm_IdeaEncEcbUpdate(&ideaCtx, pbInData, 8,
				data, &len);
			memcpy(&pbOutData[i*8], data, len);
			ulOutDataLen += len;
		}
		leftbytes = messageLen-i*8;
		memcpy(pbInData, &message[i*2], leftbytes);
		Arm_IdeaEncEcbFinalize(&ideaCtx, pbInData, leftbytes,
				data, &len);
		memcpy(&pbOutData[i*8], data, len);
		ulOutDataLen += len;
		printf("Encrypt...\n  ");
		for ( i = 0; i < ulOutDataLen; i ++)
			printf("%02x   ", ((unsigned int) pbOutData[i])&0x00ff);

		memcpy(pbInData, pbOutData, ulOutDataLen);

		Arm_IdeaDecEcbInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
		blocks = (ulOutDataLen + 7) / 8;
		ulOutDataLen = 0;
		for ( i = 0; i < blocks - 1; i ++)
		{
			Arm_IdeaDecEcbUpdate(&ideaCtx, &pbInData[i*8], 8,
				data, &len);
			memcpy(&pbOutData[i*8], data, len);
			ulOutDataLen += len;
		}
		Arm_IdeaDecEcbFinalize(&ideaCtx, &pbInData[i*8], 8,
				data, &len);
		memcpy(&pbOutData[i*8], data, len);
		ulOutDataLen += len;
		printf("\nDecrypt...\n  ");
		for ( i = 0; i < ulOutDataLen; i ++)
			printf("%02x   ", ((unsigned int) pbOutData[i])&0x00ff);
		printf("\n");

		if (memcmp(message, pbOutData, ulOutDataLen) != 0)
		{
			printf("ERROR!!!!_____Idea ECB(10 longs)_____\n\n");
			return ARMERR_GENERIC_ERROR;
		}
		else
		{
			printf("SUCCESS!!!!_____Idea ECB(10 longs)_____\n\n");
		}
	}
	/************if*ARMERR_SUCCESS*Ecb*功能测试*OK*************************/
	return ARMERR_SUCCESS;
}

/******************************Cbc*功能测试****************************/
ARM_RV test_IdeaCbc_Block(ARM_UINT8 *pbIdeaKey, ARM_UINT32 ulIdeaKeyLen)
{
	ARM_UINT32		i;
	unsigned char	x[8];
	ARM_IDEA_CTX		ideaCtx;
	ARM_UINT32		ulOutDataLen, len;
	unsigned char	pbInData[60], pbOutData[60], data[16];
	unsigned long	message[10];
	
	for ( i = 0; i < 8; i ++)
		x[i] = (unsigned char)i;
	/**************************对x 8 字节加解密************************/
	printf("\nTesting Idea Encrypt (Cbc mode) 8 bytes........\n");

	memcpy(pbInData, x, 8);
	Arm_IdeaEncCbcInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
	Arm_IdeaEncCbcFinalize(&ideaCtx, pbInData, 8,
			pbOutData, &ulOutDataLen);
	printf("Encrypt...\n  ");
	for ( i = 0; i < ulOutDataLen; i ++)
		printf("%02x   ", ((unsigned int) pbOutData[i])&0x00ff);
	memcpy(pbInData, pbOutData, ulOutDataLen);

	Arm_IdeaDecCbcInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
	Arm_IdeaDecCbcUpdate(&ideaCtx, pbInData, 8,
			data, &len);
	memcpy(pbOutData, data, 8);
	ulOutDataLen = len;
	Arm_IdeaDecCbcFinalize(&ideaCtx, &pbInData[8], 8,
			data, &len);
	memcpy(&pbOutData[8], data, len);
	ulOutDataLen += len;
	printf("\nDecrypt...\n  ");
	for ( i = 0; i < ulOutDataLen; i ++)
		printf("%02x   ", ((unsigned int) pbOutData[i])&0x00ff);
	printf("\n");

	if (memcmp(x, pbOutData, ulOutDataLen) != 0)
	{
		printf("ERROR!!!!_____Idea CBC(8 bytes)_____\n\n");
		return ARMERR_GENERIC_ERROR;
	}
	else
	{
		printf("SUCCESS!!!!_____Idea CBC(8 bytes)_____\n\n");
	}

	/**************************对message 40个字节加解密************************/
	{
		ARM_UINT32	messageLen, leftbytes;
		ARM_UINT32	blocks;

		printf("\nTesting Idea Encrypt (CBC mode) 10 longs........\n");

		for ( i = 0; i < 10; i ++)
			message[i] = i;
		messageLen = 40;  //10 longs = 40 bytes

		Arm_IdeaEncCbcInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
		ulOutDataLen = 0;
		blocks = (messageLen + 7) / 8;
		for ( i = 0; i < blocks - 1; i ++)
		{
			memcpy(pbInData, &message[i*2], 8);
			Arm_IdeaEncCbcUpdate(&ideaCtx, pbInData, 8,
				data, &len);
			memcpy(&pbOutData[i*8], data, len);
			ulOutDataLen += len;
		}
		leftbytes = messageLen-i*8;
		memcpy(pbInData, &message[i*2], leftbytes);
		Arm_IdeaEncCbcFinalize(&ideaCtx, pbInData, leftbytes,
				data, &len);
		memcpy(&pbOutData[i*8], data, len);
		ulOutDataLen += len;
		printf("Encrypt...\n  ");
		for ( i = 0; i < ulOutDataLen; i ++)
			printf("%02x   ", ((unsigned int) pbOutData[i])&0x00ff);

		memcpy(pbInData, pbOutData, ulOutDataLen);

		Arm_IdeaDecCbcInitialize(&ideaCtx, pbIdeaKey, ulIdeaKeyLen);
		blocks = (ulOutDataLen + 7) / 8;
		ulOutDataLen = 0;
		for ( i = 0; i < blocks - 1; i ++)
		{
			Arm_IdeaDecCbcUpdate(&ideaCtx, &pbInData[i*8], 8,
				data, &len);
			memcpy(&pbOutData[i*8], data, len);
			ulOutDataLen += len;
		}
		Arm_IdeaDecCbcFinalize(&ideaCtx, &pbInData[i*8], 8,
				data, &len);
		memcpy(&pbOutData[i*8], data, len);
		ulOutDataLen += len;
		printf("\nDecrypt...\n  ");
		for ( i = 0; i < ulOutDataLen; i ++)
			printf("%02x   ", ((unsigned int) pbOutData[i])&0x00ff);
		printf("\n");

		if (memcmp(message, pbOutData, ulOutDataLen) != 0)
		{
			printf("ERROR!!!!_____Idea CBC(10 longs)_____\n\n");
			return ARMERR_GENERIC_ERROR;
		}
		else
		{
			printf("SUCCESS!!!!_____Idea CBC(10 longs)_____\n\n");
		}
	}
	/************if*ARMERR_SUCCESS*Cbc*功能测试*OK*************************/
	return ARMERR_SUCCESS;
}

⌨️ 快捷键说明

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