PKI_實驗三_版本一_第1頁
PKI_實驗三_版本一_第2頁
PKI_實驗三_版本一_第3頁
PKI_實驗三_版本一_第4頁
PKI_實驗三_版本一_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、電子科技大學信息與軟件工程學院標 準 實 驗 報 告(實驗)課程名稱 PKI技術(shù)電子科技大學教務(wù)處制表報告評分: 指導教師簽字:電 子 科 技 大 學實 驗 報 告學生姓名:楊嵐青 學 號:2013220501019 指導教師: 聶旭云 實驗地點: 三教407 實驗時間: 2015.11.22一、實驗室名稱: 信息與軟件工程學院通用計算機軟件實驗室二、實驗項目名稱: OpenSSL證書操作三、實驗學時: 4四、實驗原理:X.509 V3版本的數(shù)字證書包括以下內(nèi)容:證書的版本、序列號、簽名算法、證書簽發(fā)者的信息、證書擁有者的信息、有效期(起始日期和終止日期)、用戶的公鑰、證書擴展信息(包括證書策

2、略、密鑰用途等)、簽發(fā)者簽名算法標識和簽名的結(jié)果等。證書一般都是用DER編碼。OpenSSL可實現(xiàn)DER證書的數(shù)據(jù)轉(zhuǎn)換,證書的驗證、證書內(nèi)容的獲取等。具體用到的函數(shù)如下:(1) 證書轉(zhuǎn)換函數(shù)函數(shù)功能:把一個DER編碼的證書數(shù)據(jù)轉(zhuǎn)化為OpenSSL內(nèi)部結(jié)構(gòu)題,返回值為編碼后的X509結(jié)構(gòu)體數(shù)據(jù)。函數(shù)定義:X509 * d2i_X509(X509 *cert, unsigned char *d, int len);參數(shù)說明:cert:X509結(jié)構(gòu)體。(2) 證書版本獲取函數(shù)函數(shù)功能:獲取證書的版本,返回值為證書版本號,長整型。函數(shù)定義:Long X509_get_version(cert);參數(shù)說

3、明:cert:X509結(jié)構(gòu)體。(3) 證書序列號獲取函數(shù)函數(shù)功能:獲取證書的序列號,返回值為證書的序列號,數(shù)據(jù)類型為“ASN1_INTEGER *”。函數(shù)定義:ASN1_INTEGER * X509_get_serialNumber(cert);參數(shù)說明:cert:X509結(jié)構(gòu)體。(4) 證書頒發(fā)者信息獲取函數(shù)函數(shù)功能:獲取證書頒發(fā)者的信息,返回值數(shù)據(jù)類型為“X509_NAME *”。函數(shù)定義:X509_NAME * X509_get_issuer_name(cert);參數(shù)說明:cert:X509結(jié)構(gòu)體。(5) 證書擁有者信息獲取函數(shù)函數(shù)功能:獲取證書使用者的信息,返回值數(shù)據(jù)類型為“X509

4、_NAME *”。函數(shù)定義:X509_NAME * X509_get_subject_name(cert);參數(shù)說明:cert:X509結(jié)構(gòu)體。(6) 獲取證書有效期函數(shù)函數(shù)功能:獲得證書的有效期的起始日期和終止日期,返回數(shù)據(jù)類型為“ANS1_TIME *”。函數(shù)定義:ANS1_TIME * X509_get_notbefore(cert);ANS1_TIME * X509_get_notafter(cert);參數(shù)說明:cert:X509結(jié)構(gòu)體。(7) 證書公鑰獲取函數(shù)函數(shù)功能:獲取證書上的公鑰,返回數(shù)據(jù)類型為“EVP_PKEY*”。函數(shù)定義:EVP_PKEY * X509_get_pubk

