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

📄 tcli.c

📁 C语言和Java语言、嵌入式开发、算法实现为主
💻 C
字号:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/types.h>
#include <winsock.h>
#include <mmsystem.h>
#include "aes.h"

AES_KEY AESHandle;

static unsigned char enc_vec[16];
static unsigned char dec_vec[16];

static int enc_cnt = 0;
static int dec_cnt = 0;

int	aes_keylen;
unsigned char uchKey[33];

#define TEST_LEN 20

#define AES_MAGIC		"abcd"
/*
static void bin2hex(char * hex,char * bin,int len)
{
	int		i;
	char	*p;

	p = hex;
	*p = 0;
	for(i = 0;i < len;i++)
	{
		sprintf(p, "%02X", bin[i]);
		p += 2;
	}
	*p = 0;
}

static void hex2bin1(char * bin,char * hex,int len)
{
	int		i, n;
	char	*p;
	char	digit[3];

	p = bin;
	for(i = 0;i < len;)
	{
		digit[0] = hex[i++];
		digit[1] = hex[i++];
		digit[2] = 0;
		n = atoi(digit);
		*p = (char)n;
		p++;
	}
	*p = 0;
}
*/


VOID hex2bin1(PUCHAR bin,PUCHAR hex,INT len)
{
	INT		i;
	INT		c1,c2;
	INT		l = 0;
	for(i = 0;i < len/2;i++)
	{
		c1 = hex[l++];
		if(c1 >= 'a')
			c1 = c1 - 'a' + 10;
		else if(c1 >= 'A')
			c1 = c1 - 'A' + 10;
		else
			c1 = c1 - '0';

		c2 = hex[l++];
		if(c2 >= 'a')
			c2 = c2 - 'a' + 10;
		else if(c2 >= 'A')
			c2 = c2 - 'A' + 10;
		else
			c2 = c2 - '0';
		bin[i] = (c1 << 4) | c2;
	}
	bin[i] = 0;
}

VOID bin2hex(PUCHAR hex,PUCHAR bin,INT len)
{
	INT		i;
	INT		c;
	INT		l = 0;
	static	UCHAR strhex[]="0123456789ABCDEF";

	for(i = 0;i < len;i++)
	{
		c = bin[i];
		hex[l++] = strhex[c >> 4];
		hex[l++] = strhex[c & 0x0f];
	}
	hex[l] = 0;
}

void test_aes()
{
	char raw[TEST_LEN+1];
	char buf[TEST_LEN+1];
	char test[TEST_LEN+1];
	char hex[128];
	int	 testcnt =1;
	int i;


test_once:
	memset(raw, 0, TEST_LEN);
	memset(buf, 0, TEST_LEN);
	memset(test, 0, TEST_LEN);
	raw[TEST_LEN] = 0;
	buf[TEST_LEN] = 0;
	test[TEST_LEN] = 0;

	strcpy(raw, "abcd");
/*
	bin2hex(hex,raw,strlen(raw));
	printf("%s, %s\n", raw, hex);

	hex2bin1(raw, hex, strlen(hex));

	printf("%s, %s\n", raw, hex);
	return;
*/
	AES_set_encrypt_key(AES_MAGIC, 128, &AESHandle);
	AES_encrypt(raw, buf, &AESHandle);
	bin2hex(hex,buf,strlen(buf));

	AES_set_decrypt_key(AES_MAGIC, 128, &AESHandle);
	hex2bin1(buf,hex,strlen(hex));
	AES_decrypt(buf, test, &AESHandle);


	if(memcmp(raw, test, TEST_LEN) == 0)
		printf("test ok\n\n");
	else
		printf("test failure\n\n");

	printf("raw : %s, test : %s\n", raw, test);

	if(--testcnt == 0)	return;
	goto test_once;
}

int aes_init()
{
	AES_set_encrypt_key(uchKey, aes_keylen, &AESHandle);

	memset(enc_vec, 0, 16);
	memset(dec_vec, 0, 16);

	enc_cnt = 0;
	dec_cnt = 0;
	return 0;
}

int aes_send(int fd, char * raw, int length)
{
	char * buf;
	int ret = 0;

	if(!raw)
		return -1;

	if(length <= 0)
		return length;

	buf = malloc(length);

	AES_cfb128_encrypt(raw, buf,length, &AESHandle, enc_vec, &enc_cnt, 1);

	ret = send(fd, buf, length, 0);

	free(buf);

	return ret;
}

int aes_recv(int fd, char * raw, int length)
{
	char * buf;
	int ret = 0;

	if(!raw)
		return -1;

	if(length <= 0)
		return length;

	buf = malloc(length);

	ret = recv(fd, buf, length, 0);

	if(ret > 0)
		AES_cfb128_encrypt(buf, raw, ret, &AESHandle, dec_vec, &dec_cnt, 0);

	return ret;
}

