实验二 初始化阶段-source.c
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相关推荐
- 计算机网络 | 实验二 WINPCWP编程
实验二 WINPCWP编程 班级 xxx 实验环境 Win10 Pro 1709(64位) 姓名 xxx 开发环境 Visual Studio 2013 学号 xxx 软件版本 WinPcap 4.1 ...
- 计算机图形学 实验二 三维模型读取与控制【OpenGL】
文章目录 实验2.1 OpenGL的控制与交互方式 一. 实验目的 二. 理论背景 三. 实验内容 1. 创建基本工程项目 2. 在子窗口中绘制图形 3. 在子窗口中通过键盘事件更换椭圆形状颜色 4. ...
- 操作系统实验二实验报告
实验二:物理内存管理 练习0:填写已有实验 将lab1中已完成的代码更新到lab2中,在这里分别尝试了diff+patch和meld两种方法 在lab2目录下,trap.c的更新如下(注意可能需要手动 ...
- 实验二:用python实现SVM支持向量机并对鸢尾花数据集分类
实验二:SVM支持向量机 1. 实验内容: (1)用你熟知的语言(尽量使用python)实现支持向量机的算法,并在给定的数据集上训练. (2)在测试集上用训练好的支持向量机进行测试,并将预测结果以cs ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十七:TFT模块 - 显示
实验二十七:TFT模块 - 显示 所谓TFT(Thin Film Transistor)就是众多LCD当中,其中一种支持颜色的LCD,相较古老的点阵LCD(12864笑),它可谓高级了.黑金的TFT ...
- 0421实验二 作业调度模拟程序
实验二作业调度模拟程序 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调 ...
- Linux内核初始化阶段内存管理的几种阶段
本系列旨在讲述从引导到完全建立内存管理体系过程中,内核对内存管理所经历的几种状态.阅读本系列前,建议先阅读memblock的相关文章. 一些讲在前面的话 在很久很久以前,linux内核还是支持直接从磁 ...
- 实验二 建立基本的游戏场景
实验二 建立基本的游戏场景 一.实验内容: 1. 建立一个简单的游戏场景: 2. 通过摄像机实现场景的切换: 3. 使用不同的光照实现阴影效果: 二.实验目的: 1. 了解Ogre程序的工作方法和Og ...
- 【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )
文章目录 一.类加载初始化时机 二.常量加载示例 三.数组加载示例 一.类加载初始化时机 类加载时机 : Java 程序执行时 , 并不是一开始将所有的字节码文件都加载到内存中 , 而是用到时才进行加 ...
最新文章
- Java Enumeration接口
- 算法时间复杂度分析基础
- python创建实例时显示没有参数-OSError无法创建文件无效参数
- Springboot整合redis(lettuce)
- nslang oracle_解决ojdbc14连接oracle报“java.sql.SQLException: Io 异常: Size Data Unit (SDU) mismatch”异常问题...
- 我与Python网络爬虫的第一次接触
- java.util.set cannot be assigned from null_Java中有关Null的9件事
- 基于uniapp开发的适用于微信小程序,头条小程序
- python QTreeWidgetItem下面有几个子tree_非常干货:Python 探针实现原理
- CDC::GetDeviceCaps()物理长度与屏幕像素间的转换
- Python 爬取 620 首虾米歌曲,揭秘五月天为什么狂吸粉?!
- 6个最佳的开源Python应用服务器
- C#做小工具的时候碰到的问题
- css3波浪js特效代码
- 利用selenium模拟登录webqq
- 浅谈基于过程与基于对象
- 华为鸿蒙系统平板电脑,华为5G鸿蒙系统平板电脑正式入网,搭载八核处理器麒麟9000芯片...
- Attempted read from closed stream.
- Java架构师 每日微笔记 0001
- axure树形表格_表格 树形菜单/excel 如何实现分级显示,也就是树形的菜单