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

📄 des.c

📁 M.CORE--des加密程序,位数可选
💻 C
字号:
/* Copyright (c) 2006,    All rights reserved.*/#include "ht32a256.h"#include "des.h"#include "deftype.h"#include "pubdef.h"/**********************************************************************///Des模块复位//输入:空//输出:空/**********************************************************************/void  Reset_Des(void){	outp_w(HTC_DES_CR,DES_CR_RST);}/**********************************************************************///等待DES处理结束//输入:空//输出:空/**********************************************************************/void Wait_Des_Int(){	while(!(inp_w(HTC_DES_STATE)&DES_STATE_OAF));}/**********************************************************************///DES 配置 //crypt   DES_MODE_ED/**********************************************************************/void Des_Config(UINT8 *pbKey, UINT8 *pbIv,UINT8 bType, UINT8 bMode, UINT8 crypt){	switch(bType)					//根据加密类型选择KEY	{		case TRIBLE_KEY:		    outp_w(HTC_DES_KEY3H	,byte_word(&pbKey[16]));			outp_w(HTC_DES_KEY3L	,byte_word(&pbKey[20]));		case DOUBLE_KEY:		    outp_w(HTC_DES_KEY2H	,byte_word(&pbKey[8]));			outp_w(HTC_DES_KEY2L	,byte_word(&pbKey[12]));		case SINGLE_KEY:		    outp_w(HTC_DES_KEY1H	,byte_word(&pbKey[0]));			outp_w(HTC_DES_KEY1L	,byte_word(&pbKey[4]));			break;			default:		    return ;     //非法类型			break;			}	outp_w(HTC_DES_IVH	,byte_word(&pbIv[0]));	outp_w(HTC_DES_IVL	,byte_word(&pbIv[4]));	    if(crypt==DES_ENCRYPT)    {    	outp_w(HTC_DES_MODE	,DES_MODE_ERRM|DES_MODE_UE|DES_MODE_ED|(bType<<2)|bMode);		//DES 类型 加密 模式    }    else	    {    	outp_w(HTC_DES_MODE	,DES_MODE_ERRM|DES_MODE_UE|(bType<<2)|bMode);		//DES 类型 解密 模式    }  }/**********************************************************************//**********************************************************************/void Des_Crypt(UINT8 *pbBuffer, UINT8 *pbOutput,UINT8 len){	UINT16 i;	UINT32 stat;    for(i=0;i<len;i=i+8)   //8字节加密	{	 	outp_w(HTC_DES_DATAINH	,byte_word(&pbBuffer[i]));		outp_w(HTC_DES_DATAINL	,byte_word(&pbBuffer[i+4]));										outp_w(HTC_DES_CR,inp_w(HTC_DES_CR)|DES_CR_IAF);		//DES 启动				outp_w(HTC_DES_CR,0x03);		//DES 启动		while(!(inp_w(HTC_DES_STATE)&DES_STATE_OAF));	    stat=inp_w(HTC_DES_STATE);		if((stat&DES_STATE_OAF)==DES_STATE_OAF)		{			word_byte(&pbOutput[i],inp_w(HTC_DES_DATAOUTH));					word_byte(&pbOutput[i+4],inp_w(HTC_DES_DATAOUTL));				}		outp_w(HTC_DES_CR,DES_CR_ORF);	}}/**********************************************************************///DES加密处理 //输入:pbKey加密KEY的数据,KEY1H,KEY1L,KEY2H,KEY2L,KEY3H,KEY3L//      pbIV CBC模式的初始向量。 IVH,IVL //      pbBuffer要加密的8字节数据,pbOutput 输出8字节的密文//      len 加密数据长度//      bType加密类型,SINGLE_KEY,DOUBLE_KEY,TRIBLE_KEY//		bMode加密模式,MODE_ECB,MODE_NFRCBC,MODE_FRCBC//      len 加密数据长度//输出: 处理状态 /**********************************************************************/UINT32 Des_A_Encrypt(UINT8 *pbKey,UINT8 *pbIv, UINT8 *pbBuffer, UINT8 *pbOutput,UINT8 bType, UINT8 bMode){	UINT32    tmp;	UINT16    i;	switch(bType)					//根据加密类型选择KEY	{		case TRIBLE_KEY:		    outp_w(HTC_DES_KEY3H	,byte_word(&pbKey[16]));			outp_w(HTC_DES_KEY3L	,byte_word(&pbKey[20]));		case DOUBLE_KEY:		    outp_w(HTC_DES_KEY2H	,byte_word(&pbKey[8]));			outp_w(HTC_DES_KEY2L	,byte_word(&pbKey[12]));		case SINGLE_KEY:		    outp_w(HTC_DES_KEY1H	,byte_word(&pbKey[0]));			outp_w(HTC_DES_KEY1L	,byte_word(&pbKey[4]));			break;			default:		    return ERROR;     //非法类型			break;			}	outp_w(HTC_DES_IVH	,byte_word(&pbIv[0]));	outp_w(HTC_DES_IVL	,byte_word(&pbIv[4]));	outp_w(HTC_DES_DATAINH	,byte_word(&pbBuffer[0]));	outp_w(HTC_DES_DATAINL	,byte_word(&pbBuffer[4]));			outp_w(HTC_DES_MODE	,DES_MODE_ERRM|DES_MODE_UE|DES_MODE_ED|(bType<<2)|bMode);		//DES 类型 加密 模式     									outp_w(HTC_DES_CR,inp_w(HTC_DES_CR)|DES_CR_IAF);		//DES 模式	Wait_Des_Int();  //等待//结果		   	if((inp_w(HTC_DES_STATE)&DES_STATE_OAF)==DES_STATE_OAF)	{		word_byte(&pbOutput[0],inp_w(HTC_DES_DATAOUTH));				word_byte(&pbOutput[4],inp_w(HTC_DES_DATAOUTL));			}	 	 	outp_w(HTC_DES_CR,DES_CR_ORF); 	return OK;	}/**********************************************************************///DES解密处理 //输入:pbKey加密KEY的数据,KEY1H,KEY1L,KEY2H,KEY2L,KEY3H,KEY3L//      pbBuffer要解密的8字节数据,pbOutput 输出8字节的明文//      len 解密数据长度//      bType加密类型,SINGLE_KEY,DOUBLE_KEY,TRIBLE_KEY//		bMode加密模式,MODE_ECB,MODE_NFRCBC,MODE_FRCBC//输出: 处理状态/**********************************************************************/UINT32 Des_A_Decrypt(UINT8 *pbKey,UINT8 *pbIv,  UINT8 *pbBuffer, UINT8 *pbOutput, UINT8 bType, UINT8 bMode){	UINT32    tmp;	UINT8 *tpbOutput;                   switch(bType)					//根据加密类型选择KEY	{		case TRIBLE_KEY:		    outp_w(HTC_DES_KEY3H	,byte_word(&pbKey[16]));			outp_w(HTC_DES_KEY3L	,byte_word(&pbKey[20]));		case DOUBLE_KEY:		    outp_w(HTC_DES_KEY2H	,byte_word(&pbKey[8]));			outp_w(HTC_DES_KEY2L	,byte_word(&pbKey[12]));		case SINGLE_KEY:		    outp_w(HTC_DES_KEY1H	,byte_word(&pbKey[0]));			outp_w(HTC_DES_KEY1L	,byte_word(&pbKey[4]));			break;			default:		    return ERROR;     //非法类型			break;			}	//写输入数据    	outp_w(HTC_DES_IVH	,byte_word(&pbIv[0]));	outp_w(HTC_DES_IVL	,byte_word(&pbIv[4]));	outp_w(HTC_DES_DATAINH	,byte_word(&pbBuffer[0]));	outp_w(HTC_DES_DATAINL	,byte_word(&pbBuffer[4]));				outp_w(HTC_DES_MODE	,DES_MODE_ERRM|DES_MODE_UE|(bType<<2)|bMode);		//DES 类型 解密 模式     									outp_w(HTC_DES_CR,inp_w(HTC_DES_CR)|DES_CR_IAF);		//DES 模式	Wait_Des_Int();  //等待		//结果			if((inp_w(HTC_DES_STATE)&DES_STATE_OAF)==DES_STATE_OAF)	{		word_byte(&pbOutput[0],inp_w(HTC_DES_DATAOUTH));				word_byte(&pbOutput[4],inp_w(HTC_DES_DATAOUTL));			}			outp_w(HTC_DES_CR,DES_CR_ORF);		return OK;	}void Des_Encrypt(UINT8 *pbKey,UINT8 *pbIv, UINT8 *pbBuffer, UINT8 *pbOutput,UINT8 len, UINT8 bType, UINT8 bMode){	UINT16 i;	UINT8 j;		if(bMode==MODE_CBC)    //CBC 模式, 开始输入初始向量	{		bMode=MODE_FRCBC;    //第一次使用	}        switch(bType)					//根据加密类型选择KEY	{		case TRIBLE_KEY:		    outp_w(HTC_DES_KEY3H	,byte_word(&pbKey[16]));			outp_w(HTC_DES_KEY3L	,byte_word(&pbKey[20]));		case DOUBLE_KEY:		    outp_w(HTC_DES_KEY2H	,byte_word(&pbKey[8]));			outp_w(HTC_DES_KEY2L	,byte_word(&pbKey[12]));		case SINGLE_KEY:		    outp_w(HTC_DES_KEY1H	,byte_word(&pbKey[0]));			outp_w(HTC_DES_KEY1L	,byte_word(&pbKey[4]));			break;			default:		    return ;     //非法类型			break;			}	//写输入数据 	outp_w(HTC_DES_IVH	,byte_word(&pbIv[0]));	outp_w(HTC_DES_IVL	,byte_word(&pbIv[4]));        for(i=0;i<len;i=i+8)   //8字节加密	{		outp_w(HTC_DES_DATAINH	,byte_word(&pbBuffer[i+0]));		outp_w(HTC_DES_DATAINL	,byte_word(&pbBuffer[i+4]));			outp_w(HTC_DES_MODE	,DES_MODE_ERRM|DES_MODE_UE|DES_MODE_ED|(bType<<2)|bMode);		//DES 类型 加密 模式		    										outp_w(HTC_DES_CR,inp_w(HTC_DES_CR)|DES_CR_IAF);		//DES 模式		Wait_Des_Int();  //等待		//结果				if((inp_w(HTC_DES_STATE)&DES_STATE_OAF)==DES_STATE_OAF)		{			word_byte(&pbOutput[i+0],inp_w(HTC_DES_DATAOUTH));					word_byte(&pbOutput[i+4],inp_w(HTC_DES_DATAOUTL));		}				outp_w(HTC_DES_CR,DES_CR_ORF);					if(bMode==MODE_FRCBC)		{			bMode=MODE_NFRCBC;		}	}}void Des_Decrypt(UINT8 *pbKey,UINT8 *pbIv, UINT8 *pbBuffer, UINT8 *pbOutput,UINT8 len, UINT8 bType, UINT8 bMode){    UINT16 i;    UINT8 j;        if(bMode==MODE_CBC)    //CBC 模式, 开始输入初始向量	{		bMode=MODE_FRCBC;    //第一次使用	}        switch(bType)					//根据加密类型选择KEY	{		case TRIBLE_KEY:		    outp_w(HTC_DES_KEY3H	,byte_word(&pbKey[16]));			outp_w(HTC_DES_KEY3L	,byte_word(&pbKey[20]));		case DOUBLE_KEY:		    outp_w(HTC_DES_KEY2H	,byte_word(&pbKey[8]));			outp_w(HTC_DES_KEY2L	,byte_word(&pbKey[12]));		case SINGLE_KEY:		    outp_w(HTC_DES_KEY1H	,byte_word(&pbKey[0]));			outp_w(HTC_DES_KEY1L	,byte_word(&pbKey[4]));			break;			default:		    return ;     //非法类型			break;			}	//写输入数据 	outp_w(HTC_DES_IVH	,byte_word(&pbIv[0]));	outp_w(HTC_DES_IVL	,byte_word(&pbIv[4]));    for(i=0;i<len;i=i+8)   //8字节加密	{		outp_w(HTC_DES_DATAINH	,byte_word(&pbBuffer[i+0]));		outp_w(HTC_DES_DATAINL	,byte_word(&pbBuffer[i+4]));					outp_w(HTC_DES_MODE	,DES_MODE_ERRM|DES_MODE_UE|(bType<<2)|bMode);		//DES 类型 解密 模式    	outp_w(HTC_DES_CR,inp_w(HTC_DES_CR)|DES_CR_IAF);		//DES 模式		Wait_Des_Int();  //等待		//结果				if((inp_w(HTC_DES_STATE)&DES_STATE_OAF)==DES_STATE_OAF)		{			word_byte(&pbOutput[i+0],inp_w(HTC_DES_DATAOUTH));					word_byte(&pbOutput[i+4],inp_w(HTC_DES_DATAOUTL));		}				outp_w(HTC_DES_CR,DES_CR_ORF);			if(bMode==MODE_FRCBC)		{			bMode=MODE_NFRCBC;		}	}}/*//DES 中断消息UINT8 DesIntMsg;#pragma interrupt onvoid ISR_DES(void){	UINT32  stat;	stat=inp_w(HTC_DES_STATE);//数据可输出		if(stat&DES_STATE_OAF==DES_STATE_OAF)	{		DesIntMsg|=DES_OK;	}//校验检测错误		if(stat&DES_STATE_OAF==DES_STATE_ERR0)	{		DesIntMsg|=DES_ERR0;	}	//KNB 错误		if(stat&DES_STATE_OAF==DES_STATE_ERR1)	{		DesIntMsg|=DES_ERR1;	}	}*/#pragma interrupt off

⌨️ 快捷键说明

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