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

📄 udptortp.cpp

📁 AES一种常用的加密解密方法 AES加密解密程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "Aes.h"
#include "UDPTORTP.h"

#define SRTP_PORT 0
#define MIKEY_PORT 2269
#define RTP_PORT 2


//////////////////////////////////////////////////////////////////////////
//解UDP包
///////////////////////////////////////////////////////////////////////////
void UDPTORTP::MDPC_MTKD_DeUDP(char* p,int lenth)
{
	char *put;
	put=new char[lenth];
	memcpy(put,p,lenth);
	char *out;
	out=new char[lenth];
	
	
	switch(port) 
	{
	case SRTP_PORT:
		{
			MDPC_MTKD_BMTK(put,lenth);
			MDPC_MTKD_DeRTP(put,lenth,out);
		}
		break;
	case MIKEY_PORT: //2269 MIKEY 
		{	   
			MDPC_MTKD_BMTK(put,lenth);
		}
		break;
	case RTP_PORT:
		MDPC_MTKD_DeRTP(put,lenth,out);
        break;
	default:
		printf("error\n");
		break;
	}
}
////////////////////////////////////////////////////////////////////////////////
//解MIKEY消息 
///////////////////////////////////////////////////////////////////////////////
void UDPTORTP::MDPC_MTKD_BMTK(char* data,int lenth)
{
	unsigned long i=0;
    int value=0;
	int	keylen=0,saltlen=0,Len=0;
	
	//初始化MIKEY包
	MikeyNum.Version=data[0];
	MikeyNum.Data_type=data[1];
	MikeyNum.Next_payload=data[2];
	MikeyNum.HDRNum.Version=data[3];
	MikeyNum.HDRNum.Data_type=data[4];
	MikeyNum.HDRNum.Next_payload=data[5];
	MikeyNum.HDRNum.V_Prf_func=data[6];
	temp=data[10];
	MikeyNum.HDRNum.Csb_id=temp<<24;
	temp=0;
	temp=data[9];
	MikeyNum.HDRNum.Csb_id += temp<<16;
	temp=0;
	temp=data[8];
	MikeyNum.HDRNum.Csb_id += temp<<8;
	temp=0;
	temp=data[8];
	MikeyNum.HDRNum.Csb_id +=temp;
	//MikeyNum.HDRNum.Csb_id=data[7]+data[8]<<8+data[9]<<16+data[10]<<24;
	MikeyNum.HDRNum.Cs=data[11];
	MikeyNum.HDRNum.Cs_type=data[12];
	for(i=0;i<(unsigned long)MikeyNum.HDRNum.Cs;i++)
	{
		MikeyNum.HDRNum.SRTP_IDNum.Policy_no_i=data[13];
		temp=0;
		temp=data[16];
		MikeyNum.HDRNum.SRTP_IDNum.SSRC_i=temp<<24;
		temp=0;
		temp=data[15];
		MikeyNum.HDRNum.SRTP_IDNum.SSRC_i+=temp<<16;
		temp=0;
		temp=data[14];
		MikeyNum.HDRNum.SRTP_IDNum.SSRC_i+=temp<<8;
		temp=0;
		temp=data[13];
		MikeyNum.HDRNum.SRTP_IDNum.SSRC_i+=temp;
		//MikeyNum.HDRNum.p_srtp_id->SSRC_i=data[13]+data[14]<<8+data[15]<<16+data[16]<<24;
		temp=0;
		temp=data[16];
		MikeyNum.HDRNum.SRTP_IDNum.ROC_i=temp<<24;
		temp=0;
		temp=data[15];
		MikeyNum.HDRNum.SRTP_IDNum.ROC_i+=temp<<16;
		temp=0;
		temp=data[14];
		MikeyNum.HDRNum.SRTP_IDNum.ROC_i+=temp<<8;
		temp=0;
		temp=data[13];
		MikeyNum.HDRNum.SRTP_IDNum.ROC_i+=temp;
		//MikeyNum.HDRNum.p_srtp_id->ROC_i=data[17]+data[18]<<8+data[19]<<16+data[20]<<24;
	}
	//类似循环链表//////////////////////////////////////////
	value=data[5];
	for(i=20;value;)
	{
		switch(value) 
		{
		case 1:
			{
				MikeyNum.PayloadNum.KEMACNum.Next_payload=data[i+1];
				MikeyNum.PayloadNum.KEMACNum.Encr_alg=data[i+2];
				MikeyNum.PayloadNum.KEMACNum.Encr_data_len=data[i+3];
				MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Next_payload=data[i+4];
				MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Type_kv=data[i+5];
				temp=0;
				temp=data[i+7];
				MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Key_data_len=temp<<8;
				temp=0;
				temp=data[i+6];
				MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Key_data_len+=temp;
				//MikeyNum.U_Payload.KEMACNum.KEYSUBNum.Key_data_len=data[i+6]+data[i+7]<<8;
				keylen=MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Key_data_len;
				memcpy(MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Key_data_buffer,data+i+8,keylen);
				MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Salt_len=data[i+8+keylen];
				saltlen=data[i+8+keylen];
				memcpy(MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Salt_data_buffer,data+i+9+keylen,saltlen);
				Len=keylen+saltlen;
				int Len_spi=0,Len_in=0;
				switch(data[i+5]&0x0f) 
				{
				case 0:
					i=Len+9+i;
					break;
				case 1:
					{
						MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_spiNum.SPI_len=data[i+10+Len];
						Len_spi=data[i+10+Len];
						memcpy(MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_spiNum.SPI_data_buffer,data+i+11+Len,Len_spi);
						i=Len_spi+Len+11+i;
					}
					break;
				case 3:
					{
						MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_inNum.VF_lenth=data[i+10+Len];
						Len_in=data[i+10+Len];
						memcpy(MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_inNum.From,data+i+11+Len,Len_in);
						Len=Len_in+Len;
						MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_inNum.VT_lenth=data[i+12+Len];
						Len_in=data[i+12+Len];
						memcpy(MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_inNum.To,data+i+13+Len,Len_in); 
						i=Len+Len_in+13+i;					 
					}
					break;
				default:
					{
						i=Len+9+i;
						printf("Error");
					}				
					break;
				}
				value=MikeyNum.PayloadNum.KEMACNum.Next_payload;
			}
			break;
		case 4:
			{
				temp=0;
				temp=data[i+2];
				MikeyNum.PayloadNum.SignNum.S_sign_len=temp<<8;
				temp=0;
				temp=data[i+1];
				MikeyNum.PayloadNum.SignNum.S_sign_len=temp+MikeyNum.PayloadNum.SignNum.S_sign_len;
				//MikeyNum.U_Payload.SignNum.S_sign_len=data[i+1]+data[i+2]<<8;
				Len=MikeyNum.PayloadNum.SignNum.S_sign_len;
				memcpy(MikeyNum.PayloadNum.SignNum.Sdata,data+i+3,Len);
				i=Len+3+i;
				value=0;
			}
			break;
		case 5:
			{
				MikeyNum.PayloadNum.TimestampNum.Next_payload=data[i+1];
				MikeyNum.PayloadNum.TimestampNum.Ts_type=data[i+2];
				if(data[i+2]==2)
				{
					memcpy(MikeyNum.PayloadNum.TimestampNum.Ts_value,data+i+3,4);
					i=i+3+4;
				}
				if(data[i+2]==1)
				{
					memcpy(MikeyNum.PayloadNum.TimestampNum.Ts_value,data+i+3,8);
					i=i+3+8;
				}
				if(data[i+2]==0)
				{
					memcpy(MikeyNum.PayloadNum.TimestampNum.Ts_value,data+i+3,8);
					i=i+3+8;
				}
				value=MikeyNum.PayloadNum.TimestampNum.Next_payload;
			}
			break;
		case 6:
			{
				MikeyNum.PayloadNum.IDNum.Next_payload=data[i+1];
				MikeyNum.PayloadNum.IDNum.Itype=data[i+2];
				temp=0;
				temp=data[i+4];
				MikeyNum.PayloadNum.IDNum.len=temp<<8;
				temp=0;
				temp=data[i+3];
				MikeyNum.PayloadNum.IDNum.len=temp+MikeyNum.PayloadNum.IDNum.len;
				//MikeyNum.U_Payload.IDNum.len=data[i+3]+data[i+4]<<8;
				Len=MikeyNum.PayloadNum.IDNum.len;
				memcpy(MikeyNum.PayloadNum.IDNum.data,data+i+5,Len);
				i=Len+i+5;
				value=MikeyNum.PayloadNum.IDNum.Next_payload;
			}
			break;
		case 7:
			{
				MikeyNum.PayloadNum.CertNum.Next_payload=data[i+1];
				MikeyNum.PayloadNum.CertNum.Itype=data[i+2];
				temp=0;
				temp=data[i+4];
				MikeyNum.PayloadNum.CertNum.len=temp<<8;
				temp=0;
				temp=data[i+3];
				MikeyNum.PayloadNum.CertNum.len=temp+MikeyNum.PayloadNum.CertNum.len;
				//MikeyNum.U_Payload.CertNum.len=data[i+3]+data[i+4]<<8;
				Len=MikeyNum.PayloadNum.CertNum.len;
				memcpy(MikeyNum.PayloadNum.CertNum.data,data+i+5,Len);
				i=Len+i+5;
				value=MikeyNum.PayloadNum.CertNum.Next_payload;
			}
			break;
		case 8:
			{
				MikeyNum.PayloadNum.HashNum.Next_payload=data[i+1];
				MikeyNum.PayloadNum.HashNum.Func=data[i+2];
				if (data[i+2]==0)
				{
					memcpy(MikeyNum.PayloadNum.HashNum.data,data+i+3,20);
					i=i+3+20;
				}
				else
					if(data[i+2]==1)
					{
						memcpy(MikeyNum.PayloadNum.HashNum.data,data+i+3,16);
						i=i+3+16;
					}
					value=MikeyNum.PayloadNum.HashNum.Next_payload;
            }
			break;
		case 9:
			{
				MikeyNum.PayloadNum.VNum.Next_payload=data[i+1];
				MikeyNum.PayloadNum.VNum.Auth=data[i+2];
				Len=data[i+2];
				memcpy(MikeyNum.PayloadNum.VNum.data,data+i+3,Len);
				i=i+3+Len;
				value=MikeyNum.PayloadNum.VNum.Next_payload;
			}
			break;
		case 10:
			{
				MikeyNum.PayloadNum.SPNum.Next_payload=data[i+1];
				MikeyNum.PayloadNum.SPNum.Policy_no=data[i+2];
				MikeyNum.PayloadNum.SPNum.Prot_type=data[i+3];
				temp=0;
				temp=data[i+5];
				MikeyNum.PayloadNum.SPNum.Param_len=temp<<8;
				temp=0;
				temp=data[i+4];
				MikeyNum.PayloadNum.SPNum.Param_len=temp+MikeyNum.PayloadNum.SPNum.Param_len;
				//MikeyNum.U_Payload.SPNum.Param_len=data[i+4]+data[i+5]<<8;
				MikeyNum.PayloadNum.SPNum.ParamNum.Type=data[i+6];
				MikeyNum.PayloadNum.SPNum.ParamNum.Len=data[i+7];
				Len=data[i+7];
				memcpy(MikeyNum.PayloadNum.SPNum.ParamNum.Value,data+i+8,Len);
				i=i+8+Len;
				value=MikeyNum.PayloadNum.SPNum.Next_payload;
			}
			break;
		case 11:
			{
				MikeyNum.PayloadNum.RandNum.Next_payload=data[i+1];
				MikeyNum.PayloadNum.RandNum.Rand_Len=data[i+2];
				Len=data[i+2];
				memcpy(MikeyNum.PayloadNum.RandNum.data,data+i+2,Len);
				i=i+2+Len;
				value=MikeyNum.PayloadNum.RandNum.Next_payload;
			}
			break;
		case 12:
			{
				MikeyNum.PayloadNum.ErrNum.Next_payload=data[i+1];
				MikeyNum.PayloadNum.ErrNum.Err_no=data[i+2];
				temp=0;
				temp=data[i+4];
				MikeyNum.PayloadNum.ErrNum.Reserved=temp<<8;
				temp=0;
				temp=data[i+3];
				MikeyNum.PayloadNum.ErrNum.Reserved=temp+MikeyNum.PayloadNum.ErrNum.Reserved;
				//MikeyNum.U_Payload.ErrNum.Reserved=data[i+3]+data[i+4]<<8;
				i=i+4;
				value=MikeyNum.PayloadNum.ErrNum.Next_payload;
			}
			break;
		case 20:
			{
				MikeyNum.PayloadNum.KEYNum.Next_payload=data[i+4];
				MikeyNum.PayloadNum.KEYNum.Type_kv=data[i+5];
				temp=0;
				temp=data[i+7];
				MikeyNum.PayloadNum.KEYNum.Key_data_len=temp<<8;
				temp=0;
				temp=data[i+6];
				MikeyNum.PayloadNum.KEYNum.Key_data_len=temp+MikeyNum.PayloadNum.KEYNum.Key_data_len;
				//MikeyNum.U_Payload.KEYNum.Key_data_len=data[i+6]+data[i+7]<<8;
				keylen=MikeyNum.PayloadNum.KEYNum.Key_data_len;
				memcpy(MikeyNum.PayloadNum.KEYNum.Key_data_buffer,data+i+8,keylen);
				MikeyNum.PayloadNum.KEYNum.Salt_len=data[i+8+keylen];
				saltlen=data[i+8+keylen];
				memcpy(MikeyNum.PayloadNum.KEYNum.Salt_data_buffer,data+i+9+keylen,saltlen);
				Len=keylen+saltlen;
				int Len_spi=0,Len_in=0;
				switch(data[i+5]&0x0f) 
				{
				case 0:
					i=Len+9+i;
					break;
				case 1:
					{
						MikeyNum.PayloadNum.KEYNum.KVNum.Kv_spiNum.SPI_len=data[i+10+Len];
						Len_spi=data[i+10+Len];
						memcpy(MikeyNum.PayloadNum.KEYNum.KVNum.Kv_spiNum.SPI_data_buffer,data+i+11+Len,Len_spi);
						i=Len_spi+Len+11+i;
					}
					break;
				case 3:
					{
						MikeyNum.PayloadNum.KEYNum.KVNum.Kv_inNum.VF_lenth=data[i+10+Len];
						Len_in=data[i+10+Len];
						memcpy(MikeyNum.PayloadNum.KEYNum.KVNum.Kv_inNum.From,data+i+11+Len,Len_in);
						Len=Len_in+Len;
						MikeyNum.PayloadNum.KEYNum.KVNum.Kv_inNum.VT_lenth=data[i+12+Len];
						Len_in=data[i+12+Len];
						memcpy(MikeyNum.PayloadNum.KEYNum.KVNum.Kv_inNum.To,data+i+13+Len,Len_in); 
						i=Len+Len_in+13+i;					 
					}
					break;
				default:printf("Error");
					break;
				}
				value=MikeyNum.PayloadNum.KEYNum.Next_payload;
			}
			break;			
		case 21:
			{
				MikeyNum.PayloadNum.Gen_ext.Next_payload=data[i+1];
				MikeyNum.PayloadNum.Gen_ext.Type=data[i+2];
				temp=0;
				temp=data[i+4];
				MikeyNum.PayloadNum.Gen_ext.Len=temp<<8;
				temp=0;
				temp=data[i+3];
				MikeyNum.PayloadNum.Gen_ext.Len=temp+MikeyNum.PayloadNum.Gen_ext.Len;
				//MikeyNum.U_Payload.Gen_ext.Len=data[i+3]+data[i+4]<<8;
				Len=MikeyNum.PayloadNum.Gen_ext.Len;
				memcpy(MikeyNum.PayloadNum.Gen_ext.data,data+i+5,Len);
				i=i+5+Len;
				value=MikeyNum.PayloadNum.Gen_ext.Next_payload;
			}
			break;
		default:
			{
				i=20;
				printf("Error");
			}
			break;
		}
}
////////////////////////////////////////////////////////
temp=0;
temp=data[i+4];
MikeyNum.Mac_Signature=temp<<24;
temp=0;
temp=data[i+3];
MikeyNum.Mac_Signature+=temp<<16;
temp=0;
temp=data[i+2];
MikeyNum.Mac_Signature+=temp<<8;
temp=0;
temp=data[i+1];
MikeyNum.Mac_Signature+=temp;
//MikeyNum.Mac_Signature=data[i+1]+data[i+2]<<8+data[i+3]<<16+data[i+4]<<24;

//////////////////////////////////////////////////////////////////////////////////
//MIKEY包初始化完成
//////////////////////////////////////////////////////////////////////////////////
/*
MiNum.Version=data[0];

⌨️ 快捷键说明

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