在InstallShield中加密字符串,在C#中解密

系统 1616 0
         一般情况下,Asp.Net程序中,数据库连接字符串大多存储在配置文件中。如果程序不是手工发布,而是通过安装程序部署,那么通常在安装过程中需要用户输入数据库管理员帐号和密码,以便安装数据库。同时将管理员帐号和密码以及数据库服务器地址(或者数据库连接字符串)写入配置文件中。但是如果不加密,尤其是数据库管理员密码,若以明码形式存储,极容易被窃取。
         这就需要对字符串进行加密处理。但是在安装制作软件(我用的是InstallShield 12)中没有提供专用的加密方法,而且在InstallShield中加密过的字符串在Asp.Net(我用的是C#编写Asp.Net)中要能够被解密,则必须用两者通用的加密解密方法。因此我想到,每个字符的ASCII码都是通用的,只要在InstallShield中对字符的ASCII码进行处理,比如加一或移位,得到一个新的字符串,再到C# 中进行逆向操作,就可以还原为原来的字符串。
        在寻思用什么方法加密的时候,偶然想到曾经在一外网站上下载的一段代码,赶紧找将出来(后来还幸运地回忆起那个网站,那就是非常有名的 InstallSite ,大家可以上去逛逛,那里有很多InstallShield的脚本示例代码,可以下载参考参考) ,他的源码如下:
////////////////////////////////////////////////////////////////////////////// /
//
//
//  Function: String2Password
//
//
//
//   Purpose: This function takes a string and returns a numeric equivalent    //
//            of all the character's ASCII values added together.
//
//            (Note: InstallShield may use different values than the ASCII     //
//            table I did not verify this.)
//
//
//
////////////////////////////////////////////////////////////////////////////// /
function String2Password( nAnswer, szName )
     STRING szRight, szLeft;
     CHAR   cChar;
     NUMBER nLength;

 begin

       nAnswer 
=   0 ;
       nLength 
=  StrLength(szName);
   
    while  (nLength  >   0 )
        StrSub(szRight, szName, 
1 , (nLength - 1 ));
        StrSub(szLeft, szName, 
0 1 );
        cChar 
=  szLeft[ 0 ];
        
if  (cChar  <   0 ) then
             cChar 
=  cChar  &   255 ;
        endif;
        szName 
=  szRight;
        nAnswer 
=  nAnswer  +  cChar;
        nLength 
=  nLength  -   1 ;
   endwhile;

 end;

        这段代码返回的是一个求和的数字,并不完全符合我们的要求,而且我发现cChar=szLeft[0]的取值是有问题的.大家注意到没有,代码作者也在注释中有说明.也不知道 InstallSite 为什么把这种有问题的代码作放在网站上,还居然作为Sample供下载.
        于是将其改造了一番:
       
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//   
//                    string2password.rul
// 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1
function   STRING  String2Password(szName )
 2   STRING  szRight ,  szLeft , szAnswer;
 3  CHAR   cChar;
 4   NUMBER  nLength;
 5
 6  begin
 7
 8    szAnswer  =   "" ;
 9    nLength  =  StrLength(szName);
10     while  (nLength  >   0 )
11       StrSub(szRight ,  szName ,   1 ,  (nLength - 1 ));
12       StrSub(szLeft ,  szName ,   0 ,   1 );
13       cChar  =  STRTOCHAR(szLeft);
14       cChar  =  cChar  + 1 ;
15       szName  =  szRight;
16       CharReplace(szLeft , STRTOCHAR(szLeft) , cChar , 0 )
17       szAnswer  =  szAnswer  +  szLeft;
18       nLength  =  nLength  -   1 ;
19     endwhile ;
20     return  szAnswer;
21   end ;

        至于C#的解码就很简单了,这里也一并贴出来,凑个数吧:
 1   public   string  password2string( string  sPass)
 2      {
 3          string  sResult  =   string .Empty;
 4          for  ( int  i  =   0 ; i  <  sPass.Length; i ++ )
 5          {
 6              int  num  =  ( int ) char .Parse(sPass.Substring(i, 1 ))  -   1 ;
 7             sResult += (( char )num).ToString();
 8         }

 9          return  sResult;
10     }

        小结:这里为了说明问题只是用了加1减1的方法,非常简单.我正在研究基于XXTea的加密方法,等有了结果在公布出来.

在InstallShield中加密字符串,在C#中解密


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论