明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3928|回复: 6

[基础] [转]alisp文件加密测试.LSP

[复制链接]
发表于 2011-6-16 14:07:14 | 显示全部楼层 |阅读模式
本帖最后由 cumtjh 于 2011-6-16 14:10 编辑

转自:http://zml84.blog.sohu.com/100535521.html

alisp文件加密测试.LSP
最后修改时间:
--------------------------------------------------------------------------------

;|alisp文件加密的探索

AutoLISP保护文件的格式
    AutoCAD虽然没有提供加密、解密AutoLISP的工具软件,但其本身却可以接收两种格式的LISP文件。
一种是保护格式的;另一种是文本格式的。读入文件后,AutoCAD首先会作出判断,一旦确定文件是保护
格式的,则在加载该程序前,自动将加密文件代码予以还原,然后再读入命令解释器。

下面我们来看看AutoLISP保护格式文件的格式。
----------------------------------------------------------------------------------------
起始地址及终止地址(Bytes)              功能
        0-29                     保护文件的标识字符串计30Bytes,为"AutoCAD PROTECTED LISP file\0x0D\0x0A\0x1A"。
        30                       密码字符,只有一个字节。
        31及以后                 已加密的程序码。

注意:前30个字节用户不得改动;
      第30位是密码字母,用户可以任意给定,譬如字母'A';
      第31位起可由附录程序经过加密计算后写入文件。

**加密与解密的原理**
    加密与解密的一个重要工具是"按位异或(^)运算"。
其作用是判断两运算量相应位的值是否"相异",若为异,则为1,否则为0。
即:0^0=0;0^1=1;1^0=1;1^1=0。
因其具有双向转换、还原的能力,故在密码学上得到广泛应用。

让我们来看看:
         A|01000001    8|00111000
        ^y|01111001   ^A|01000001
        -------------------------
         8|00111000    y|01111001

上式中0x41='A'、0x79='y'、0x38='8',
     'A'^'y'='8';'8'^'A'='y';'y'^'8'='A'。
     可以看出按位异或运算具有双向转换、还原的能力。
     AutoCAD在加密、解密时,除了运用上述方法外,另外还使用了一个技巧,就是移位运算,
     将被转换字符的8个位全部左移一位,相当于将该整数乘以2,若最高位是1(移位后>256),
     则将溢出位1移至最末位,否则用0代替末位,这样就保证了加密码与原代码一一对应。

我们假设用函数F表示这一运算过程。
----字符0x96,二进制为10010110,则F(0x96)=F(10010110)=00101101=0x2D。

----我们用下面两个算式,来说明加密、解密的具体过程,式中各符号的意义:
A0->B=A^B;A-B=F(A)^B;A/B=F(A)^B;'||'='='。
各字符均以16进制表示,假设密码字母是'A'(0x41)。

原始程序码为:
(PRINC)
加密过程如下:

----(princ)  ->  28 70 72 69 6E 63 29
        具体过程为:
        1、0x41^0x28=0x69; (按位异或)
        2、F(0x69)=0xD2; (移位运算)
        3、0xD2^0x70=0xA2; (按位异或)
        2、F(0xA2)=0x45; (移位运算)
        3、0x45^0x72=0x37;  ......

        
----结果(69 A2 37 07 60 A3 6E)


解密过程如下:

----41->   69-A2-37-76-0A-36-ED
----||||||||……(依次类推)

----287072696E6329结果(PRINC)

具体过程为:
1、0x41^0x69=0x28;(字符'(')
2、F(0x69)=0xD2;
3、0xD2^0xA2=0x70;(字符'p')……

