您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > x.509证书解析程序
计算机实习报告(二)一.实习题目陈述:本次实习的题目是x.509证书解析程序,要求如下:(1)程序设计任选语言;(2)从IE任意导出一个x.509证书(DER格式,Base64格式,PKCS#格式均可);(3)编程实现该证书的解析,结果可以与asn1view工具对比;(4)得到公钥中的信息;(5)输入输出可以使用文本界面或者图形界面;(6)程序不能都放到一个源文件中(比如,c/c++语言至少有两个源文件,一个头文件)二.x.509证书介绍在编程前必须先了解x.509证书,x.509证书是网络通讯中标志通讯各方身份信息的一系列数据,提供了一种在internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常的身份证;作为网上交易双方真实身份证明的依据,是一个经证书授权中心(CA)数字签名的、包含证书申请者(公开密钥拥有者)个人信息及其公开密钥的文件。基于公开密钥体制(PKI)的数字证书是电子商务安全体系的核心,用途是利用公共密钥加密系统来保护与验证公众的密钥,由可信任的、公正的权威机构CA颁发。CA对申请者所提供的信息进行验证,然后通过向电子商务各参与方签发数字证书,来确认各方的身份,保证网上支付的安全性。X.509给出的鉴别框架是一种基于公开密钥体制的鉴别业务密钥管理。一个用户有两把密钥:一把是用户的专用密钥,另一把是其他用户都可利用的公共密钥。用户可用常规密钥(如DES)为信息加密,然后再用接收者的公共密钥对DES进行加密并将之附于信息之上,这样接收者可用对应的专用密钥打开DES密锁,并对信息解密。该鉴别框架允许用户将其公开密钥存放在它的目录款项中。一个用户如果想与另一个用户交换秘密信息,就可以直接从对方的目录款项中获得相应的公开密钥,用于各种安全服务。一个标准的X.509数字证书包含以下一些内容证书的版本信息;证书的序列号,每个证书都有一个唯一的证书序列号;证书所使用的签名算法;证书的发行机构名称,命名规则一般采用X.500格式;证书的有效期,现在通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;证书所有人的名称,命名规则一般采用X.500格式;证书所有人的公开密钥;证书发行者对证书的签名。三.实习题目分析:本题是一个文件类型的题,要用到文件指针,是一个读文件文件题目,在寻址时需要判断指针指向单元的内容,在此处要用到函数的递规,通过输入文件名可以得到证书的解析结果,输入是以字符的形式输入,解释结果以十六进制的形式输出;在编写程序的过程必须借助asn1view软件来寻找到指针变量的指向;只有编程前要掌握此软件的应用,才能往下编程,本题的重点在递规函数。初步列出解析结果如下:8d0030818902818100d88280e8d619027d1f85183925a2652be1bfd405d3bce6170d3939303832303030333030315a170d3134303132383037303030305a060355040a1310476c6f62616c5369676e206e762d7361060355040613024245060355040a1310476c6f62616c536967四.程序设计:编程过程中要用到的变量及说明如下:intk,m,n,i,j,sum,filelabel1,filelabel2;这些是整形变量,用他们来接受整型数据。其中,k用来接受文件的长度,m用来接受fp指向单元的数据,n用来接受实参k传来的值,sum用来控制递规结束,filelabel1,filelable2,通m变量;FILE*fp,*fp1;这些是文件指针变量,用它们来指向文件的具体位置;Charfilename[100];数组用来放置文件名;IntA[1000];该数组用来接受从文件中读来的数据;主程序流程图如下:开始定义变量k,文件指针fp,fp1输入文件名打开文件,fp1指向文件的头fp1赋给fp,通过fp读出文件大小赋给k调用函数find(),fp,k为实参关闭文件结束接受实参,形参为fp,n定义变量sum,filelabel1,filelabel2,I,j×fp==48×(fp+1)==130YY将fp+1后两字节读给m,记录sum的值,fp左移4位。×(fp+1)!=129N将×(fp+1)赋给m,记录sum的值,fp下移2位。Y将×(fp+2)给m,记录sum的值,fp下移3位N*fp==49fp下移2位Y×fp==160N将×(fp+1)赋给m,,指针下移2位,读写长度为m的文件内容Y×fp==3NN×(fp+1)==130Y将fp+1后两字节读给m,记录sum的值,fp左移4位。Y×(fp+1)==129N将×(fp+2)给m,记录sum的值,fp下移3位Y将×(fp+1)赋给m,记录sum的值,fp下移2位。N从文件中读出长度为m的内容sum《n调用find()函数结束YNN五.调试分析:在调试过程中最容易出错的地方就是在调用各库函数时对文件指针的判断及处理,例如:fp=fp1;fseek(fp,2,1);fread(&k,2,1,fp);k=((k&0xff)8)|((k&0xff00)8);find(fp1,k);如果在此没有fp=fp1;语句,那么调用函数时实参fp1将没有指向文件头,这样将导致被调函数运行结果出错;如:filelabel1=getw(fp);filelabel2=getw(fp);fseek(fp,-2,1);这里的filelabel1,filelabel2是变量用来接受fp指向单位的值,在以后程序中直接应用,如果不用这两个变量,而直接用getw(fp),则经多次调用后fp的位置就改变了。还有:fread(&m,2,1,fp);fseek(fp,-2,1);m=(((m&0xff)8)|((m&0xff00)8));sum=sum+m;如果没有这句:m=(((m&0xff)8)|((m&0xff00)8));这赋给m的值是不正确的,应为一次读两个字节到m时,高字节和低字节交换了故要先将m的高低字节交换后才是正确的m值。六.程序使用说明及源代码只需在程序开始时输入正确的文件名及后缀就可以成功调用此程序;源代码及注释如下:#includestdio.h#includeprocess.hvoidfind(FILE*,int);/*申明函数*/voidmain(){intk=0;FILE*fp1,*fp;charfilename[100];printf(pleaseinputthefilename:\n);gets(filename);if((fp1=fopen(filename,r))==NULL){printf(cannotopenthefile\n);exit(0);}/*打开文件*/fp=fp1;fseek(fp,2,1);fread(&k,2,1,fp);k=((k&0xff)8)|((k&0xff00)8);/*读出文件总长度*/find(fp1,k);/*调用函数*/fclose(fp1);/*关闭文件*/}/**************************************************************/voidfind(FILE*fp,intn){intm=0,sum=0,i,j,A[1000],filelabel1,filelabel2;filelabel1=getw(fp);filelabel2=getw(fp);/*将fp指向单元的内容赋给变量,方便调用*/fseek(fp,-2,1);while(filelabel1==48||filelabel1==49||filelabel1==3||filelabel1==160){if(filelabel2==130){fseek(fp,4,1);fseek(fp,2,1);fread(&m,2,1,fp);fseek(fp,-2,1);m=(((m&0xff)8)|((m&0xff00)8));sum=sum+m;}elseif(filelabel2!=130&&filelabel2!=129){fseek(fp,2,1);fseek(fp,1,1);fread(&m,1,1,fp);fseek(fp,-1,1);sum=sum+m;}elseif(filelabel2!=130&&filelabel2==129){fseek(fp,3,1);fseek(fp,1,1);fread(&m,1,1,fp);fseek(fp,-1,1);sum=sum+m;}if(filelabel1==49)fseek(fp,2,1);if(filelabel1==160)for(i=0;i2;i++){fseek(fp,2,1);fseek(fp,1,1);fread(&m,1,1,fp);fseek(fp,-1,1);sum=sum+m;fread(A,m,1,fp);for(j=0;jm;j++)printf(%x,A[j]);}if(filelabel1==3){if(filelabel2==130){fseek(fp,4,1);fseek(fp,2,1);fread(&m,2,1,fp);fseek(fp,-2,1);m=(((m&0xff)8)|((m&0xff00)8));sum=sum+m;}elseif(filelabel2==129){fseek(fp,3,1);fseek(fp,1,1);fread(&m,1,1,fp);fseek(fp,-1,1);sum=sum+m;}else{fseek(fp,2,1);fseek(fp,1,1);fread(&m,1,1,fp);fseek(fp,-1,1);sum=sum+m;}}}/*通过该循环找到可以输出内容的指针位置*/fread(A,m,1,fp);for(i=0;im;i++)printf(%x,A[i]);printf(“\n”);if(sumn)find(fp,n);/*调用函数*/}程序运行结果:pleaseinputthefilename:043220.cer020102c4bbd8c0caff56a511d356966199223006092a864886f70d010104050006035504031312526f6f742053474320417574686f72697479170d3939303832303030333030315a170d3134303132383037303030305a060355040613024245060355040a1310476c6f62616c5369676e206e762d7361060355040b1307526f6f7420434106035504031312476c6f62616c5369676e20526f6f7420434106092a864886f70d0101010500003082010a0282010100da0ee6998dcea3e34f8a7efbf18b83256bea481ff12ab0b9951104bdf063d1e26766cf1cddcf1b482bee8d898e9aaf298065abe9c72d12cbab1c4c7007a13d0a30cd158d4ff8ddd48c50151cef50eec42ef7fce952f2917de06dd535308e5e4373f241e9d56ae3b2893a5639386f063c88695b2a4dc5a754b86c89cc9bf93ccae5fd89f5123c927896d6dc746e934461d18dc746b2750e86e8198ad56d6cd5781695a2e9c80a38ebf224134f73549313853a1bbc1e34b58b058cb9778bb1db
本文标题:x.509证书解析程序
链接地址:https://www.777doc.com/doc-4263106 .html