5、ey(cert);cert:X509結(jié)構(gòu)體。(8) 證書存儲區(qū)創(chuàng)建和釋放函數(shù)函數(shù)功能:創(chuàng)建和釋放一個X509_STORE結(jié)構(gòu)體,用于證書的驗證過程。函數(shù)定義:X509_STORE *X509_STORE_new(void);Void X509_STORE_free(X509_STORE *v);(9) 添加證書函數(shù)函數(shù)功能:向證書存儲區(qū)添加信任的根證書。函數(shù)定義:int X509_STORE_add_cert(X509_STORE *ctx, X509 *cert);參數(shù)說明:ctx:X509_STORE類型數(shù)據(jù),證書存儲區(qū)。cert:X509結(jié)構(gòu)體,受信任的根證書。(10) 添加證書撤銷列表

6、函數(shù)函數(shù)功能:向證書存儲區(qū)添加證書撤銷列表。函數(shù)定義:int X509_STORE_add_crl(X509_STORE *ctx, X509_CRT *x);參數(shù)說明:ctx:X509_STORE*類型數(shù)據(jù),證書存儲區(qū)。x:X509_CRT *類型數(shù)據(jù),證書撤銷列表。(11) 創(chuàng)建和釋放證書存儲區(qū)上下文函數(shù)函數(shù)功能:為證書存儲區(qū)上下文環(huán)境申請內(nèi)存和釋放內(nèi)存。函數(shù)定義:X509_STORE_CTX * X509_STORE_CTX_new(void);void X509_STORE_CTX_free(X509_STORE *ctx);(12) 初始化證書存儲區(qū)上下文函數(shù)函數(shù)功能:初始化證書存儲

7、區(qū)上下文,設(shè)置根證書、待驗證的證書、CA證書信任鏈。操作成功返回1,否則返回0。函數(shù)定義:Int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, STACK_OF(X509) *chain);參數(shù)說明:ctx :X509_STORE_CTX*類型數(shù)據(jù),上下文。store:X509_STORE*類型數(shù)據(jù),根證書存儲區(qū)。chain:STACK_OF(X509) *,證書鏈。(13) 驗證證書函數(shù)函數(shù)功能:檢查證書鏈,依次驗證上級CA對證書的簽名,一直到根證書。檢查證書是否過期,是否已撤銷以及其他證書策略

8、。函數(shù)定義:int X509_verify_cert(X509_STORE_CTX *ctx);參數(shù)說明:ctx :X509_STORE_CTX*類型數(shù)據(jù),上下文。 五、實驗?zāi)康模?利用OpenSSL實現(xiàn)對X.509數(shù)字證書的操作,包括證書的讀取、證書的驗證。六、實驗內(nèi)容: (1)證書信息讀取,通過程序指令顯示用戶證書的版本號、序列號、頒發(fā)者、擁有者、有效期限和用戶的公鑰(2)讀取受信任的根證書、CA證書鏈、證書撤銷列表和待驗證的用戶證書,并將其轉(zhuǎn)換為X509結(jié)構(gòu)體,最后驗證該證書的合法性七、實驗器材(設(shè)備、元器件): PC(Windows),VS2010,openssl配置環(huán)境 八、實驗步驟

9、:在證書的使用過程中,需要獲取證書的相關(guān)信息如序列號、頒發(fā)者的信息以及擁有者的信息,同時還需要驗證證書的有效期、合法性以及證書信任鏈等。本實驗分為兩部分:證書信息讀取和證書驗證。(一) 證書信息讀?。?) 定義一些必須的變量,用以存儲證書和證書的相關(guān)信息。參考代碼如下:unsigned char usrCertificate4096; /DER證書緩沖區(qū)unsigned long usrCertificateLen; /證書長度X509 *x509usrCert = NULL; /X509證書結(jié)構(gòu)體X509_NAME *issuer = NULL; /用于保存證書頒發(fā)者的信息X509_NAME

