用Dll做程序加密/解密问题(150分)

  • 主题发起人 主题发起人 聂儿
  • 开始时间 开始时间

聂儿

Unregistered / Unconfirmed
GUEST, unregistred user!
请教各位大虾,我用Delphi做了一个加密/解密程序算法,用dll方式发布,<br>但是不能正常使用。<br>//pass.dll<br>library pass;<br><br>uses<br>&nbsp; shareMem,<br>&nbsp; SysUtils,<br>&nbsp; Classes,<br>&nbsp; En_De in 'En_De.pas';<br>{$R *.RES}<br><br>function EnCrypt(PassStr : PChar) : PChar ; StdCall;<br>var<br>&nbsp; &nbsp; Str : String;<br>//加密<br>begin<br>&nbsp; &nbsp; Str := String(PassStr);<br>&nbsp; &nbsp; Str := EncryptCode(Str);<br>&nbsp; &nbsp; Result := Pchar(str);<br>end;<br><br>function DeCrypt(PassStr : PChar) : PChar ; StdCall;<br>var<br>&nbsp; &nbsp; Str : String;<br>//解密<br>begin<br>&nbsp; &nbsp; Str := String(PassStr);<br>&nbsp; &nbsp; Str := DecryptDode(Str);<br>&nbsp; &nbsp; Result := PChar(Str);<br>end;<br><br>exports<br>&nbsp; &nbsp; EnCrypt,<br>&nbsp; &nbsp; DeCrypt;<br>begin<br>end.<br><br><br>vb程序如下<br>'pass.bas<br>Declare Function EnCrypt Lib "pass.dll" (ByVal Password As<br>String) As String<br>Declare Function DeCrypt Lib "pass.dll" (ByVal Password As <br>String) As String<br><br>'主程序调用<br>dim passstr,secrstr as String<br>passstr = 'xxx'<br>secrstr = Encrypt(passstr)<br>'程序正常运行但是多次执行返回的字符串长度不一样<br><br>passstr = Decrypt(secrstr)<br>'程序正常,但是得不到正确结果<br><br>'EncryptCode(Str)和'DecryptDode(Str)放在delphi程序中没有问,<br>'Encrypt(str)和Decrypt(str)在delphi程序中返回结果与原来密码<br>'位数有不同<br>
 
不知是否是delphi的pchar 与vb的string之间的转换问题;<br>还有调用vb的string时,由于是加密,最好初始化字符长度如200(其实加密後的数据只<br>用100),调用加密函数後在处理;解密也是如此.<br><br>以前我用c写过加减密的dll,开始用c的string,在vb中调用会出现问题,最后用char,<br>就解决了问题.试试:-)
 
加密、解密放dll?亏你想的出,dll给人拷了去你还加、解什么密呢?<br>2个输出函数谁都知道怎么用拉
 
Pipi请赐教
 
你的程序犯了个常见的指针错误。函数在运行结束以后会释放在函数中分配的内存。<br>你的函数返回值是指针类型,则在返回时只是返回了一个指向你在函数中分配的一<br>段包含该密文(或明文)字符串的内存。尽管指针是返回了,但指针指向的内容在<br>函数返回时被释放了。则所返回的指针所指向的内容为不确定的值,但程序不会出<br>错。如果,你想返回正确的值的话应把返回值做为参数传出。如:<br>function EnCrypt(PassStr : PChar,EncryptedStr : PChar) : boolean ; StdCall;<br>var<br>&nbsp; &nbsp; Str : String;<br>//加密<br>begin<br>&nbsp; &nbsp; Str := String(PassStr);<br>&nbsp; &nbsp; Str := EncryptCode(Str);<br>&nbsp; &nbsp; EncryptedStr := PChar(str);<br>&nbsp; &nbsp; if EncryptedStr = nil then<br>&nbsp; &nbsp; &nbsp; Result := false<br>&nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; Result := true;<br>end;<br>这样函数返回值表示加密成功与否,而密文从参数穿出就不存在上述问题了。<br>另外,EncryptCode函数也可以转换成我提供例子的样式,密文从参数传出,函数返回值表示加密成功与否。<br>Pipi说得对这种加密没什么用处,最好再加个密匙。
 
不要把加密解密的函数直接放dll中export,因为别人拿了你的dll去<br>很容易就可以调用你的dll中的函数。把函数放exe里面也一样啊<br>最多不过多了“拷贝”“粘贴”罢了
 
多人接受答案了。
 
后退
顶部