linux 文件 加密传输,服务端和客户端之文件加密传输
void aes_box_encrypt(char* source_string, char* des_string, int size)//負責數據加密
{
int iLoop = 0;
int iLen =0;
char buf[1024];
AES_KEY aes;
unsigned char key[AES_BLOCK_SIZE];
unsigned char iv[AES_BLOCK_SIZE];
if(NULL == source_string || NULL == des_string)
{
return;
}
//Generate own AES Key
for(iLoop = 0; iLoop < 16; iLoop++)
{
key[iLoop] = 32 + iLoop;
}
// Set encryption key
for (iLoop=0; iLoop0)
printf("接收消息成功:'%s',共%d個字節的數據\n", buf, len);
else
printf("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'\n", errno, strerror(errno));
}
void Directory(char* path, SSL* ssl, struct dirent *ptr)//目錄處理
{
char *base = NULL;
base = path;
strcat(ptr->d_name,"/");
char* e = (char*)malloc(strlen(base) + strlen(ptr->d_name) + 1);
strcpy(e,base);
strcat(e,ptr->d_name);
bool ret = readfile(e, ssl, ptr);
}
bool Document(char* Path, SSL *ssl,struct dirent *ptr)//真正發送log文件
{
char a[1024];
int fd = 0;
memset(a,'\0', sizeof(a));
memset(buffer,'\0', sizeof(buffer));
memset(buffer1,'\0', sizeof(buffer1));
strcpy(a, Path);
strcat(a, ptr->d_name);
fd = open(a, O_RDONLY);
read(fd, buffer,sizeof(buffer));//發送兩次數據,第一次是文件名,第二次是文件內容
int len1 = SSL_write(ssl, ptr->d_name, strlen(ptr->d_name));
printf("document name is:%s\n", ptr->d_name);
if (len1 <= 0) {
printf("消息'%s'發送失敗!錯誤代碼是%d,錯誤信息是'%s'\n", buffer, errno, strerror(errno));
return false;
}
else
printf("消息發送成功,共發送了%d個字節!\n", len1);
aes_box_encrypt(buffer, buffer1, sizeof(buffer));
int len = SSL_write(ssl, buffer1, strlen(buffer1));
if (len <= 0) {
printf("消息'%s'發送失敗!錯誤代碼是%d,錯誤信息是'%s'\n", buffer, errno, strerror(errno));
return false;
}
else
printf("消息發送成功,共發送了%d個字節!\n", len);
close(fd);
return true;
}
DIR* readFileList(char *basePath)//打開目錄,opendir配合readdir使用
{
DIR *dir;
struct dirent *ptr;//readdir
if ((dir=opendir(basePath)) == NULL)
{
printf("Open path error\n");
exit(1);
}
return dir;
}
bool readfile(char* Path,SSL *ssl,struct dirent *ptr)//文件或者目錄處理
{
DIR *dir = readFileList(Path);
while ((ptr=readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
continue;
else if(ptr->d_type == 8) //document
{
printf("path is:%s\n",Path);
Document(Path, ssl, ptr);
}
else if(ptr->d_type == 4)//directory
{
Directory(Path, ssl, ptr);
}
}
return true;
}
bool Sendlog(SSL* ssl, char* buf)//發送log文件
{
if(strcmp(buf, "getlog") == 0)
{
struct dirent *ptr;
char *basePath = NULL;
basePath = "./log/";
readfile(basePath, ssl, ptr);
}
Shutdown(ssl);
}
void ShowCerts(SSL * ssl)//驗證顯示證書
{
X509 *cert;
char *line;
cert = SSL_get_peer_certificate(ssl);
// SSL_get_verify_result()是重點,SSL_CTX_set_verify()只是配置啟不啟用并沒有執行認證,調用該函數才會真證進行證書認證
// 如果驗證不通過,那么程序拋出異常中止連接
if(SSL_get_verify_result(ssl) == X509_V_OK){
printf("證書驗證通過\n");
}
if (cert != NULL) {
printf("數字證書信息:\n");
line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
printf("證書: %s\n", line);
free(line);
line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
printf("頒發者: %s\n", line);
free(line);
X509_free(cert);
}
else
printf("無證書信息!\n");
}
總結
以上是生活随笔為你收集整理的linux 文件 加密传输,服务端和客户端之文件加密传输的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日本新一代 H3 火箭将于明日上午再次发
- 下一篇: 荒野大镖客2如何赚钱(荒野是指什么)