10、 *subject = NULL; /用于保存證書擁有者的信息X509_NAME_ENTRY *name_entry; /用于保存證書信息ASN1_INTEGER *Serial = NULL; /用于保存證書序列號ASN1_TIME *time; /用于保存證書有效期EVP_PKEY *pubKey; /用于保存證書公鑰long Version; /用于保存證書版本(2) 將用戶的DER編碼證書轉(zhuǎn)化為X509結(jié)構(gòu)體,并調(diào)用X509_get_*相關(guān)函數(shù)讀取證書的相關(guān)信息,參考代碼如下:/調(diào)用d2i_X509函數(shù),將用戶的DER編碼證書轉(zhuǎn)化為X509結(jié)構(gòu)體X509usrCert = d2i_X5

11、09(NULL,&pTmp,usrCertificatelen);/讀取證書版本Version = X509_get_version(X509usrCert);/讀取證書序列號Serial = X509_get_serialNumber(X509usrCert);/讀取證書頒發(fā)者信息,包括國家、組織、部門、通用名、電子郵件地址等issuer = X509_get_issuer_name(X509usrCert);/讀取證書擁有者信息,包括國家、組織、部門、通用名、電子郵件地址等subject = X509_get_subject_name(X509usrCert);/讀取證書的生效日期

12、和失效日期time = X509_get_notBefore(X509usrCert);time = X509_get_notBefore(X509usrCert);/讀取證書公鑰pubKey = X509_get_pubkey(X509usrCert); (3) 最后調(diào)用X509_free函數(shù)釋放X509結(jié)構(gòu)體內(nèi)存。證書信息讀取的流程圖如圖1所示圖1證書信息讀取流程圖 圖2 證書驗證流程圖(二) 證書驗證(1) 定義一些必須的變量,用以存儲CRL、根證書、待驗證用戶證書等。參考代碼如下:unsigned char derusrCert4096; /DER證書緩沖區(qū)unsigned long

13、derusrCertLen; /證書長度 unsigned char derCrl4096; /DER證書撤銷列表緩沖區(qū)unsigned long derCrlLen; /證書撤銷列表長度unsigned char derRootCert4096; /DER根證書緩沖區(qū) unsigned long derRootCertLen; /根證書長度X509_STORE_CTX *ctx = NULL; /證書存儲區(qū) X509 *X509usrCert = NULL; /X509用戶證書X509 *X509CACert = NULL; /X509CA證書X509 *X509RootCert = NUL

14、L; /X509根證書X509_CRL *X509Crl = NULL; /X509證書撤銷列表STACK_OF(X509) *caCertStack = NULL; /CA證書鏈 X509_STORE *rootCertStore = NULL; /證書存儲區(qū)(2) 讀取受信任的根證書、CA證書鏈、證書撤銷列表和待驗證的用戶證書,并將其轉(zhuǎn)換為X509結(jié)構(gòu)體。參考代碼如下:/根證書轉(zhuǎn)換pTmp = derRootCert;X509RootCert = d2i_X509(NULL,&pTmp,derRootCertLen);/用戶證書轉(zhuǎn)換pTmp = derusrCert;X509usr

15、Cert = d2i_X509(NULL,&pTmp,usrCertLen);/證書撤銷列表轉(zhuǎn)換pTmp = derCrl;X509Crl = d2i_X509(NULL,&pTmp, derCrlLen);(3) 添加受信任的根證書和證書撤銷列表到證書存儲區(qū)。參考代碼如下:/新建X509證書存儲區(qū)rootCertStore = X509_Store_new();/添加根證書X509_STORE_add_cert(rootCertStore, X509RootCert);/設(shè)置證書撤銷列表標志位X509_STORE_set_flags(rootCertStore,X509_V_

16、FLAG_CRL_CHECK);/添加證書撤銷列表X509_STORE_add_crl(rootCertStore,X509Crl);(4) 添加用戶證書和CA證書鏈。參考代碼如下:ctx = X509_STORE_CTX_new();X509_STORE_CTX_init(ctx,rootCertStore,X509usrCert, caCertStack);(5)驗證證書。X509_verify_cert(ctx);(6)釋放內(nèi)存。 九、實驗數(shù)據(jù)及結(jié)果分析:在實驗一和二的基礎(chǔ)上,對之前生成的證書進行讀取和驗證(注: 由于前兩個實驗結(jié)果疏于保存,所以這次試驗選取的證書其實是助教給的兩個“郭靖

17、” “黃飛鴻” 證書,之后的實驗內(nèi)容都是以此為基礎(chǔ))首先是openssl環(huán)境配置; 很麻煩,在Windows上面;比如新建一個項目,沒有添加路徑是運行不了的。幸好之前上學期做過openssl實驗,所以只要在配置路徑時加上引用的lib庫,include庫,以及配置鏈接器就可以正常引用openssl的相關(guān)函數(shù)。以下步驟依次完成證書的讀取和驗證過程,參照指導書,列出流程:證書信息讀取的流程圖如圖1所示實驗代碼:#include <openssl/evp.h>#include <openssl/x509.h>#include <cstdio>#include <

