2019独角兽企业重金招聘Python工程师标准>>>

//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;
 }

转载于:https://my.oschina.net/u/3548719/blog/1611196

实验二 初始化阶段-source.c相关推荐

  1. 计算机网络 | 实验二 WINPCWP编程

    实验二 WINPCWP编程 班级 xxx 实验环境 Win10 Pro 1709(64位) 姓名 xxx 开发环境 Visual Studio 2013 学号 xxx 软件版本 WinPcap 4.1 ...

  2. 计算机图形学 实验二 三维模型读取与控制【OpenGL】

    文章目录 实验2.1 OpenGL的控制与交互方式 一. 实验目的 二. 理论背景 三. 实验内容 1. 创建基本工程项目 2. 在子窗口中绘制图形 3. 在子窗口中通过键盘事件更换椭圆形状颜色 4. ...

  3. 操作系统实验二实验报告

    实验二:物理内存管理 练习0:填写已有实验 将lab1中已完成的代码更新到lab2中,在这里分别尝试了diff+patch和meld两种方法 在lab2目录下,trap.c的更新如下(注意可能需要手动 ...

  4. 实验二:用python实现SVM支持向量机并对鸢尾花数据集分类

    实验二:SVM支持向量机 1. 实验内容: (1)用你熟知的语言(尽量使用python)实现支持向量机的算法,并在给定的数据集上训练. (2)在测试集上用训练好的支持向量机进行测试,并将预测结果以cs ...

  5. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十七:TFT模块 - 显示

    实验二十七:TFT模块 - 显示 所谓TFT(Thin Film Transistor)就是众多LCD当中,其中一种支持颜色的LCD,相较古老的点阵LCD(12864笑),它可谓高级了.黑金的TFT ...

  6. 0421实验二 作业调度模拟程序

    实验二作业调度模拟程序 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调 ...

  7. Linux内核初始化阶段内存管理的几种阶段

    本系列旨在讲述从引导到完全建立内存管理体系过程中,内核对内存管理所经历的几种状态.阅读本系列前,建议先阅读memblock的相关文章. 一些讲在前面的话 在很久很久以前,linux内核还是支持直接从磁 ...

  8. 实验二 建立基本的游戏场景

    实验二 建立基本的游戏场景 一.实验内容: 1. 建立一个简单的游戏场景: 2. 通过摄像机实现场景的切换: 3. 使用不同的光照实现阴影效果: 二.实验目的: 1. 了解Ogre程序的工作方法和Og ...

  9. 【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )

    文章目录 一.类加载初始化时机 二.常量加载示例 三.数组加载示例 一.类加载初始化时机 类加载时机 : Java 程序执行时 , 并不是一开始将所有的字节码文件都加载到内存中 , 而是用到时才进行加 ...

最新文章

  1. Java Enumeration接口
  2. 算法时间复杂度分析基础
  3. python创建实例时显示没有参数-OSError无法创建文件无效参数
  4. Springboot整合redis(lettuce)
  5. nslang oracle_解决ojdbc14连接oracle报“java.sql.SQLException: Io 异常: Size Data Unit (SDU) mismatch”异常问题...
  6. 我与Python网络爬虫的第一次接触
  7. java.util.set cannot be assigned from null_Java中有关Null的9件事
  8. 基于uniapp开发的适用于微信小程序,头条小程序
  9. python QTreeWidgetItem下面有几个子tree_非常干货:Python 探针实现原理
  10. CDC::GetDeviceCaps()物理长度与屏幕像素间的转换
  11. Python 爬取 620 首虾米歌曲,揭秘五月天为什么狂吸粉?!
  12. 6个最佳的开源Python应用服务器
  13. C#做小工具的时候碰到的问题
  14. css3波浪js特效代码
  15. 利用selenium模拟登录webqq
  16. 浅谈基于过程与基于对象
  17. 华为鸿蒙系统平板电脑,华为5G鸿蒙系统平板电脑正式入网,搭载八核处理器麒麟9000芯片...
  18. Attempted read from closed stream.
  19. Java架构师 每日微笔记 0001
  20. axure树形表格_表格 树形菜单/excel 如何实现分级显示,也就是树形的菜单

热门文章

  1. input组件未在Form内,清空输入数据
  2. antdesign 表单中的单选按钮处理
  3. ROS: Ubuntu16.04安装ROS-kinetic
  4. 一起学React--组件定义和组件通讯
  5. phpMyAdmin - Error
  6. 在ump系统的那半个多月-jqGrid
  7. webpack 转换 ES6高级语法 bable插件 module rules
  8. 洛谷P3381 【模板】最小费用最大流
  9. 多线程编程注意点(持续更新)
  10. Redis的主从搭建