文档章节

实验二 初始化阶段-source.c

 宋小八
发布于 2018/01/22 15:38
字数 1294
阅读 8
收藏 0

//file system
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//openssl
#include<openssl/evp.h>
#include<openssl/sha.h>
#include<openssl/rsa.h>
#include<openssl/aes.h>
#include<openssl/hmac.h>
#include<openssl/pem.h>
#include<openssl/err.h>
//socket
#include<netinet/in.h> // sockaddr_in
#include<sys/types.h>  // socket
#include<sys/socket.h> // socket
#include<stdio.h>    // printf
#include<stdlib.h>   // exit
#include<string.h>   // bzero
//time
#include<time.h>
#include <stdio.h>
#include <sys/time.h>
//file path
#define PUBEK "ek_pub.key"
#define PRIEK "ek.key"
#define PUBDA "DA_pub.key"
#define PRIDA "DA.key"
//socket parameter
#define SERVER_PORT 8000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024

char*  sign( )
{
    EVP_MD_CTX mdctx;
    EVP_PKEY *evpkey=NULL,*evpkey1=NULL;
    char *signValue;
    unsigned int signLen;
    char *text="NO20171228";
    int textLen=16;
    //char *signID=NULL;

    RSA *pri,*pub;
    FILE *file;
    
    if((file=fopen(PRIEK,"r"))==NULL){
        perror("source TPM: open key file error");
        return;
    }
//    printf("1\n");
    //if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL){
    if((pri=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL){
        ERR_print_errors_fp(stdout);
        return;
    }
  // printf("2\n");
   evpkey=EVP_PKEY_new();
   if(NULL==evpkey){
      printf("EVP_KEY_new failed!\n");
      return;
   }
   EVP_PKEY_assign_RSA(evpkey,pri);
   //printf("3\n");
    //以下是计算签名的代码     
    EVP_MD_CTX_init(&mdctx);        //初始化摘要上下文     
    if(!EVP_SignInit_ex(&mdctx,EVP_md5(),NULL)) //签名初始化,设置摘要算法     
    {    
        printf("initerr\n");        
        return;    
    }    
    //printf("4\n");
    if(!EVP_SignUpdate(&mdctx,text,textLen)) //计算签名(摘要)Update     
    {    
        printf("signupfate err\n");       
        return;    
    }
    //printf("5\n");    
    if(!EVP_SignFinal(&mdctx,signValue,&signLen,evpkey))  //签名输出     
    {    
        printf("signfinal err\n");       
        return;    
    }    
   // printf("6\n");
    //printf("消息%s的签名值是:\n",text);    
    //printf("---------------------------\n");
    //printf("%s",signValue);  
    //printf("\n");
 //   return signValue;    
 //   EVP_PKEY_free(evpkey);
    EVP_MD_CTX_cleanup(&mdctx);
 //   return;
   
    ERR_load_EVP_strings();
    EVP_MD_CTX mdctx1;   //摘要算法上下文变量     
    EVP_MD_CTX_init(&mdctx1);    //初始化摘要上下文     
 
    FILE *file1;
    int flen1;
    if((file1=fopen(PUBEK,"r"))==NULL){
        perror("source TPM: open key file error");
        return;
    }
    if((pub=PEM_read_RSA_PUBKEY(file1,NULL,NULL,NULL))==NULL){
    //if((pub=PEM_read_RSAPublicKey(file1,NULL,NULL,NULL))==NULL){
        ERR_print_errors_fp(stdout);
        return;
    }
     evpkey1=EVP_PKEY_new();
   if(NULL==evpkey1){
      printf("EVP_KEY_new failed!\n");
      return;
   }
   EVP_PKEY_assign_RSA(evpkey1,pub);

    if(!EVP_VerifyInit_ex(&mdctx1, EVP_md5(), NULL)) //验证初始化,设置摘要算法,一定要和签名一致     
    {
        printf("EVP_VerifyInit_ex err\n");
      
        return;
    }
    if(!EVP_VerifyUpdate(&mdctx1, text, textLen)) //验证签名(摘要)Update     
    {
        printf("err\n");
        
        return;
    }
    //printf("%s\n",text);
    if(EVP_VerifyFinal(&mdctx1,signValue,signLen,evpkey1)==0)
    {
       // printf("verify err\n");
        //printf("签名值是:\n");
//        printf("%s\n",signValue);
        //printf("end\n");
        EVP_MD_CTX_cleanup(&mdctx1);
        return;
    }
    else
    {
       // printf("验证签名正确.\n");
    }
    //释放内存     
    EVP_PKEY_free(evpkey1);
    EVP_MD_CTX_cleanup(&mdctx1);
    return signValue;

}
void aes_box_encrypt(unsigned char* source_string, unsigned char* des_string)  
{  
    int iLoop = 0;  
    int iLen =0;  
    AES_KEY aes;  
    unsigned char key[AES_BLOCK_SIZE];  
    unsigned char iv[AES_BLOCK_SIZE];  
    if(NULL == source_string || NULL == des_string)  
    {  
       printf("NULL\n");
       return;  
    }  
 
    //Generate own AES Key  
    for(iLoop = 0; iLoop < 16; iLoop++)  
    {  
        key[iLoop] = 32 + iLoop;  
    }  
 
    // Set encryption key  
    for (iLoop=0; iLoop<AES_BLOCK_SIZE; iLoop++)   
    {  
        iv[iLoop] = 0;  
    }  
 
    if (AES_set_encrypt_key(key, 128, &aes) < 0)   
    {  
        return ;  
    }  
 
    iLen = strlen(source_string) + 1;  
 
   AES_cbc_encrypt(source_string, des_string, iLen, &aes, iv, AES_ENCRYPT);  
 
}  
 
void aes_box_decrypt(unsigned char* source_string, unsigned char* des_string)  
{  
    int iLoop = 0;  
    int iLen =0;  
    AES_KEY aes;  
    unsigned char key[AES_BLOCK_SIZE];  
    unsigned char iv[AES_BLOCK_SIZE];  
    if(NULL == source_string || NULL == des_string)  
    {  
        printf("NULL\n");
        return;  
    }  
 
    //Generate own AES Key  
    for(iLoop = 0; iLoop < 16; iLoop++)  
    {  
        key[iLoop] = 32 + iLoop;  
    }  
 
    // Set encryption key  
    for (iLoop=0; iLoop<AES_BLOCK_SIZE; iLoop++)   
    {  
        iv[iLoop] = 0;  
    }  
 
    
    if(AES_set_decrypt_key(key, 128, &aes) < 0)   
    {  
        return ;  
    }  
 
    iLen = strlen(source_string)+1;  
 
   AES_cbc_encrypt(source_string, des_string, iLen, &aes, iv, AES_DECRYPT);  
}

 char *my_encrypt(char *str,char *path_key){
     char *p_en;
     RSA *p_rsa;
     FILE *file;
     int flen,rsa_len;
     if((file=fopen(path_key,"r"))==NULL){
         perror("source TPM: open key file error");
         return NULL;
     }
     if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL){
     //if((p_rsa=PEM_read_RSAPublicKey(file,NULL,NULL,NULL))==NULL){  // 换成这句死活通不过,无论是否将公钥分离源文件
         ERR_print_errors_fp(stdout);
         return NULL;
     }
     flen=strlen(str);
     rsa_len=RSA_size(p_rsa);
     p_en=(unsigned char *)malloc(rsa_len+1);
     memset(p_en,0,rsa_len+1);
     if(RSA_public_encrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_en,p_rsa,RSA_NO_PADDING)<0){
         return NULL;
     }
     RSA_free(p_rsa);
     fclose(file);
     //printf("p_en is %s\n",p_en);
     return p_en;
 }
 char *my_decrypt(char *str,char *path_key){
     char *p_de;
     RSA *p_rsa;
     FILE *file;
     int rsa_len;
     if((file=fopen(path_key,"r"))==NULL){
         perror("source TPM: open key file error");
         return NULL;
     }
     if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL){
         ERR_print_errors_fp(stdout);
         return NULL;
     }
     rsa_len=RSA_size(p_rsa);
     p_de=(unsigned char *)malloc(rsa_len+1);
     memset(p_de,0,rsa_len+1);
     if(RSA_private_decrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_de,p_rsa,RSA_NO_PADDING)<0){
         return NULL;
     }
     RSA_free(p_rsa);
     fclose(file);
     return p_de;
}

