精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>○ DOS>>应用软件>>数据库>>一种新式的加密方法:分字符串法

主题:一种新式的加密方法:分字符串法
发信人: m9412()
整理人: smallhors(1999-07-18 18:41:12), 站内信件
随着人们对软件自我保护意识的加强,加密越来越成为保护自己软件不被非法人
员窃取和偷看的方法。
  为此,许多人编写了各种各样的加密软件。但在众多此类软件中,总免不了
使用“密钥”、“口令”等加密方法。这些方法固然很好,但市面上早已出现了
许多反加密软件,可不费吹灰之力,将已被加密的软件解密,从而形成了“道高
一尺,魔高一丈”的局面。这使得许多人开始寻求一种新式的加密方法。笔者在
实践中,经常使用一种自称为“分字符串法”的加密方法。试用了几个月,效果
不错。现将其思路及运用此方法编制的源程序奉献给大家,愿为大家起个“抛砖
引玉”的作用。此方法的思路是:将欲加密程序(以下简称:“欲密”)中的字
符串分解成若干个字符相加的形式,再取得每个字符的ASCII码,最后用CHR()
函数将各个字符连接起来。例如:A=“ABC”,分解后便是A=CHR(65)+CHR(6
6)+CHR(67)。这样既可以保证其正常运行,又能起到加密源程序的作用。若
将“欲密”经上述处理后编译,则效果更佳,在“欲密”中找不到任何字符串。
但考虑到在不破坏“欲密”正常运行的情况下,又要简化加密软件的程序设计,
笔者采用一种折衷的方法,即将“欲密”中想加密的字符串用“‘”、“’”括
起来。这样一来,既可不破坏“欲密”的执行,又可方便地被加密软件所识别。

  该程序分两部分。第一部分是界面,提示用户输入源程序和目标程序文件名
,并进行处理。第二部分是处理模块,用以处理源程序。具体程序如下:
  set talk off
  do whil .t.
  clea
  defi wind input_fn from 9,13 to 13,67 ;
  shad ;
  colo w+/r
  defi wind gs from 16,25 to 18,55 ;
  shad ;
  none ;
  colo gr+/g
  acti wind gs
  @0,13 say'格 式' colo b+/g
  @1,3 say'<盘符><路径><文件名><.prg>'
  acti wind input_fn
  dime fn<2>
  stor spac(32) to fn<1>,fn<2>
  @0,1 say'请输入源文件名: ' get fn<1>
  @2,1 say'请输入目标文件名:' get fn<2>
  read
  rele wind gs
  if read()=12
   clea wind
   retu
  endi
  fn<1>=allt(fn<1>)
  fn<2>=allt(fn<2>)
  f1=fopen(fn<1>) &&打开文件
  defi wind err from 14,20 to 16,60 ;
  shad ;
  colo sche 5
  if f1<0 &&判断文件是否存在
   acti wind err
   dy=19-int((len(fn<1>)+11)/2) &&计算显示列数(为了取中显示)
   @0,dy say uppe(fn<1>)+'文件不存在!'
   =inke(5,'h')
   deac wind err
   loop
  endi
  f2=fcreate(fn<2>,0)
  if f2<0
   acti wind err
   dy=19-int((len(fn<1>)+11)/2)
   @0,dy say uppe(fn<2>)+'文件已存在!'
   =inke(5,'h')
   deac wind err
   loop
  endi
  exit
  endd
  defi wind dd from 16,29 to 18,51 ;
  shad ;
  colo w+/g
  acti wind dd
  @0,1 say'正在处理, 请稍候...'
  do whil !feof(f1) &&判断文件指针是否指到文件末尾
   oldstr=fget(f1) &&读出一程序行
   newstr=cl() &&调用CL(处理)自定义函数
   =fput(f2,newstr)
  endd
  =fclo(f1)
  =fclo(f2)
  clea
  @0,4 say'按任意键返回...'
  =inke(0,'h')
  clea wind
  retu .t.
  func cl
  jmnstr=oldstr
  yhwz1=at('"',oldstr,1)
  yhwz2=at('"',oldstr,2)
  do whil yhwz1#0
   yhwz3=yhwz1+1
   yhwz4=yhwz2-1
   jmstr=subs(oldstr,yhwz3,yhwz4-yhwz3+1)
   jmstr1=''
   for strgs=1 to len(jmstr)
   jmsasc=asc(subs(jmstr,strgs,1))
   jmstr1=jmstr1+'CHR('+allt(str(jmsasc))+')+'
   endf
   jmstr1=left(jmstr1,len(jmstr1)-1)
   jmnstr=left(oldstr,yhwz1-1)+jmstr1+righ(oldstr,len(oldstr)-yh
wz2)
   oldstr=jmnstr
   yhwz1=at('"',oldstr,1)
   yhwz2=at('"',oldstr,2) 
  endd
  retu jmnstr
  若要将识别符改为“'”,则将程序中的“yhwz1=at('"',oldstr,1)”一句及
其下一句(注意有两处!)
  改为“yhwz1=at("'",oldstr,1)”和“yhwz2=at("'",oldstr,2)”或“yhwz
1=at("<",oldstr,1)”和“yhwz2=at(">",oldstr,1)”即可。
  以上程序已在UCDOS 5.0、FOXPRO 2.0和2.5下顺利通过。北京 杨扬

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.100.71.68]

[关闭][返回]