/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);/*对常用公式进行宏定义 ,以精简程序*/ #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); 在对文件进行安全哈希后得到了一个消息摘要文件,对文件的签名除了需要消息摘要文件以外还需要用户持有的私钥文件,有了这两个必须的,就可以对原文件进行签名运算了,在生成签名的时候我们将会用到生成签名算法。生成签名算法的具体实现代码如下: void GensigDlg::OnGensig() { // TODO: Add your control notification handler code here if(m_strPK.IsEmpty()){ MessageBox("请导入私钥",NULL,MB_ICONERROR|MB_OK); return; } if(m_strF.IsEmpty()){ MessageBox("请选择要签名的文件",NULL,MB_ICONERROR|MB_OK); return; } //----sha------------// int i; SHA1_CTX context; unsigned char digest[20], buffer[16384]; FILE* file; if(!(file=fopen(LPCTSTR(m_strF),"rb"))){ MessageBox("无法打开文件!"); return; } SHA1Init(&context); while (!feof(file)) { // note: what if ferror(file) i = fread(buffer, 1, 16384, file); SHA1Update(&context, buffer, i); } SHA1Final(digest, &context); fclose(file); //--------------------// dig.Mov(0); for(int j=0;j<5;j++){ memcpy(&dig.m_ulValue[j],&digest[j*4],4); } dig.m_nLength=5; CRsa enc; sig.Mov(enc.encrypt(dig,n,pk)); sig.Put(m_strS); UpdateData(FALSE); } 3.3.3 签名验证模块 此模块主要是用于鉴别用户的数字证书的真伪性的。在这个模块用户只需要把自己的私钥文件和前一个模块地到的签名文件与用户填写的房产证公文文件共同导入这个模块通过计算机的运算对比就可以得出真假的鉴别结果。在此过程中必须要保证用户的私有信息要完全准确无误,还需要这个用户有自己的私钥文件和相应的数字签名文件,在这三个条件都能满足验证系统的要求的情况下得出的真伪鉴别结论可信度是值得肯定的,具体实现如图8所示。 图8 签名与验证模块图 在对证书文件进行签名以后,如果用户需要知道自己的证书是不是真的,他就需要通过管理中心来对自己的证书进行鉴别和验证。 验证签名过程的实行通过以下一段VC++代码来实现其验证功能 void CersigDlg::OnCers() { // TODO: Add your control notification handler code here if(m_strUK.IsEmpty()){ MessageBox("请导入公钥",NULL,MB_ICONERROR|MB_OK); return; } if(m_strF.IsEmpty()){ MessageBox("请选择签名文件",NULL,MB_ICONERROR|MB_OK); return; } if(m_strS.IsEmpty()){ MessageBox("请导入签名",NULL,MB_ICONERROR|MB_OK); return; } //----sha------------// int i; SHA1_CTX context; unsigned char digest[20], buffer[16384]; FILE* file; if(!(file=fopen(LPCTSTR(m_strF),"rb"))){ MessageBox("无法打开文件!"); return; } SHA1Init(&context); while (!feof(file)) { // no
首页 上一页 4 5 6 7 8 9 下一页 尾页 7/9/9