18、;cstdlib>#include <cstring>#include <windows.h>#define MAX_CERT_LEN 4096extern enum File_typeROOT_CA=1,USER_CA=2,CRL=4File_type;extern enum Imformation_typeCA_VERSION,CA_SERIAL_NUMBER,CA_NOT_BEFORE,CA_NOT_AFTER,CA_PUBLIC_KEY,CA_COUNTRY_NUMBER=14,CA_STATE_PROVINCE_NAME=16,CA_LOCALITY_N

19、AME=15,CA_ORGANIZATION_NAME=17,CA_ORGANIZATIONAL_UNIT_NAME=18,CA_COMMON_NAME=13,CA_PKCS9_EMAILADDRESS=48Imformation_type;class CertVerfierprivate:X509 *rootCA;X509 *userCA;X509_CRL *crl;X509_STORE *rootCAstore;X509_STORE_CTX *ctx;STACK_OF(X509) *CAstack;char msginfo1024;void Der2X509(const unsigned

20、char* der_buffer,int der_buffer_len,int file_type);public:CertVerfier();int LoadCertFile(const char*filename,int file_type);int Verify();const char* Get_error_str();const char* Get_CA_information(int file_type,int information_type,bool is_issuer_info=false);int Reset(int reset_type);CertVerfier();/c

21、ode by dnpbob#include"cert_verify.h"/private functionvoid CertVerfier: Der2X509(const unsigned char* der_buffer,int der_buffer_len,int file_type)switch(file_type)case ROOT_CA:if(!rootCA)rootCA=d2i_X509(NULL,&der_buffer,der_buffer_len);break;case USER_CA:if(!userCA)userCA=d2i_X509(NULL,

22、&der_buffer,der_buffer_len);break;case CRL:if(!crl)crl=d2i_X509_CRL(NULL,&der_buffer,der_buffer_len);break;/public functionCertVerfier:CertVerfier()rootCA=NULL;userCA=NULL;crl=NULL;ctx=NULL;rootCAstore=NULL;CAstack=NULL;int CertVerfier:LoadCertFile(const char*filename,int file_type)FILE *fp;

23、unsigned char der_bufferMAX_CERT_LEN;int der_buffer_len;if(file_type!=ROOT_CA&&file_type!=USER_CA&&file_type!=CRL)return -1;fp=fopen(filename,"rb");if(!fp)return -1;if(file_type=ROOT_CA&&rootCA)Reset(ROOT_CA);if(file_type=USER_CA&&userCA)Reset(USER_CA);if(fi

24、le_type=CRL&&crl)Reset(CRL);der_buffer_len=fread(der_buffer,1,MAX_CERT_LEN,fp);Der2X509(der_buffer,der_buffer_len,file_type);fclose(fp);return 0;int CertVerfier:Verify()if(rootCA&&userCA&&crl)if(!rootCAstore)rootCAstore=X509_STORE_new();X509_STORE_add_cert(rootCAstore,rootCA)