|;

  1. ;;;========================================================
  2. ;;;功能:定义函数,实现 左移一位操作
  3. ;|;;测试:(setq lst (vl-string->list "(princ)"))
  4.           (++++ lst  65)
  5. |;
  6. (defun F+ (INT / TMP)
  7.     ;;先转换成二进制
  8.     (setq TMP (DEG->BIN INT))
  9.     ;;补齐为 8 位
  10.     (while (< (strlen TMP) 8)
  11.   (setq TMP (strcat "0" TMP))
  12.     )
  13.     ;;将首位移动到末位
  14.     (setq TMP (strcat (substr TMP 2 7) (substr TMP 1 1)))
  15.     ;;返回
  16.     (BIN->DEG TMP)
  17. )
  18. ;;;========================================================
  19. ;;;功能:仿autolisp加密文本
  20. (defun ++++ (LST KEYSCI / LST1 N TMP)
  21.     (setq LST1 '()
  22.     )
  23.     ;;
  24.     (foreach N LST
  25.   (progn
  26.       ;;=====================
  27.       ;;异或操作
  28.       (setq TMP (boole 6 KEYSCI N))
  29.       (setq LST1 (cons TMP LST1))

  30.       ;;=====================
  31.       ;;计算下一个 密匙
  32.       (setq KEYSCI (F+ TMP))
  33.   )
  34.     )
  35.     ;;返回
  36.     ;;(vl-list->string (reverse LST1))
  37.     (reverse LST1)
  38. )
  39. ;;;==============================================================
  40. ;;;解密
  41. ;;;  
  42. (defun ---- (LST KEYSCI / LST1 N TMP)
  43.     (setq LST1 '())
  44.     ;;
  45.     (foreach N LST
  46.   (progn
  47.       ;;=====================
  48.       ;;异或操作
  49.       (setq TMP (boole 6 KEYSCI N))
  50.       (setq LST1 (cons TMP LST1))

  51.       ;;=====================
  52.       ;;计算下一个 秘匙
  53.       (setq KEYSCI (F+ N))
  54.   )
  55.     )
  56.     ;;返回
  57.     ;;(vl-list->string (reverse LST1))
  58.     (reverse LST1)
  59. )

  60. ;;;================
  61. (defun C:TT1 (/ STR LST FF N)
  62.     ;;
  63.     (setq STR "(PRINC "OK")")
  64.     (setq LST (vl-string->list STR))
  65.     (setq LST (++++ LST 65))

  66.     ;;写入文件
  67.     (setq FF (open "d:\\test\\test.txt" "w"))
  68.     (foreach N LST
  69.   (write-char N FF)
  70.     )
  71.     (close FF)

  72.     (princ)
  73. )

  74. ;;;===================
  75. (defun C:TT2 (/ LST FF TMP N)

  76.     (setq LST '())
  77.     ;;读文件
  78.     (setq FF (open "d:\\test\\test.txt" "r"))
  79.     (while (setq TMP (read-char FF))
  80.   (setq LST (cons TMP LST))
  81.     )
  82.     (close FF)

  83.     ;;
  84.     (setq LST (---- (reverse LST) 65))
  85.     (princ (vl-list->string LST))
  86.     (princ)
  87. )


  88. ;;;===================
  89. ;;;加入文件头
  90. (defun C:TT3 (/ LST FF TMP N I)

  91.     (setq LST '())
  92.     ;;读文件
  93.     (setq FF (open "d:\\test\\test.txt" "r"))
  94.     (while (setq TMP (read-char FF))
  95.   (setq LST (cons TMP LST))
  96.     )
  97.     (close FF)

  98.     ;;写入文件
  99.     (if  (setq FF (open "d:\\test\\test.lsp" "w"))
  100.   (progn
  101.       ;;写入文件头
  102.       (foreach N (vl-string->list "AutoCAD PROTECTED LISP file")
  103.     (write-char N FF)
  104.       )
  105.       (write-char 13 FF)
  106.       (write-char 10 FF)
  107.       (write-char 26 FF)
  108.       ;;写入
  109.       (write-char 65 FF)
  110.       ;;写入文件内容
  111.       (setq STR "(alert "测试成功")(PRINC "OK")")
  112.       (setq LST (vl-string->list STR))
  113.       (setq LST (++++ LST 65))
  114.       (foreach N LST
  115.     (write-char N FF)
  116.       )
  117.   )
  118.     )
  119.     (princ)
  120. )
  121. ;;;======================================================================================
  122. ;;;十进制转化为二进制
  123. ;;;例如:(deg->bin 3) 返回"11"
  124. ;;;      (deg->bin 5) 返回"101"
  125. (defun DEG->BIN  (INT / A B)
  126.     (if  (< INT 1)
  127.   "0"
  128.   (if (= INT 1)
  129.       "1"
  130.       (progn
  131.     (setq A  (/ INT 2)
  132.           B  (- INT (* A 2))
  133.     )
  134.     (strcat  (DEG->BIN A)
  135.       (itoa B)
  136.     )
  137.       )
  138.   )
  139.     )
  140. )
  141. ;;;======================================================================================
  142. ;;;二进制转化为十进制
  143. ;;;例如:(bin->deg "11")  返回 3
  144. ;;;      (deg->bin "101") 返回 5
  145. (defun BIN->DEG  (STR)
  146.     (if  (<= (strlen STR) 1)
  147.   (if (= STR "1")
  148.       1
  149.       0
  150.   )
  151.   (if (= (substr STR 1 1) "1")
  152.       (+ (expt 2 (- (strlen STR) 1))
  153.          (BIN->DEG (substr STR 2))
  154.       )
  155.       (BIN->DEG (substr STR 2))
  156.   )
  157.     )
  158. )

转自:http://zml84.blog.sohu.com/100535521.html

该贴已经同步到 cumtjh的微博

本帖被以下淘专辑推荐:

发表于 2011-6-16 22:16:05 | 显示全部楼层
水平太高了.....
发表于 2011-6-16 22:44:17 | 显示全部楼层
    AutoCAD虽然没有提供加密、解密AutoLISP的工具软件,但其本身却可以接收两种格式的LISP文件。
学习了
发表于 2011-12-31 15:46:41 | 显示全部楼层
太厉害了 学习了
发表于 2012-12-27 11:44:25 | 显示全部楼层
学习了!
发表于 2012-12-27 15:47:06 | 显示全部楼层
看不懂,不会用
用不了
发表于 2012-12-28 13:06:12 | 显示全部楼层
本帖最后由 ALXY 于 2012-12-28 13:07 编辑

什么用途?如何使用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-6-2 18:00 , Processed in 0.205039 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表