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

📄 idea.c.bak

📁 IDEA对称算法的软件实现
💻 BAK
📖 第 1 页 / 共 3 页
字号:

	ideaCipher(pbInData, pbOutData, ideaCtx->ek);
	*ulOutDataLen = IDEABLOCKBYTES;

	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_IdeaEncEcbFinalize	: Idea算法Ecb模式加密最后一块(<=8字节) 
	Return value:
		ARMERR_SUCCESS		: Success
		other				: failed
	Parameters:
		ideaCtx				: IDEA密钥						input
		pbInData			: 待加密的明密文				input
		ulInDataLen			: 待加密的明文长度				input
		pbOutData			: 加密后的密文					output
		*ulOutDataLen		: 加密后的密文长度				output
*****************************************************************/
ARM_RV Arm_IdeaEncEcbFinalize(
			ARM_IDEA_CTX	*ideaCtx,
			ARM_UINT8	*pbInData,
			ARM_UINT32	ulInDataLen,
			ARM_UINT8	*pbOutData,
			ARM_UINT32	*ulOutDataLen) // pbOutData 在上层至少分配16字节空间
{
	unsigned char data[16];
	int pad_bytes; 
	ARM_UINT32 dataLen;
	int i;

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

	/**************************************************************
	 * 对最后一块加pad加密,满足数据长度=8 或 16(if ulInDataLen ==8)
	 *************************************************************/
	pad_bytes = IDEABLOCKBYTES - (ulInDataLen % IDEABLOCKBYTES);
	if (pad_bytes == IDEABLOCKBYTES)
	{
		for (i=0;i<pad_bytes;i++) 
			data[7-i]=(unsigned char)pad_bytes;
		Arm_IdeaEncRaw((unsigned char*)ideaCtx->ek, ideaCtx->ekBytes,
			pbInData, ulInDataLen, pbOutData, &dataLen);
		Arm_IdeaEncRaw((unsigned char*)ideaCtx->ek, ideaCtx->ekBytes,
			data, 8, &pbOutData[8], ulOutDataLen);
		*ulOutDataLen += dataLen;
	}
	else
	{
		memcpy(data, pbInData, ulInDataLen);
		for (i=0;i<pad_bytes;i++)
			data[7-i]=(unsigned char)pad_bytes;
		Arm_IdeaEncRaw((unsigned char*)ideaCtx->ek, ideaCtx->ekBytes,
			data, 8, pbOutData, ulOutDataLen);
	}
	/************************加 pad OK****************************/

	return ARMERR_SUCCESS;
}

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

	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_IdeaDecEcbUpdate	: 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_IdeaDecEcbUpdate(
			ARM_IDEA_CTX *ideaCtx,
			ARM_UINT8   *pbInData,
			ARM_UINT32  ulInDataLen,
			ARM_UINT8   *pbOutData,
			ARM_UINT32  *ulOutDataLen)
{
	if (ulInDataLen != IDEABLOCKBYTES)
		return ARMERR_PARAM;

	ideaCipher(pbInData, pbOutData, ideaCtx->dk);
	*ulOutDataLen = IDEABLOCKBYTES;

	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_IdeaDecEcbFinalize	: Idea算法Ecb模式解密最后一块(减pad,恢复明文)
	Return value:
		ARMERR_SUCCESS		: Success
		other				: failed
	Parameters:
		ideaCtx				: IDEA解密密钥					input
		pbInData			: 待解密的密文					input
		ulInDataLen			: 待解密的密文长度				input
		pbOutData			: 解密后的明文					output
		*ulOutDataLen		: 解密后的明文长度				output
*****************************************************************/
ARM_RV Arm_IdeaDecEcbFinalize(
			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_IdeaDecRaw((unsigned char*)ideaCtx->dk, ideaCtx->dkBytes,
		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_IdeaEncCbcInitialize	: Idea算法Cbc模式加密初始化(扩展加密密钥) 
								  设置IsFirstBlock为真
	Return value:
		ARMERR_SUCCESS		: Success
		other				: failed
	Parameters:
		ideaCtx				: IDEA密钥,包含加密密钥		output
		pbIdeaKey			: IDEA扩展前的密钥				input
		ulIdeaKeyLen		: IDEA扩展前的密钥长度字节数(=8)input
*****************************************************************/
ARM_RV Arm_IdeaEncCbcInitialize(
			ARM_IDEA_CTX *ideaCtx,
			ARM_UINT8   *pbIdeaKey,
			ARM_UINT32  ulIdeaKeyLen)
//			ARM_UINT8   *pbIv)   //这是什么?
{
	ideaExpandKey(pbIdeaKey, ulIdeaKeyLen, ideaCtx->ek, &(ideaCtx->ekBytes));
	ideaCtx->IsFirstBlock = 1;

	return ARMERR_SUCCESS;
}

/**********************************************************************
	Arm_IdeaEncCbcUpdate	: Idea算法Cbc模式加密小整块密文8字节(update) 
	Return value:
		ARMERR_SUCCESS		: Success
		other				: failed
	Parameters:
		ideaCtx				: IDEA Cbc上下文				input
		pbInData			: 待加密的明密文				input
		ulInDataLen			: 待加密的明文长度				input
		pbOutData			: 加密后的密文					output
		*ulOutDataLen		: 加密后的密文长度				output
***********************************************************************/
ARM_RV Arm_IdeaEncCbcUpdate(
			ARM_IDEA_CTX *ideaCtx,
			ARM_UINT8   *pbInData,
			ARM_UINT32  ulInDataLen,
			ARM_UINT8   *pbOutData,
			ARM_UINT32  *ulOutDataLen)
{
	ARM_UINT8		data[DES_BLOCKLEN];
	unsigned long	i;

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

	if (!(ideaCtx->IsFirstBlock)) 
	{
		for ( i = 0; i < ulInDataLen; i ++)
			data[i] = (unsigned char)(ideaCtx->CbcCtx[i] ^ pbInData[i]);
	}
	else
	{
		memcpy(data, pbInData, ulInDataLen);
		ideaCtx->IsFirstBlock = 0;
	}

	Arm_IdeaEncRaw((unsigned char*)ideaCtx->ek, ideaCtx->ekBytes,
		data, ulInDataLen, pbOutData, ulOutDataLen);

	if (*ulOutDataLen != IDEABLOCKBYTES)
		return ARMERR_GENERIC_ERROR;

	memcpy(ideaCtx->CbcCtx, pbOutData, *ulOutDataLen);

	return ARMERR_SUCCESS;  
}

/**********************************************************************
	Arm_IdeaEncCbcFinalize	: 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_IdeaEncCbcFinalize(
			ARM_IDEA_CTX *ideaCtx,
			ARM_UINT8   *pbInData,
			ARM_UINT32  ulInDataLen,
			ARM_UINT8   *pbOutData,    // 至少分配16字节内存
			ARM_UINT32  *ulOutDataLen)
{
	unsigned char	data[16];
	ARM_UINT32	dataLen;
	int			pad_bytes; 
	int			i;

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

	/**************************************************************
	 * 对最后一块加pad加密,满足数据长度=8 或 16(if ulInDataLen ==8)
	 *************************************************************/
	pad_bytes = IDEABLOCKBYTES - (ulInDataLen % DES_BLOCKLEN);
	if (pad_bytes == IDEABLOCKBYTES)
	{
		for (i=0;i<pad_bytes;i++) 
			data[7-i]=(unsigned char)pad_bytes;

		Arm_IdeaEncCbcUpdate(ideaCtx, pbInData, ulInDataLen,
			pbOutData, &dataLen);
		Arm_IdeaEncCbcUpdate(ideaCtx, data, 8,
			&pbOutData[8], ulOutDataLen);

		*ulOutDataLen += dataLen;
	}
	else
	{
		memcpy(data, pbInData, ulInDataLen);
		for (i=0;i<pad_bytes;i++)
			data[7-i]=(unsigned char)pad_bytes;
		Arm_IdeaEncCbcUpdate(ideaCtx, data, 8,
			pbOutData, ulOutDataLen);
	}
	/************************加 pad 加密 OK************************/

	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_IdeaDecEcbInitialize	: Idea算法Cbc模式解密开始(扩展解密密钥)
								初始化IsFirstBlock为真
	Return value:
		ARMERR_SUCCESS		: Success
		other				: failed
	Parameters:
		ideaCtx				: IDEA Cbc 上下文				output
		pbIdeaKey			: IDEA扩展前的密钥				input
		ulIdeaKeyLen		: IDEA扩展前的密钥长度字节数(=8)input
*****************************************************************/
ARM_RV Arm_IdeaDecCbcInitialize(
			ARM_IDEA_CTX  *ideaCtx,
			ARM_UINT8    *pbIdeaKey,
			ARM_UINT32   ulIdeaKeyLen)
{
	ideaExpandKey(pbIdeaKey, ulIdeaKeyLen, ideaCtx->ek, &(ideaCtx->ekBytes));
	ideaInvertKey(ideaCtx->ek, ideaCtx->ekBytes, ideaCtx->dk, &(ideaCtx->dkBytes));
	ideaCtx->IsFirstBlock = 1;

	return ARMERR_SUCCESS;
}

/*****************************************************************
	Arm_IdeaDecEcbUpdate	: Idea算法Cbc模式解密小整块密文8字节(update) 
	Return value:
		ARMERR_SUCCESS		: Success
		other				: failed
	Parameters:
		ideaCtx				: IDEA Cbc 解密上下文			input
		pbInData			: 待解密的密文					input
		ulInDataLen			: 待解密的密文长度				input
		pbOutData			: 解密后的明文					output
		*ulOutDataLen		: 解密后的明文长度				output
*****************************************************************/
ARM_RV Arm_IdeaDecCbcUpdate(
			ARM_IDEA_CTX *ideaCtx,
			ARM_UINT8   *pbInData,
			ARM_UINT32  ulInDataLen,
			ARM_UINT8   *pbOutData,
			ARM_UINT32  *ulOutDataLen)
{
	ARM_UINT8		data[IDEABLOCKBYTES];
	unsigned long	i;

	if (ulInDataLen != IDEABLOCKBYTES)
		return ARMERR_PARAM;

⌨️ 快捷键说明

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