25、;X509_STORE_set_flags(rootCAstore,X509_V_FLAG_CRL_CHECK);X509_STORE_add_crl(rootCAstore,crl);if(!ctx)ctx=X509_STORE_CTX_new();X509_STORE_CTX_init(ctx,rootCAstore,userCA,CAstack);return X509_verify_cert(ctx);elsereturn -1;const char* CertVerfier:Get_error_str()if(ctx)return X509_verify_cert_error_str

26、ing(ctx->error);const char* CertVerfier:Get_CA_information(int file_type,int information_type,bool is_issuer_info)X509 *CA;X509_NAME *issuer_or_subject=NULL;int entriesNum;X509_NAME_ENTRY *name_entry;ASN1_INTEGER *Serial = NULL;ASN1_TIME *time;EVP_PKEY *pubKey;int Version;int NID;unsigned char de

27、rpubkey1024,*Ptr;int derpubkeyLen;int msginfoLen;LPWSTR pUtf8 = NULL;int nUtf8;int rv;int i;char*msginfo_temp;switch(file_type)case ROOT_CA:CA=rootCA;break;case USER_CA:CA=userCA;break;default:return NULL;switch(information_type)case CA_VERSION:Version=X509_get_version(CA);itoa(Version,msginfo,10);r

28、eturn msginfo;case CA_SERIAL_NUMBER:Serial=X509_get_serialNumber(CA);for(msginfo_temp=msginfo,i=0; i<Serial->length; i+,msginfo_temp+=2)itoa(Serial->datai,msginfo_temp,16);if(Serial->datai<16)*(msginfo_temp+1)=*msginfo_temp;*msginfo_temp='0'*(msginfo_temp+1)='0'return

29、msginfo;case CA_NOT_BEFORE:time=X509_get_notBefore(CA);for(i=0;time->datai!='0'i+)msginfoi=time->datai;msginfoi='0'return msginfo;case CA_NOT_AFTER:time=X509_get_notAfter(CA);for(i=0;time->datai!='0'i+)msginfoi=time->datai;msginfoi='0'return msginfo;case C

30、A_PUBLIC_KEY:pubKey=X509_get_pubkey(CA);Ptr=derpubkey;derpubkeyLen=i2d_PublicKey(pubKey,&Ptr);for(msginfo_temp=msginfo,i=0;i<derpubkeyLen;i+,msginfo_temp+=2)itoa(derpubkeyi,msginfo_temp,16);if(derpubkeyi<16)*(msginfo_temp+1)=*msginfo_temp;*msginfo_temp='0' *(msginfo_temp+1)='0&

31、#39;return msginfo;switch(is_issuer_info)case false:issuer_or_subject = X509_get_subject_name(CA);if(!(name_entry=sk_X509_NAME_ENTRY_value(issuer_or_subject->entries,0)strcpy(msginfo,"No issuer's infomation");return msginfo;NID=OBJ_obj2nid(name_entry->object);break;case true:issu