int Hex2Bin(void * src,void * dst)
{
        int sc,dc;
        int slen;
        int i;
        int dlen = 0;
        unsigned char * s = (unsigned char *)src;
        unsigned char * d = (unsigned char *)dst;

        slen = strlen((char *)s);
        for(i = 0;i < slen;i++)
        {
                sc = s[i];
                if((sc >= '0') && (sc <= '9'))
                {
                        sc -= '0';
                }
                else if((sc >= 'a') && (sc <= 'f'))
                {
                        sc = sc - 'a' + 10;
                }
                else if((sc >= 'A') && (sc <= 'F'))
                {
                        sc = sc - 'A' + 10;
                }
                else
                {
                        if(sc == '\r')
                                break;
                        continue;
                }

                dlen++;
                if(dlen & 1)
                        dc = sc << 4;
                else
                {
                        dc |= sc;
                        d[(dlen / 2) - 1] = dc;
                }
        }
        return dlen / 2;
}

int main(int argc, char ** argv)
{
	int					socket_fd;
	int i;
	struct sockaddr_in	ntd_ip;
	int len;
	fd_set ibits;
	char c;
	struct timeval tm = {0,50};
	char host[256];
	char buf[32768];

	char sbuf[1040];
	char hbuf[1040];
	char rbuf[1040];
	unsigned short port;

	WSADATA	wsadata;
	WSAStartup(0x101, &wsadata);


	for(i = 0;i < 16384;i++)
	{
		buf[i] = 'A' + (i % 26);
	}

	printf("Input device IP address : ");
	scanf("%s",host);
	printf("Input device TCP port : ");
	scanf("%d",&port);

input_key_len:
	printf("Input AES KEY len(1->128, 2->192, 3->256) :");
	scanf("%d",&aes_keylen);
	switch(aes_keylen)
	{
	case 1:
		aes_keylen = 128;
		break;
	case 2:
		aes_keylen = 192;
		break;
	case 3:
		aes_keylen = 256;
		break;
	default:
		goto input_key_len;
		break;
	}

	memset(uchKey, 0, sizeof(uchKey));
	printf("Input AES KEY :");
	scanf("%s", uchKey);

	for(i = strlen(uchKey); i < 33; i++)
	{
		uchKey[i] = 0;
	}


	aes_init();

	memset(&ntd_ip, 0, sizeof(ntd_ip));
	ntd_ip.sin_family = AF_INET;
	ntd_ip.sin_port	= htons(port);	
	ntd_ip.sin_addr.s_addr	= inet_addr(host);

	if (ntd_ip.sin_addr.s_addr == INADDR_NONE) 
	{
		printf("inet_addr error\n");
		return -1;
	}

	if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("tcp socket error\n");
		return -1;
	}
	
	if (connect(socket_fd, (struct sockaddr *)&ntd_ip, sizeof(ntd_ip)) < 0)
	{
		printf("tcp connect error\n");
		return -1;
	}
	len = 1;
//	ioctlsocket(s,FNBIO,&len);

	while(1)
	{
		if(kbhit())
		{
			c = getch();
			fflush(stdin);
			if(c == 0x1b)
				return 0;
			if(c == 0x1a)
			{
				printf("\nsend command :");
				gets(sbuf);
				len = Hex2Bin(sbuf,hbuf);
				aes_send(socket_fd,hbuf,len);
			}
			else
			{
				aes_send(socket_fd,&c,1);
			}
		}
		FD_ZERO(&ibits);
		FD_SET(socket_fd,&ibits);
		tm.tv_sec = 0;
		tm.tv_usec = 50;
		if(select(socket_fd + 1,&ibits,NULL,NULL, &tm) > 0)
		{
			if(FD_ISSET(socket_fd,&ibits))
			{
				len = aes_recv(socket_fd,rbuf,1024);
				if(len <= 0)
					goto on_close;

				for(i = 0;i < len;i++)
				{
					if(((unsigned char)rbuf[i]) == 0xff)
						goto print_hex;
				}
				for(i = 0;i < len;i++)
					putchar(rbuf[i]);
				continue;
print_hex:
				for(i = 0;i < len;i++)
				{
					printf("%02X ",(unsigned char)rbuf[i]);
				}
				printf("\n");

			}
		}
	}

	gets(sbuf);
	sbuf[1023] = 0;
	len = Hex2Bin(sbuf,hbuf);
on_close:
	closesocket(socket_fd);
	WSACleanup();
	return 0;
}

⌨️ 快捷键说明

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