黎星-可信计算.docx
- 文档编号:583412
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:32
- 大小:857.20KB
黎星-可信计算.docx
《黎星-可信计算.docx》由会员分享,可在线阅读,更多相关《黎星-可信计算.docx(32页珍藏版)》请在冰点文库上搜索。
课程实验报告
课程名称:
可信计算上机实验
专业班级:
信息安全2班
学号:
U
姓名:
黎星
指导教师:
邹德清
报告日期:
2015年5月7日
计算机科学与技术学院
目录
1实验目的 1
2实验内容 1
3实验步骤及截图 1
3.1清除TPM的TakeOwnership 1
3.2编译实验源代码 1
3.3初始化 2
3.4KeyHierarchy 2
3.5Seal、Unseal、extend 3
3.6KeyMigration 7
3.7RemoteAttestation 7
4实验各个步骤的理解 8
4.1Seal、Unseal、extend操作 8
4.2密钥迁移 10
4.3远程证明 11
5实验心得体会 11
6实验源代码 12
6.1creat_register_key.c创建K4的代码 12
6.2load_key.c中K4的代码 12
6.3unseal_file.c 13
1实验目的
l加深对TPM核心功能的理解。
l通过在实践中运行各种命令,实际的体会TPM所带来的安全保障能力。
l理解TPM中的远程证明、密钥迁移、密钥结构、数据密封等功能的原理,并能学会在实际中运用这些功能。
l学会利用TSS提供的各种接口,编写自己的应用程序。
2实验内容
l因为我用的是实验室里面的电脑,用的是物理的TPM实验平台,所以不用安装TPMemulator,直接编译源代码。
l按照trusted-computing-project目录下的README,进行后面的实验。
3实验步骤及截图
3.1清除TPM的TakeOwnership
这个步骤可以参考老师在实验室的黑板上给出的清除TPM的TakeOwnership的操作,首先在进入LINUX系统之前按住F10进入BIOS,修改里面的SYSTEMSECURITY。
注意,要两次进入BIOS系统。
改完之后就可以进入LINUX系统开始试验了。
3.2编译实验源代码
l将下载好的实验源代码放在桌面上,然后解压实验源代码,运行命令:
tarxvzftrusted-computing-projectv0.3
l进入解压后得到的trusted-computed-projectv0.3目录,编译源码,运行命令:
makeclean
make
3.3初始化
l运行如下命令:
sudomodprobetpm_tis
sudotcsd
l进入当前目录下的init目录,运行如下命令:
./Tspi_TPM_TakeOwnership01-v1.2
l运行命令:
./create_mig_key-v1.2
此时会要求输入PIN,我们为了方便起见,此后的所有PIN我们都输入。
此时得到的结果如下图33.1:
图3.3.1
3.4KeyHierarchy
l进入Keyhierarchy目录,运行命令:
./create_register_key–v1.2
此时会要求你输入4次PIN,结果如图3.4.1:
图3.4.1
l运行命令:
./load_key–v1.2,结果如图3.4.2:
图3.4.2
3.5Seal、Unseal、extend
l进入SealUnseal目录,运行命令:
./seal–v1.2
结果成功,如图3.5.1:
图3.5.1
l运行命令:
./unseal–v1.2
结果成功,如图3.5.2:
图3.5.2
l运行命令:
./extend–v1.2
结果成功,如图3.5.3:
图3.5.3
l运行命令./seal_filetest.ctest.en
会要求输入之前的PIN,结果如下:
用cat查看得到的test.en是一堆乱码,如图3.5.4:
图3.5.4
l运行命令:
./unseal_filetest.entest.de
在这里要提前编写好unseal_file.c,放在SealUnseal目录下,然后重新回到trusted-computed-project目录下运行make对其进行编译,编译正确则会得到可执行程序unseal_file。
unseal_file.c的代码由于比较长,就附录在后后面。
运行结果如图3.5.5:
用cat查看得到的test.de如下:
图3.5.5
l运行命令:
扩展./extend–v1.2
解封./unseal_filetest.entest.de
结果失败,如图3.5.6:
图3.5.6
3.6KeyMigration
l进入KeyMigration目录,运行命令:
./platform_dst–g
会生成srk.pub的文件。
l这里我和另外一个同学一起做的,他的机器为机器1,我的为机器2,故把在他的电脑上生成的srk.pub文件拷到我的机器上。
l进入机器2中的KeyMigration目录,运行命令:
./platform_src
会生成mig.blob的文件。
l将刚刚生成的mig.blob文件拷到机器1上,再运行命令:
./platform_dst–m
结果如图3.6.1:
图3.6.1
3.7RemoteAttestation
l由于我是机器2,所以只写出我的机器上显示的结果,进入机器2的RemoteAttestation目录,运行命令:
./RAClient192.168.30.43192.168.30.44(机器2的ip为:
192.168.30.43机器1的ip为:
192.168.30.44)
结果如图3.7.1:
图3.7.1
4实验各个步骤的理解
4.1Seal、Unseal、extend操作
Seal和Unseal也就是数据密封和解密封操作。
课本上讲过数据密封就是对数据进行加密,并且这种加密是与平台的状态绑定在一起的。
查看seal.c可知操作过程如下:
(1)调用Tspi_Context_CreateObject分别创建一个加密数据句柄hEncData和Pcr句柄hPcrs。
(2)调用Tspi_TPM_GetCapability获取TPM版本信息,当capArea=TSS_TPMCAP_PROPERTY而rgbSubCap=TSS_TPMCAP_PROP_PCR时,prgbRespData,也就是此函数最后一个参数,返回的就是TPM支持的最大PCR寄存器个数,参考《TCGSoftwareStack(TSS)SpecificationVersion1.2,ErrataA》
(3)调用Tspi_TPM_PcrRead读出TPM中各个pcr的值并写到上面得到的hPcrs句柄中。
(4)调用Tspi_Data_Seal加密数据,用的密钥是SRK,加密后的数据在hEncData指向的位置。
(5)调用Tspi_GetAttribData导出DataBlob,并将其写入文件“sealedData”。
(6)释放内存关闭上下文
unseal解封的操作如下:
(1)调用connect_load_all加载上下文、SRK、TPM;
(2)调用Tspi_Context_CreateObject创建加密数据句柄hEncData;
(3)调用set_secret设置口令
(4)读取文件中的DataBlob到缓冲区dataBuf
(5)调用Tspi_SetAttribData导出hEncData
(6)调用Tspi_Data_Unseal解封
(7)释放内存关闭上下文
seal_file操作如下:
(1)创建并连接上下文
(2)Tspi_Context_GetTpmObject获取TPM句柄hTPM
(3)Tspi_Context_LoadKeyByUUID加载SRK
(4)Tspi_Context_CreateObject创建PCR句柄hPcrs和加密数据句柄hEncData
(5)set_secret设置口令
(6)Tspi_Context_LoadKeyByUUID加载K1
(7)set_popup_secret验证K1的pin
(8)Tspi_TPM_GetRandom获取随机数random
(9)Tspi_TPM_PcrRead读取Pcr值
(10)Tspi_PcrComposite_SetPcrValue设置Pcr值
(11)Tspi_Data_Seal用随机数random和K1加密hEncData
(12)Tspi_GetAttribData导出DataBlob
(13)读明文到缓冲区
(14)用random初始化AES,获得CTX对象,用它加密明文
(15)将DataBlob属性的长度,DataBlob属性内容,密文长度,密文依次写入密文文件
(16)释放内存关闭上下文
unseal_file需要进行如下操作:
前7步和seal_file操作一样
(8)Tspi_TPM_PcrRead读取Pcr值
(9)读密文到缓冲区
(10)依次取出DataBlob属性长度、DataBlob属性内容,密文长度,密文内容
(11)Tspi_SetAttribData导出DataBlob
(12)Tspi_Data_Unseal从DataBlob解密出初始化AES用的random
(13)用random初始化AES,EVP_DecryptInit_ex获得解密用的CTX对象,
(14)解密并把明文写进文件
(15)释放内存关闭上下文
所以我们先执行./seal-v1.2,然后再执行./unseal-v1.2,由于此时平台状态没有改变,所以两步都是成功的。
第一轮中,seal和unseal间没有对PCR的extend操作,所以加解密都成功,
进行了extend后,PCR的值被修改,和预期一样,解密失败
第二轮中,使用的是AES加密文件,然后用K1加密AES的密钥,过程和第一轮基本一样,都是extend操作后解密失败。
4.2密钥迁移
Platform1(destination)
生成的srk.pub文件里其实只写入了SRK的公钥长度和公钥的内容。
Platform2(source)
生成迁移的票据和DataBlob,
票据使用Tspi_TPM_AuthorizeMigrationTicket根据srk的公钥生成,
抗重放的随机字符串和DataBlob则用Tspi_Key_CreateMigrationBlob以票据和要迁移的私钥为参数生成。
Platform1(destination)
Tspi_Key_ConvertMigrationBlob把MigBlob转换成KeyBlob,
再由Tspi_Key_LoadKey加载迁移密钥的私钥。
回到机器1中运行./platform_dst–m,TPM会自动利用srk的私钥对其进行一个解密。
这样就把一个密钥由机器2迁移到了机器1中。
4.3远程证明
这一步是进行远程证明。
由于不能使用EK来证明自己的身份,所以我们需要运行./Create_AIK,得到一个AIK作为EK的代表来证明我们自己的身份。
接着运行./RAServer等待对方连接。
机器2通过运行./RAClient机器2的ip机器1的ip连接到机器1上,当然在这之前还要进行一些列的认证工作,是通过挑战应答协议来完成的。
认证通过之后两台机器就进行了连接。
5实验心得体会
TPM是计算机硬件安全的一个最典型的例子,我们之前所学的知识大多是关于软件安全,以及如何通过软件安全的方法来对整个计算机系统形成安全的环境。
但可信计算使我们了解到硬件安全的特性是有些软件安全方法永远无法比拟的。
PM芯片提供了很多服务,最为核心的功能包括安全度量报告,远程证明,数据保护,TPM密钥管理。
刚开始学习可信计算的时候,由于缺乏实际经验,所以刚开始接触这些理论知识感觉比较难以理解。
而恰好这次实验就给我们提供了一个难得的动手实践的机会。
通过实际的去看那些代码,然后运行那些程序,继而到自己动手编写一个unseal_file的代码。
整个过程下来,自己对于可信计算的整体结构的把握有了一个更加直观和深入的了解。
通过实际的生成一个可迁移密钥,我感受到了TSS提供的功能强大的调用接口。
接着后面的密钥迁移让我更加认识到了存储根密钥的重要意义,它是整个密钥层次的树根。
我们如果想要进行密钥迁移那么也必须借助SRK。
之前在课堂上面刚开始接触到TPM所规定的各种各样的密钥的时候,我感觉到比较难理清各个密钥之间的关系。
通过实际的运行这些可执行程序,实际的体会了密钥层次,实际的进行了一次成功的密钥迁移。
这让我突然对各个密钥之间的关系清晰了很多,它们之间组成的关系可以用一个树状的结构来表示,而其中处于最顶端的树根就是SRK了,这也就是为什么存储根密钥会如此重要的原因。
总的来说这次的实验让我们很好的能够在实践中去加深对理论的理解,因为学习就是一个知行结合的过程。
同时,通过阅读利用TSS提供的函数接口编写的函数进而自己编写一个简单的函数也加强了我们自学编程的能力。
这次的可信计算实验让我收获颇多,希望以后能有更多这样的机会让我们进行实践!
6实验源代码
6.1creat_register_key.c创建K4的代码
initFlags=TSS_KEY_TYPE_BIND|TSS_KEY_SIZE_2048|
TSS_KEY_VOLATILE|TSS_KEY_AUTHORIZATION|
TSS_KEY_MIGRATABLE;
result=my_create_load_key(hContext,initFlags,hKey3,&hKey4,"K4");
if(result!
=TSS_SUCCESS){
print_error("create_key",result);
Tspi_Context_FreeMemory(hContext,NULL);
Tspi_Context_Close(hContext);
exit(result);
}
result=Tspi_Context_RegisterKey(hContext,hKey4,
TSS_PS_TYPE_SYSTEM,
UUID_K4,
TSS_PS_TYPE_SYSTEM,
UUID_K3);
if(result!
=TSS_SUCCESS){
print_error("Tspi_Context_RegisterKey",result);
Tspi_Context_FreeMemory(hContext,NULL);
Tspi_Context_Close(hContext);
exit(result);
}
6.2load_key.c中K4的代码
result=Tspi_Context_GetKeyByUUID(hContext,TSS_PS_TYPE_SYSTEM,
UUID_K4,
&hKey4);
if(result!
=TSS_SUCCESS){
print_error("Tspi_Context_LoadKeyByUUID",result);
print_error_exit(nameOfFunction,err_string(result));
Tspi_Context_FreeMemory(hContext,NULL);
Tspi_Context_Close(hContext);
exit(result);
}
//验证使用测略
result=set_popup_secret(hContext,hKey3,TSS_POLICY_USAGE,"InputK3'spin",0);
if(TSS_SUCCESS!
=result){
print_error("set_popup_secret",result);
Tspi_Context_Close(hContext);
returnresult;
}
result=Tspi_Key_LoadKey(hKey4,hKey3);
if(result!
=TSS_SUCCESS){
print_error("Tspi_Key_LoadKey",result);
Tspi_Context_FreeMemory(hContext,NULL);
Tspi_Context_Close(hContext);
exit(result);
}
6.3unseal_file.c
/**
*@fileunseal_file.c
*@authorWangFengweiEmail:
110.visual@
*@briefunsealafile
*@created2011-06-20
*@modified
*/
#include"common.h"
#include
#include
#include
#include
#include
/**
*Createan256bitkeyandIVusingthesuppliedkey_data.saltcanbeaddedfortaste.
*Fillsintheencryptionanddecryptionctxobjectsandreturns0onsuccess
**/
intaes_init(unsignedchar*key_data,intkey_data_len,unsignedchar*salt,EVP_CIPHER_CTX*d_ctx)
{
inti,nrounds=5;
unsignedcharkey[32],iv[32];
/*
*Genkey&IVforAES256CBCmode.ASHA1digestisusedtohashthesuppliedkeymaterial.
*nroundsisthenumberoftimesthewehashthematerial.Moreroundsaremoresecurebut
*slower.
*/
i=EVP_BytesToKey(EVP_aes_256_cbc(),EVP_sha1(),salt,key_data,key_data_len,nrounds,key,iv);
if(i!
=32){
printf("Keysizeis%dbits-shouldbe256bits\n",i);
return-1;
}
EVP_CIPHER_CTX_init(d_ctx);
EVP_DecryptInit_ex(d_ctx,EVP_aes_256_cbc(),NULL,key,iv);
return0;
}
/*
*Decrypt*lenbytesofciphertext
*/
unsignedchar*aes_decrypt(EVP_CIPHER_CTX*e,unsignedchar*ciphertext,int*len)
{
/*plaintextwillalwaysbeequaltoorlesserthanlengthofciphertext*/
intp_len=*len,f_len=0;
unsignedchar*plaintext=malloc(p_len);
EVP_DecryptInit_ex(e,NULL,NULL,NULL,NULL);
EVP_DecryptUpdate(e,plaintext,&p_len,ciphertext,*len);
EVP_DecryptFinal_ex(e,plaintext+p_len,&f_len);
*len=p_len+f_len;
returnplaintext;
}
void
usage(char*pch_name)
{
printf("Usage:
%ssourcedestination\n",pch_name);
printf("eg:
%splaintext_filecipertext_file\n",pch_name);
}
int
main(intargc,char**argv)
{
#defineBUF_LEN (1024*1024)
TSS_RESULTresult;
TSS_HCONTEXThContext;
TSS_HKEYhSRK,hKey;
TSS_HPOLICYhPolicy;
TSS_HTPMhTPM;
TSS_HENCDATAhEncData;
UINT32u32EncDataLen,u32UnsealedDataLen;
BYTE*pEncData,*rgbUnsealedData;
FILE*fpIn=NULL,*fpOut=NULL;
intlen,size;
char*pBufIn=NULL,*pBufOut=NULL;
unsignedintsalt[]={12345,54321};
EVP_CIPHER_CTXde;
TSS_UUIDUUID_K1={0,0,0,0,0,{8,0,0,0,0,1}};
if(argc<3){
usage(argv[0]);
return0;
}
result=connect_load_all(&hContext,&hSRK,&hTPM);
if(TSS_SU
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 黎星 可信 计算