📄 tcli.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 + -