设置ADO连接串,然后加密,写入注册表,再读出时却面目全非。(200分)

  • 主题发起人 主题发起人 marknew
  • 开始时间 开始时间
M

marknew

Unregistered / Unconfirmed
GUEST, unregistred user!
1。
连接串是
Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=qjmis;Data Source=MSC018
也就是把以上的内容加密后写入注册表,再解密读出。
下面的加解密算法是没问题的,我已经测试过,这个串不写入注册表就没问题。
我怀疑是写入注册表时很多怪符号(加密后生成的)出现了问题,
写入ini文件只能读出加密后的一部分,请大家帮我分析一下问题的所在。200分!

以前是我的读写过程
Type IniOpType=(OpRead,OpWrite);
function ReadWriteDataReg(var DefConnStr:string;OpType:IniOpType=OpRead):boolean;
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
with Reg do
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('/Software/'+CPubSoftName, True) then
begin
try
if OpType=OpRead then
begin
DefConnStr:=ReadString('ConnectionString');
if DefConnStr<>'' then
DefConnStr:=decrypt(DefConnStr,10,50,100);
end
else
begin
if DefConnStr<>'' then
begin
DefConnStr:=Encrypt(DefConnStr,10,50,100);
Reg.WriteString('ConnectionString',DefConnStr);
end;
end;
result:=true;
except
msgbox('读写注册表时出错!',48,CPubSystemHint);
end;
end;
finally
Reg.CloseKey;
Reg.Free;
end;
end;
这是我的加密解密算法
function Encrypt(const InString:string
StartKey,MultKey,AddKey:int64): string;
var
I : Byte;
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString) xor (StartKey shr 8));
StartKey := (Byte(Result) + StartKey) * MultKey + AddKey;
end;
end;

function Decrypt(const InString:string
StartKey,MultKey,AddKey:Integer): string;
var
I : Byte;
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString) xor (StartKey shr 8));
StartKey := (Byte(InString) + StartKey) * MultKey + AddKey;
end;
end;
2。请问是写Active Library/Com+的属性如何赋值?一定得用带传址参数的函数吗?
(有人问过,但没结果)
 
你应该写成2进制的。
 
关于1的一点小建议,不要用writestring 用writebinarydata,应该可以写入哪些特殊的
类似乱码的东东的^_^
 
1、我实验了,没有发现不同呀,读出和写入完全相同!
使用WriteString也应该一样,因为加密算法返回的还是String类型呀。
 
思考中。
 
玩出问题来了,不是因为储存在注册表,而是因为你的加密程序加密后含有控制字符!
呵呵,还是使用Binary方式吧,同时Function不能返回String了。
 
不对,是因为String类型超过了255了?
因为AdoConnection连接后字符串会改变,呵呵,长度超过255,然后导致赋值出错!
大概这回对了。呵呵。
 
测试中....
 
是加密后字符串中含有控制符的问题。
行了,我换了一种加密算法,使得加密后的内容全为数字字符串,谢谢各位了。
第二个呢?有人知道吗?准备分分了。
 
呵呵,这个问题我这几天正好在研究。
我也作了个加密的东东。算法和你的几乎一样。:) 不过我改了一下。
我要对部分数据进行加密,所以在存之前先对要加密的数据进行加密,然后读的时候再解密。
开始的时候我也用这个算法,可是结果和你遇到的情形是一样的:
存进去的时候好好的,但是读出来再解迷就出错!
后来我分析了一下原因。原来这个算法在加密的时候把有的字符加密成空格或者其他古怪的
字符,但是读的时候程序会把空格忽略掉。所以读出来再解密肯定会和以前不一样。
但是如果仅仅在程序运行之后使用这两个算法却一点问题都没有。
把你的算法修改一下:
function Encrypt(const InString:string
StartKey,MultKey,AddKey:int64): string;
var
I : Byte;
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString) xor (StartKey shr 8));
end;
end;
这样就可以了。


 
我的同你的差不多,不过我再改进了一此.
希望有人给我回答第二个问题,独享100分。

 
提前一下。再没人能够回答就只有结束了。
 
我来说两句
既然你已经加密了,那么你放到哪里都一样啊,难道非要放到注册表里面才安全吗??
 
放在INI里读出的字符串更不完整(以前的加密算法)。当然也可放在一个文本文件里。
这些都不重要。
第一个问题已解决。欢迎回答第二个问题。
 
使用Binary方式
 
2。请问是写Active Library/Com+的属性如何赋值?一定得用带传址参数的函数吗?
(有人问过,但没结果)

难道没人用过吗?
 
第二个问题我也搞出来了。原来是把读属性的函数的返回值由HResult改为void。
 
多人接受答案了。
 
后退
顶部