Q
QXCOMM
Unregistered / Unconfirmed
GUEST, unregistred user!
//文件读写公共函数,用法较复杂<br>int _PubKey_IO(char *buf1,int *len1,char *buf2,int *len2,int Action)<br>/*<br>'Action=1:<br>'buf1指向公钥数据块、<br>'len1指向一个表示数据块长度的int变量;<br>'buf2指向文件名字串、<br>'len2无意义。<br>'操作结果:将buf1数据块内容以DER格式存盘。<br>'Action=3:<br>'buf1指向文件名字串、<br>'len1指向一个数值为0的int变量;<br>'buf2指向一个数据缓冲区、<br>'len2指向一个表示数据缓冲区最大长度的int变量;<br>'操作结果:将公钥文件读入并以PEM格式放入buf2缓冲区,len2为读入后的数据块有效长度。<br>'如果buf2空间不够大,len2指向的变量返回实际需要值。<br>'Action=P12:<br>'buf1指向一个数据缓冲区,区内存放读P12文件名字串、<br>'len1指向一个表示buf1数据缓冲区最大长度的int变量(不需要读取私钥时置0);<br>'buf2指向一个数据缓冲区,区内存放读P12文件的密码,如果该文件不需要密码,则将其第一个字节置0、<br>'len2指向一个表示buf2数据缓冲区最大长度的int变量;<br>'操作结果:将P12文件的公钥读入并以PEM格式放入buf2缓冲区,len2为读入后的数据块有效长度。<br>'如果buf2空间不够大,len2指向的变量返回实际需要值,<br>'将P12文件的私钥读入并以PEM格式放入buf1缓冲区,len1为读入后的数据块有效长度。<br>'如果buf2空间不够大,len2指向的变量返回实际需要值,<br>'如果密码无效,len1和len2指向的变量返回-1。<br>'操作成功:返回值<>0,失败:返回值=0。<br>'利用这个函数实现"查看"公钥、"分拆匙包"功能(先Action=5读出公私钥,然后分别存盘)<br>*/<br>================================================================================<br>var<br>buf1,buf2char;<br>len1,len2:longint;<br>ms1,ms2:TMemoryStream;<br>F1: file;<br>Size1,Size2: longint;<br><br>begin<br><br><br>//将匙包放入缓冲区buf1内<br>AssignFile(F1, Edit1.Text);<br>Reset(F1, 1);<br>Size1 := FileSize(F1);<br>GetMem(Buf1, Size1);<br>BlockRead(F1, Buf1^, Size1);<br>len1:=4096;<br><br><br>//将密码放入缓冲区buf2内<br>GetMem(Buf2,Length(edit2.Text ));<br>StrCopy(Buf2, PChar(edit2.Text));<br>len2:=4096;<br><br>_PubKey_IO(buf1,len1,buf2,len2,5);<br><br><br><br>//从缓冲区buf1内读出私钥<br>ms1:=TMemoryStream.Create;<br>ms1.Write(buf1^,len1);<br>ms1.SaveToFile('c:/yjyaaa.prk');<br>ms1.Free;<br><br>//从缓冲区buf2内读出公钥<br>_PubKey_IO(buf2,len2,Pchar(Edit3.text),len2,1);<br><br>ms2:=TMemoryStream.Create;<br>ms2.Write(buf2^,len2);<br>ms2.SaveToFile('c:/yjyaaa.cer');<br>ms2.Free;<br><br>end;<br><br><br>上面的代码是运行后分拆匙包,产生的公钥,和私钥的格式不正确,我怀疑是代码错误,请帮忙分析