32、er_or_subject=X509_get_issuer_name(CA);if(!(name_entry=sk_X509_NAME_ENTRY_value(issuer_or_subject->entries,0)strcpy(msginfo,"No subject's information");return msginfo;NID=OBJ_obj2nid(name_entry->object);break;for(i=0;NID!=information_type;i+)if(!(name_entry=sk_X509_NAME_ENTRY_val

33、ue(issuer_or_subject->entries,i)strcpy(msginfo,"Not Found");return msginfo;NID=OBJ_obj2nid(name_entry->object);if(name_entry->value->type=V_ASN1_UTF8STRING)nUtf8 = 2*name_entry->value->length;pUtf8 = (LPWSTR)malloc(nUtf8);memset(pUtf8,0,nUtf8);rv = MultiByteToWideChar(CP_

34、UTF8,0, (char*)name_entry->value->data, name_entry->value->length, pUtf8, nUtf8);rv = WideCharToMultiByte(CP_ACP, 0, pUtf8, rv, (char*)msginfo, nUtf8, NULL, NULL);free(pUtf8);pUtf8 = NULL;msginfoLen = rv;msginfomsginfoLen='0'elsemsginfoLen=name_entry->value->length;memcpy(m

35、sginfo,name_entry->value->data,msginfoLen);msginfomsginfoLen='0'return msginfo;int CertVerfier:Reset(int reset_type)switch(reset_type)case ROOT_CA:X509_free(rootCA);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);rootCA=NULL;ctx=NULL;rootCAstore=NULL;b

36、reak;case USER_CA:X509_free(userCA);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);userCA=NULL;ctx=NULL;break;case CRL:X509_CRL_free(crl);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);crl=NULL;ctx=NULL;rootCAstore=NULL;break;case ROOT_CA+CRL:X509_free(rootCA

37、);X509_CRL_free(crl);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);rootCA=NULL;crl=NULL;ctx=NULL;rootCAstore=NULL;break;case CRL+USER_CA:X509_free(userCA);X509_CRL_free(crl);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);userCA=N

38、ULL;crl=NULL;ctx=NULL;rootCAstore=NULL;break;case ROOT_CA+USER_CA:X509_free(rootCA);X509_free(userCA);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);rootCA=NULL;userCA=NULL;ctx=NULL;rootCAstore=NULL;break;case ROOT_CA+CRL+USER_CA:X509_free(rootCA);X509_free(userCA)

39、;X509_CRL_free(crl);X509_STORE_CTX_cleanup(ctx);X509_STORE_CTX_free(ctx);X509_STORE_free(rootCAstore);rootCA=NULL;userCA=NULL;crl=NULL;ctx=NULL;rootCAstore=NULL;break;default:return -1;return 0;CertVerfier:CertVerfier()Reset(ROOT_CA+CRL+USER_CA);%main.cpp文?件t%#include<iostream>#include"ce

40、rt_verify.h"using namespace std;int main(void)int CA,ret,CA_list=ROOT_CA,USER_CA;bool is_issuer,is_issuer_options=true,false;const char *userCA_filenames="guest1.cer","guest2.cer"CertVerfier cv;ret=cv.LoadCertFile("root.cer",ROOT_CA);if(ret=-1)cout<<"Loa

41、ding fail."return 0;ret=cv.LoadCertFile("crl.crl",CRL);if(ret=-1)cout<<"Loading fail."return 0;cout<<"Done loading files(root.cert crl.crl)."<<endl<<endl;for(int k=0;k<2;k+)cout<<"Verify: "<<userCA_filenamesk<<

42、endl;ret=cv.LoadCertFile(userCA_filenamesk,USER_CA);if(ret=-1)cout<<"Loading fail."continue;ret=cv.Verify();if(ret!=1)cout<<"Verifying fail: "<<cv.Get_error_str()<<endl;cout<<"-=Detailed information=-"<<endl;for(int i=0;i<2;i+)CA=C

43、A_listi;char* CA_description;if(CA=ROOT_CA)CA_description="Root "elseCA_description="User "cout<<CA_description<<"CA serial number: "<<cv.Get_CA_information(USER_CA,CA_SERIAL_NUMBER)<<endl;cout<<CA_description<<"CA version: "

44、;<<cv.Get_CA_information(USER_CA,CA_VERSION)<<endl;cout<<CA_description<<"CA publickey: "<<cv.Get_CA_information(USER_CA,CA_PUBLIC_KEY)<<endl;for(int j=0;j<2;j+)is_issuer=is_issuer_optionsi;char* options_description;if(is_issuer)options_description=&q

45、uot;CA's issuer "elseoptions_description=""cout<<CA_description<<options_description<<"CA not before time: "<<cv.Get_CA_information(USER_CA,CA_NOT_BEFORE,is_issuer)<<endl;cout<<CA_description<<options_description<<"CA not after time: "<<cv.Get_CA_information(USER_CA,CA_COUNTRY_N

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論