int my_server1(int cases,char *sysencseed,char *encryKeyout,char *dups,char *outerHMAC)
{
    // 声明并初始化一个服务器端的socket地址结构
  struct sockaddr_in server_addr;
  bzero(&server_addr, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = htons(INADDR_ANY);
  server_addr.sin_port = htons(SERVER_PORT);

  // 创建socket,若成功,返回socket描述符
  int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
  if(server_socket_fd < 0)
  {
    perror("Create Socket Failed:");
    exit(1);
  }
 int opt = 1;
  setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

  // 绑定socket和socket地址结构
  if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr))))
  {
    perror("Server Bind Failed:");
    exit(1);
  }

  // socket监听
  if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE)))
  {
    perror("Server Listen Failed:");
    exit(1);
  }
  printf("source TPM:waiting for client connect...........\n");
  // 定义客户端的socket
  struct sockaddr_in client_addr;
  socklen_t client_addr_length = sizeof(client_addr);
  // 接受连接请求,返回一个新的socket(描述符),这个新socket用于同连接的客户端>通信
  // accept函数会把连接到的客户端信息写到client_addr中
  int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);
  if(new_server_socket_fd < 0)
  {
    perror("Server Accept Failed:");
   // break;
   return -1;
  }
  else
  {
    printf("source TPM: client connect success!\n");
  }
  FILE *fp ;
  if(cases==0)
  {
    char buffer0[BUFFER_SIZE],dstStringTemp[17]={0};
    int RA=1,Ntpm=1;
    char *Nda0="2";
    //send seed
    printf("-------------source TPM:init stage start--------------\n");
    bzero(buffer0, BUFFER_SIZE);
    strncpy( buffer0, sysencseed,strlen(sysencseed)>BUFFER_SIZE?BUFFER_SIZE:strlen(sysencseed));
    printf("source TPM:send data to DA.....\n");
    send(new_server_socket_fd, sysencseed, BUFFER_SIZE, 0);
    send(new_server_socket_fd, dups, BUFFER_SIZE, 0);
    //recieve data
    printf("source TPM:recieve data from DA.....\n");
    recv(new_server_socket_fd, buffer0, BUFFER_SIZE, 0);
    printf("source TPM:using ks decrypt to get RA,Ntpm,Nda0...\n");
    aes_box_decrypt(buffer0,dstStringTemp);
    //printf("source TPM:after decrypt is :%s\n",dstStringTemp);
    printf("source TPM:Verify Ntpm.....\n");
    printf("source TPM:Verify success,send data to DA...\n");
    bzero(buffer0, BUFFER_SIZE);
    aes_box_encrypt(Nda0,buffer0);
    send(new_server_socket_fd, buffer0, BUFFER_SIZE, 0);

    printf("-------------source TPM:init stage end--------------\n");
  }
}
int main(void){
     int c,timeuse;
     char dstStringTemp[17]={0},dst[17]={0},dupSensitive1[17]={0},*sss,*encryptionKeyout;
     unsigned char*outerHMAC,encSensitive[17]={0};
     unsigned char *dupSensitive={0};
     unsigned char str[]="你好icd";
     unsigned char* encryptionKeyin="abcdefghijklmnop";
     FILE *migkeyfp;
     char *sysmetricSeed;
     struct timeval start, end;

     
     gettimeofday(&start,NULL);
     //printf("source TPM:init stage start.............\n");
     //初始化阶段
     char *signID=NULL,*encks=NULL,*decks=NULL;
     //1.用EK签名ID
     //signID=sign();
     char ks[]="123456";
     //2.用DA加密ks
     encks=my_encrypt(ks,PUBDA);
     //decks=my_decrypt(encks,PRIDA);
     unsigned char source_string[]="EK&NO1&01&", des_string[128]={0};
     //3.用ks加密EK,ID,signID,N
     aes_box_encrypt(source_string,des_string) ;
     //printf("ks加密:%s\n",des_string);
     //4.发送数据
     my_server1(0,encks,NULL,des_string,NULL);
     gettimeofday(&end,NULL);
     timeuse=1000000*(end.tv_sec-start.tv_sec)+end.tv_usec-start.tv_usec;
     printf("source TPM:init stage total run time :%d us\n",timeuse);
     return 0;
 }

