文档章节

使用OPENSSL模拟创建TPM2.0密钥层次结构

 宋小八
发布于 2017/11/21 16:15
字数 609
阅读 41
收藏 0

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>
#include<openssl/pem.h>
#include<openssl/err.h>
#define PUBPARENT "parent_pub.key"
#define PRIPARENT "parent.key"
#define PRIMIG "mig.key"
#define PUBMIG "mig_pub.key"

#define BUFFSIZE 1024
int  my_createKey(int bits,char *prikey_path,char *pubkey_path)
{
    //生成密钥对
    RSA *r = RSA_new();
    BIGNUM *e = BN_new();
    BN_set_word(e, 65537);
    RSA_generate_key_ex(r, bits, e, NULL);

    //RSA_print_fp(stdout, r, 0);

    BIO *pri,*pub;
    pri= BIO_new_file(prikey_path,"w");
    //这里生成的私钥没有加密,可选加密
    int ret = PEM_write_bio_RSAPrivateKey(pri, r, NULL, NULL, 0, NULL, NULL);
    //printf("writepri:%d\n",ret);
    BIO_flush(pri);
    BIO_free(pri);

    pub = BIO_new_file(pubkey_path,"w");
    ret = PEM_write_bio_RSAPublicKey(pub, r);
    //printf("writepub:%d\n",ret);
    BIO_flush(pub);
    BIO_free(pub);

    BN_free(e);
    RSA_free(r);
    return 1;
}


 char* my_encrypt(char *str,char *path_key);//加密
 char* my_decrypt(char *str,char *path_key);//解密
 int main(void){
     //char *source="i like dancing !";
     char source[202];

    char *ptr_en,*ptr_de;
     FILE *migkeyfp;
     printf("-------------source TPM: create hierarchy start----------------\n");
     if( my_createKey(4096,PRIPARENT,PUBPARENT)==1)
        printf("source TPM:create parentkey success\n");//产生父密钥
     if(my_createKey(128,PRIMIG,PUBMIG)==1)
        printf("source TPM:create migratekey success\n");//产生迁移密钥
     migkeyfp=fopen(PRIMIG,"r");
     if(migkeyfp==NULL){
        printf("open file %s failed\n",PRIMIG);
        return 0;
     }
     //把文件的位置指针移到文件尾
      fseek(migkeyfp,0L,SEEK_END);
     //获取文件长度
     long  length=ftell(migkeyfp);
     //printf("该文件的长度为%ld字节\n",length);
     //把文件的位置指针移到文件头
     fseek(migkeyfp,0L,SEEK_SET);
     fread(source,1,length,migkeyfp);
     printf("source TPM: use parentkey protected migratekey start....\n");
     //printf("source TPM: migratekey private patr is the follow:\n");
     //printf("%s\n",source);
     ptr_en=my_encrypt(source,PUBPARENT);
     printf("source TPM: use parentkey protected migratekey finished....\n");
     //printf("source TPM: after encrypt migratekey's information is follow\n");
     printf("%s\n",ptr_en);
     printf("-------------source TPM: create hierarchy finished----------------\n");
     printf("source TPM: hierarchy structer is follow\n");
     printf("                  O    parentkey\n");
     printf("                  |\n");
     printf("                  |\n");
     printf("                  O    migratekey\n");
     printf("source TPM: use parentkey decrypt  migratekey start....\n");
     ptr_de=my_decrypt(ptr_en,PRIPARENT);
     //printf("source TPM: after decrypt migratekey's information is follow\n");
     //printf("%s\n",ptr_de);
     printf("source TPM: use parentkey decrypt  migratekey finished....\n");
     if(ptr_en!=NULL){
         free(ptr_en);
     }
     if(ptr_de!=NULL){
         free(ptr_de);
     }
     fclose(migkeyfp);

     return 0;
 }
 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);
     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;
 }

实验结果如下:

 

   

© 著作权归作者所有

粉丝 2
博文 19
码字总数 37798
作品 0
成都
私信 提问
自建证书实践(OpenSSL)

常用排序之快速排序 问题描述 原材料 加工过程 --- 问题描述 证书要钱还贵,但金融系统报文必须要进行安全传输,怎么办,自己生成证书吧,这篇博客记录的背景是: 生成一对 RSA 钥匙,公钥采用...

范老司
2015/06/05
2.2K
3
行业看点 | 赵义博:量子密钥云是量子通信产业化最关键的助推剂

近日,针对九州量子朱斌团队开发出的量子密钥云,郭光灿院士弟子、中国科学技术大学博士赵义博点评称,这是量子密钥通信走向产业化最重要的催化剂和助推剂,甚至是必不可少的核心产品。 赵义...

雪花又一年
2018/05/04
0
0
Linux openssh openssl

Linux openssh openssl 笔记日期20180524 目录 openssh 配置ssh基于密钥的方式认证 服务器端配置文件 ssh服务的最佳实践 OpenSSL 三个组件 PKI: Public Key Infrastructure 建立私有CA 证书申...

Winthcloud
2018/06/29
0
0
Linux学习笔记(六)---Xshell通过公钥连接CentOS系统

前面我们通过ssh,使用服务器端用户名和密码远程连接CentOS系统。这种方式还不够安全,为了提高连接访问的安全性,建议使用密钥认证。 具体的操作及配置如下: 1.在Xshell中创建密钥对(公钥和...

liulangren0533
2018/07/06
0
0
openssl的应用及创建CA

openssl命令行工具: 众多的子命令实现各种安全加密功能; ]# openssl ? 显示的内容有 Standard commands(标准命令) enc, dgst, ca, req, genrsa, rand, rsa, x509, passwd, ... Message Di...

Vayne36
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java Web 中对 ServletRequest 的一些非常规操作解决方案

1. 前言 ServletRequest 是我们搞 Java Web 经常接触的 Servlet Api 。有些时候我们要经常对其进行一些操作。这里列举一些经常的难点操作。 2. 提取 body 中的数据 前后端交互我们会在 body...

码农小胖哥
28分钟前
2
0
《Dual Encoding U-Net for Retinal Vessel Segmentation》阅读笔记-MICCAI2019

作者:Bo Wang1,2, Shuang Qiu2, and Huiguang He1,2,3 目的:Retinal Vessel Segmentation is an essential step for the early diagnosis of eye-related diseases, such as diabetes and ......

JungleKing
31分钟前
2
0
一次看懂 Https 证书认证

TLS > 传输层安全性协定 TLS(Transport Layer Security),及其前身安全套接层 SSL(Secure Sockets Layer)是一种安全协议,目的是为网际网路通信,提供安全及数据完整性保障。 如图,TLS...

极客收藏夹
45分钟前
5
0
https证书买哪家好?有哪些供应商

在选购https证书前除了要了解类型外,还需要了解https证书供应商,毕竟不同的供应商,提供的产品质量与服务也是有差异的。今天小编就为大家讲讲https证书供应商方面的内容,希望各位会喜欢。...

安信证书
47分钟前
6
0
Zuul 配置

概述:zuul底层是基于servlet,是由一系列的filter链构成。 1、路由配置 a、单例serverId映射 zuul: routes: client-a: path: /client/** serviceId: client-a 意思是...

java框架开发者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部