© 著作权归作者所有

粉丝 2
博文 19
码字总数 37798
作品 0
成都
私信 提问
学物联网和嵌入式好不好?都有哪些课程?

学物联网和嵌入式好不好?都有哪些课程?物联网是嵌入式发展的一个方向但是个人觉得物联网的前景发展要稍微好一些,毕竟现在智能家居、智能生活这么受人追捧,而且也是今后生活的大方向建议题...

长沙千锋
2018/05/25
0
0
语音交互中的“等待体验”研究

雷锋网按:本文来自百度人工智能交互设计院,通过实验的方式,研究了语音交互中用户对于智能音箱的“等待体验”。雷锋网编辑在不改变原意的基础上做了精编。 回顾人机交互发展史,人类先后经...

叨叨
2017/12/19
0
0
语音交互中的「等待体验」研究

     回顾人机交互发展史,人类先后经历了基于命令行的CLI 时代,基于鼠标键盘的GUI时代,基于触摸的初级NUI时代。后面每一个阶段比前一个阶段更自然,学习成本更低,综合效率更高。   ...

深度学习
2017/12/19
0
0
基于mysql的可视化日志管理——loganalyzer

一:环境搭建目标 通过mysql与rsyslog的搭配和loganalyzer的显示,实现日志记录在数据库中的统一存储和可视化操作。 二:实验环境 A:mysql server 一台 192.168.216.66 B:rsyslog server ...

云云毓
2017/10/27
0
0
基于mysql的可视化日志管理——loganalyzer

一:环境搭建目标 通过mysql与rsyslog的搭配和loganalyzer的显示,实现日志记录在数据库中的统一存储和可视化操作。 二:实验环境 A:mysql server 一台 192.168.216.66 B:rsyslog server ...

云云毓
2018/06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

从0开始学FreeRTOS-(列表&列表项)-6

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
25分钟前
4
0
Java的23种设计模式,详细讲解(一)

一、概述 设计模式是解决问题的方案,学习现有的设计模式可以做到经验复用。 拥有设计模式词汇,在沟通时就能用更少的词汇来讨论,并且不需要了解底层细节。 二、创建型 1. 单例(Singleton...

李红欧巴
41分钟前
5
0
android 使用asynctask结合fragment更新UI(另附线程池管理示例)

https://blog.csdn.net/qq_16064871/article/details/70767949

shzwork
41分钟前
3
0
SpringCloud实现分库分表模式下,数据库实时扩容方案

本文源码:GitHub·点这里 || GitEE·点这里 一、项目结构 1、工程结构 2、模块命名 shard-common-entity: 公共代码块shard-open-inte: 开放接口管理shard-eureka-7001: ...

知了一笑
42分钟前
5
0
js--时间切割装换工具类

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> /* * 修改data原型对象Format方法 ......

zhengzhixiang
52分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部