明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2854|回复: 7

[源码] 自己定义的二进制表,并且用它来实现DES加密算法

  [复制链接]
发表于 2013-12-4 23:18:44 | 显示全部楼层 |阅读模式
本帖最后由 ggdlove 于 2013-12-30 23:44 编辑

在AutoLISP中没有发现二进制数的表示,论坛里面也没有发现相关的计算函数。

二进制数在AutoLISP中怎么表示和运算呢?
这里提供了十进制数与二进制表相互转换的函数。肯定不是最好的,但是抛砖引玉,看能不能引出一些二进制的计算函数。

PS:DES加密算法及相关测试,请移步5楼。

二进制表的定义
第一位为符号位(正为0,负为1),后面的为数值位。
比如:
(0 1)               -->         1
(0 1 0)            -->         2
(0 1 1)            -->         3
(0 1 0 0)        -->          4
..............以此类推   

(1 1)               -->         -1
(1 1 0)            -->         -2
(1 1 1)            -->         -3
(1 1 0 0)        -->          -4   
..............以此类推   

不知道这样定义怎么样?能不能完成一般的二进制运算函数。

以下是转换函数:
入门级水平,请多多指正!

十进制转二进制表函数
  1. ;;将十进制数转换成二进制表,二进制第一位为符号位
  2. (defun DecToBin(dec / bin symb)
  3.   (and
  4.     ;;检验dec是否为整数,不为整数时提示错误
  5.     (itoa dec)
  6.     ;;若dec为整数,求其符号,正为0,负为1
  7.     (if (= dec (setq dec (abs dec)))
  8.       (setq symb 0)
  9.       (setq symb 1)
  10.       )
  11.     ;;求dec的绝对值的二进制表
  12.     (if (= dec 0)
  13.       ;;当dec的绝对值为0时,直接返回'(0)
  14.       (setq bin '(0))
  15.       ;;当dec的绝对值不为0时,转换为二进制表
  16.       (while (> dec 0)
  17.   (setq bin (cons (rem dec 2) bin))
  18.   (setq dec (fix (/ dec 2)))
  19.   )
  20.       )
  21.     ;;将符号位加入到二进制数中
  22.     (setq bin (cons symb bin))
  23.     )
  24.   bin
  25.   )
二进制表转十进制函数
  1. ;;将二进制表转换成十进制数,二进制第一位为符号位
  2. (defun BinToDec(bin / dec symb gp_error_bak *error*)
  3.   ;;定义局部错误处理函数
  4.   (defun *error*(msg)
  5.     (princ "\n; 错误: 参数类型错误: bin: ")(princ bin)
  6.     (princ)
  7.     )
  8.   ;;输入参数检查,若不对,则制造错误,交给局部错误处理函数
  9.   (if (or
  10.   ;;若bin不为表则出错,若为表且长度大于等于2时,返回nil,否则返回T
  11.   (< (length bin) 2)
  12.   ;;经检查,bin为一个表。若bin中元素有非整数则出错,全部为整数时返回nil,否则返回T
  13.   (not (mapcar 'itoa bin))
  14.   ;;经检查,bin中全部为整数。若bin中全部在[0,1]范围内返回nil,有不在[0,1]范围内的元素返回T
  15.   (apply 'or (mapcar '(lambda(x) (or (> x 1) (< x 0))) bin))
  16.   )
  17.     ;;若判别式没出错,但返回T了,则代表格式不正确,则在这里制造错误
  18.     (itoa nil)
  19.     )
  20.   
  21.   ;;取出bin中的符号位
  22.   (if (= (car bin) 0)
  23.     (setq symb 1)
  24.     (setq symb -1)
  25.     )
  26.   
  27.   ;;去掉bin中的符号位,取出数值位
  28.   (setq bin (cdr bin))
  29.   ;;将bin中的数值位转化为十进制
  30.   (if (> (length bin) 1)
  31.     ;;当bin的数值位长度大于1的时候,进行二进制->十进制转换
  32.     (progn
  33.       (setq dec 0)
  34.       (while bin
  35.   ;;当bin的元素数量为1时,可能出现(expt 0 0)的情况,出错
  36.   (if (> (length bin) 1)
  37.     (setq dec (+ dec (expt (* (car bin) 2) (1- (length bin)))))
  38.     ;;当bin的元素数量为1时,避免出现(expt 0 0)的情况
  39.     (setq dec (+ dec (car bin)))
  40.     )
  41.   ;;去掉最高位
  42.   (setq bin (cdr bin))
  43.   )
  44.       )
  45.     ;;当bin的数值位长度为1的时候,直接将该位赋给dec
  46.     (setq dec (car bin))
  47.     )
  48.   ;;将符号位加入到dec中
  49.   (* symb dec)
  50.   )

评分

参与人数 1明经币 +2 收起 理由
Gu_xl + 2 赞一个!

查看全部评分

 楼主| 发表于 2013-12-17 00:28:19 | 显示全部楼层
本帖最后由 ggdlove 于 2013-12-17 00:31 编辑

利用上述的定义呢,就可以完成下面两个程序。

1)二进制表的按位异或
  1. ;;按位异或************************************************************************
  2. ;;位数不够时,若mode为1,则补1,不为1则补0
  3. (defun BIN_XOR(bin1 bin2 mode / bin *error*)
  4.   ;;定义局部错误处理函数
  5.   (defun *error*(msg)
  6.     (princ "\n; 错误: 参数类型错误: bin: ")(princ bin)
  7.     (princ)
  8.     )
  9.   ;;输入值检验
  10.   (or (and (= (type bin1) 'LIST);;类型为表
  11.      (>= (length bin1) 1);;元素数量大于等于1
  12.      (apply 'and (mapcar '(lambda(x) (= (type x) 'INT)) bin1));;所有元素必须为整数
  13.      (apply 'and (mapcar '(lambda(x) (and (>= x 0) (<= x 1))) bin1));;所有元素必须在[0,1]区间内
  14.      )
  15.       (progn
  16.   (setq bin bin1)
  17.   (exit)
  18.   )
  19.       )
  20.   (or (and (= (type bin2) 'LIST);;类型为表
  21.      (>= (length bin2) 1);;元素数量大于等于1
  22.      (apply 'and (mapcar '(lambda(x) (= (type x) 'INT)) bin2));;所有元素必须为整数
  23.      (apply 'and (mapcar '(lambda(x) (and (>= x 0) (<= x 1))) bin2));;所有元素必须在[0,1]区间内
  24.      )
  25.       (progn
  26.   (setq bin bin2)
  27.   (exit)
  28.   )
  29.       )
  30.   ;;读取补位模式
  31.   (if (= mode 1)
  32.     (setq mode 1)
  33.     (setq mode 0)
  34.     )
  35.   ;;位数不对的补齐
  36.   (while (/= (length bin1) (length bin2))
  37.     (if (< (length bin1) (length bin2))
  38.       (setq bin1 (cons mode bin1))
  39.       (setq bin2 (cons mode bin2))
  40.       )
  41.     )
  42.   ;;按位异或运算
  43.   (mapcar '(lambda(x y)
  44.        (if (/= x y)
  45.          1
  46.          0
  47.          )
  48.        )
  49.     bin1
  50.     bin2
  51.     )
  52.   )
2)二进制表的按位循环移动
  1. ;;按位循环移动,当移动位数为正时表示左循环移,为负时表示右循环移*******************************
  2. (defun BIN_RMOVE(bin dir / err *error*)
  3.   ;;定义局部错误处理函数
  4.   (defun *error*(msg)
  5.     (if err
  6.       (progn
  7.   (princ "\n; 错误: 参数类型错误: fixnump: ")
  8.   (princ dir)
  9.   )
  10.       (progn
  11.   (princ "\n; 错误: 参数类型错误: bin: ")
  12.   (princ bin)
  13.   )
  14.       )
  15.     (princ)
  16.     )
  17.   ;;输入值检验
  18.   (or (and (= (type bin) 'LIST);;类型为表
  19.      (>= (length bin) 1);;元素数量大于等于1
  20.      (apply 'and (mapcar '(lambda(x) (= (type x) 'INT)) bin));;所有元素必须为整数
  21.      (apply 'and (mapcar '(lambda(x) (and (>= x 0) (<= x 1))) bin));;所有元素必须在[0,1]区间内
  22.      )
  23.       (exit)
  24.       )
  25.   (or (= (type dir) 'INT) (progn (setq err T) (exit)))
  26.   ;;若右移,即dir<0时,则将bin倒置
  27.   (if (< dir 0) (setq bin (reverse bin)))
  28.   ;;向左移动nn位
  29.   (repeat (abs dir)
  30.     (setq bin (append bin (list (car bin))))
  31.     (setq bin (cdr bin))
  32.     )
  33.   ;;若右移,即dir为T,nn<0时,则再次将bin倒置
  34.   (if (< dir 0) (setq bin (reverse bin)))
  35.   ;;返回值
  36.   bin
  37.   )
温馨提示:
这两个程序是不定义符号位的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2013-12-17 13:59:53 | 显示全部楼层
 楼主| 发表于 2013-12-17 15:33:44 | 显示全部楼层
Gu_xl 发表于 2013-12-17 13:59
论坛是个宝库,什么都有!只是你没有用心去找而已!

baseToDecimal 将一个字符串按BASE的做为基数的进制 ...

多谢Gu版指导,还没有去函数宝库看过,惭愧。
 楼主| 发表于 2013-12-30 23:40:59 | 显示全部楼层
利用上面写的几个程序,就可以实现DES加密运算了。

PS:待加密的数据必须是64位二进制表,密钥也必须是64位二进制表。
感谢gu版教导,这回没有在函数库里面找到这个函数了。
若是首发,请适当鼓励一下,嘿嘿。
  1. ;;DES加密函数,mode为1时表示解密模式,mode为其他时表示加密模式
  2. (defun BIN_DES(DATA KEY MODE / bin ii jj tmp *error*
  3.          ;;密钥变换参数
  4.          P-KL P-KR P-KM P-KC
  5.          ;;数据变换参数
  6.          P-DL P-DR P-DE P-DS P-DP P-DF
  7.          ;;数据参数
  8.          KL KR DL DR SUBKEY SUBDATA TMPDR DRR
  9.          )
  10.   ;;定义局部错误处理函数
  11.   (defun *error*(msg)
  12.     (princ "\n; 错误: 参数类型错误: DES: ")(princ bin)
  13.     (princ)
  14.     )
  15.   ;;输入值检验,DATE和KEY必须是64位的二进制表
  16.   (or
  17.     (and (= (type DATA) 'LIST);;类型为表
  18.    (>= (length DATA) 1);;元素数量大于等于1
  19.    (apply 'and (mapcar '(lambda(x) (= (type x) 'INT)) DATA));;所有元素必须为整数
  20.    (apply 'and (mapcar '(lambda(x) (and (>= x 0) (<= x 1))) DATA));;所有元素必须在[0,1]区间内
  21.    (= (length DATA) 64);;长度必须为64位
  22.    )
  23.     (progn
  24.   (setq bin DATA)
  25.   (exit)
  26.   )
  27.       )
  28.   (or
  29.     (and (= (type KEY) 'LIST);;类型为表
  30.    (>= (length KEY) 1);;元素数量大于等于1
  31.    (apply 'and (mapcar '(lambda(x) (= (type x) 'INT)) KEY));;所有元素必须为整数
  32.    (apply 'and (mapcar '(lambda(x) (and (>= x 0) (<= x 1))) KEY));;所有元素必须在[0,1]区间内
  33.    (= (length KEY) 64);;长度必须为64位
  34.    )
  35.     (progn
  36.       (setq bin KEY)
  37.       (exit)
  38.       )
  39.     )

  40.   ;;定义数据变换参数表
  41.   ;;KEY的相关参数
  42.   (setq P-KL '(56 48 40 32 24 16 8
  43.          0 57 49 41 33 25 17
  44.          9 1 58 50 42 34 26
  45.          18 10 2 59 51 43 35
  46.          )
  47.   )  
  48.   (setq P-KR '(62 54 46 38 30 22 14
  49.          6 61 53 45 37 29 21
  50.          13 5 60 52 44 36 28
  51.          20 12 4 27 19 11 3
  52.          )
  53.   )
  54.   (setq P-KM '(1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1))
  55.   (setq P-KC '(13 16 10 23 0 4 2 27
  56.          14 5 20 9 22 18 11 3
  57.          25 7 15 6 26 19 12 1
  58.          40 51 30 36 46 54 29 39
  59.          50 44 32 46 43 48 38 55
  60.          33 52 45 41 49 35 28 31
  61.          )
  62.   )
  63.   ;;DATA的相关参数
  64.   (setq P-DL '(57 49 41 33 25 17 9 1
  65.          59 51 43 35 27 19 11 3
  66.          61 53 45 37 29 21 13 5
  67.          63 55 47 39 31 23 15 7
  68.          )
  69.   )
  70.   (setq P-DR '(56 48 40 32 24 16 8 0
  71.          58 50 42 34 26 18 10 2
  72.          60 52 44 36 28 20 12 4
  73.          62 54 46 38 30 22 14 6
  74.          )
  75.   )
  76.   (setq P-DE '(31 0 1 2 3 4
  77.          3 4 5 6 7 8
  78.          7 8 9 10 11 12
  79.          11 12 13 14 15 16
  80.          15 16 17 18 19 20
  81.          19 20 21 22 23 24
  82.          23 24 25 26 27 28
  83.          27 28 29 30 31 0
  84.          )
  85.   )
  86.   (setq P-DS (list
  87.          ;;S1
  88.          (list
  89.     '(14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7)
  90.     '(0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8)
  91.     '(4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0)
  92.     '(15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13)
  93.     )
  94.          ;;S2
  95.          (list
  96.     '(15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10)
  97.     '(3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5)
  98.     '(0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15)
  99.     '(13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9)
  100.     )
  101.          ;;S3
  102.          (list
  103.     '(10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8)
  104.     '(13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1)
  105.     '(13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7)
  106.     '(1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12)
  107.     )
  108.          ;;S4
  109.          (list
  110.     '(7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15)
  111.     '(13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9)
  112.     '(10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4)
  113.     '(3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14)
  114.     )
  115.          ;;S5
  116.          (list
  117.     '(2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9)
  118.     '(14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6)
  119.     '(4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14)
  120.     '(11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3)
  121.     )
  122.          ;;S6
  123.          (list
  124.     '(12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11)
  125.     '(10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8)
  126.     '(9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6)
  127.     '(4 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13)
  128.     )
  129.          ;;S7
  130.          (list
  131.     '(4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1)
  132.     '(13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6)
  133.     '(1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2)
  134.     '(6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12)
  135.     )
  136.          ;;S8
  137.          (list
  138.     '(13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7)
  139.     '(1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2)
  140.     '(7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8)
  141.     '(2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11)
  142.     )
  143.          )
  144.   )
  145.   (setq P-DP '(15 6 19 20 28 11 27 16
  146.          0 14 22 25 4 17 30 9
  147.          1 7 23 13 31 26 2 8
  148.          18 12 29 5 21 10 3 24
  149.          )
  150.   )
  151.   (setq P-DF '(39 7 47 15 55 23 63 31
  152.          38 6 46 14 54 22 62 30
  153.          37 5 45 13 53 21 61 29
  154.          36 4 44 12 52 20 60 28
  155.          35 3 43 11 51 19 59 27
  156.          34 2 42 10 50 18 58 26
  157.          33 1 41 9 49 17 57 25
  158.          32 0 40 8 48 16 56 24
  159.          )
  160.   )
  161.   ;;子密钥的生成
  162.   (setq KL (mapcar '(lambda(x)
  163.           (nth x KEY)
  164.           )
  165.        P-KL
  166.        )
  167.   )
  168.   (setq KR (mapcar '(lambda(x)
  169.           (nth x KEY)
  170.           )
  171.        P-KR
  172.        )
  173.   )
  174.   (setq ii 0)
  175.   (while (< ii 16)
  176.     ;;向左移动
  177.     (setq KL (BIN_RMOVE KL (nth ii P-KM)))
  178.     (setq KR (BIN_RMOVE KR (nth ii P-KM)))
  179.     ;;选排列
  180.     (setq tmp (mapcar '(lambda(x)
  181.        (nth x (append KL KR))
  182.        )
  183.           P-KC
  184.           )
  185.     )
  186.     ;;装入SUBKEY
  187.     (setq SUBKEY (cons tmp SUBKEY))
  188.     (setq ii (1+ ii))
  189.     )
  190.   ;;根据MODE确定SUBKEY的使用顺序
  191.   (and (/= MODE 1)
  192.        (setq SUBKEY (reverse SUBKEY))
  193.        )

  194.   ;;数据计算
  195.   (setq DL (mapcar '(lambda(x)
  196.           (nth x DATA)
  197.           )
  198.        P-DL
  199.        )
  200.   )
  201.   (setq DR (mapcar '(lambda(x)
  202.           (nth x DATA)
  203.           )
  204.        P-DR
  205.        )
  206.   )
  207.   (setq ii 0)
  208.   (while (< ii 16)
  209.     ;;将DR赋给DRR进行F运算
  210.     (setq DRR DR)
  211.     ;;DRR的扩展
  212.     (setq DRR (mapcar '(lambda(x)
  213.       (nth x DRR)
  214.       )
  215.          P-DE
  216.          )
  217.     )
  218.     ;;DRR与SUBKEY求异或
  219.     (setq DRR (BIN_XOR DRR (nth ii SUBKEY) 0))
  220.     ;;S盒变换
  221.     ;;将DRR分成8等分
  222.     (setq jj 0)
  223.     (setq TMPDR DRR)
  224.     (setq DRR nil)
  225.     (while (< jj 8)
  226.       (setq SUBDR nil)
  227.       (repeat 6
  228.   (setq SUBDR (cons (car TMPDR) SUBDR))
  229.   (setq TMPDR (cdr TMPDR))
  230.   )
  231.       (setq DRR (cons SUBDR DRR))
  232.       (setq jj (1+ jj))
  233.       )
  234.     (setq DRR (reverse DRR))
  235.     ;;在S盒中选取对应的数值
  236.     (setq DRR (mapcar '(lambda(x y / tmp RR CC)
  237.       ;;求S盒中的行列坐标
  238.       (setq RR (BinToDec (list 0 (nth 0 x) (nth 5 x))))
  239.       (setq CC (BinToDec (list 0 (nth 1 x) (nth 2 x) (nth 4 x) (nth 4 x))))
  240.       ;;取出S盒中对应的行列坐标的值,并转换成二进制
  241.       (setq tmp (DecToBin (nth CC (nth RR y))))
  242.       ;;对最高位进行补0,补足4位
  243.       (while (< (length tmp) 4)
  244.         (setq tmp (cons 0 tmp))
  245.         )
  246.       ;;设置返回值
  247.       tmp
  248.       )
  249.          DRR
  250.          P-DS
  251.          )
  252.     )
  253.     ;;将DRR化成32位二进制表
  254.     (setq DRR (apply 'append DRR))
  255.     ;;DRR的P盒置换
  256.     (setq DRR (mapcar '(lambda(x)
  257.       (nth x DRR)
  258.       )
  259.          P-DP
  260.          )
  261.     )
  262.     ;;DRR与DL异或
  263.     (setq DL (BIN_XOR DRR DL 0))
  264.     ;;将DR与DL交换,第16轮除外
  265.     (and (< ii 15)
  266.    (setq DRR DL)
  267.    (setq DL DR)
  268.    (setq DR DRR)
  269.    )

  270.     (setq ii (1+ ii))
  271.     )
  272.   (setq DATA (append DL DR))
  273.   ;;最后置换
  274.   (setq DATA (mapcar '(lambda(x)
  275.       (nth x DATA)
  276.       )
  277.          P-DF
  278.          )
  279.   )
  280.   ;;返回值
  281.   DATA
  282.   )
下面是测试函数:

这里将字符串转换成ascii码,再转换成二进制表进行加密计算,每个字符的ascii码刚好是0-255范围内即8位。
  1. ;;测试函数
  2. (defun C:TT( / DATA KEY CODE)
  3.   (setq data "abcdefgh")
  4.   (setq key "12345678")
  5.   ;;提示
  6.   (princ "\n输入的数据为:")(princ data)
  7.   (princ "\n输入的密钥为:")(princ key)
  8.   ;;将data和key转换成64位的二进制表
  9.   (setq data (apply 'append (mapcar '(lambda(x)
  10.                (setq x (cdr (DecToBin x)))
  11.                (while (< (length x) 8)
  12.            (setq x (cons 0 x))
  13.            x
  14.            )
  15.                )
  16.             (vl-string->list data)
  17.             )
  18.         )
  19.   )
  20.   (setq key  (apply 'append (mapcar '(lambda(x)
  21.                (setq x (cdr (DecToBin x)))
  22.                (while (< (length x) 8)
  23.            (setq x (cons 0 x))
  24.            x
  25.            )
  26.                )
  27.             (vl-string->list key)
  28.             )
  29.         )
  30.   )
  31.   ;;加密
  32.   (setq CODE (BIN_DES DATA KEY 0))
  33.   ;;解密
  34.   (setq DATA (BIN_DES CODE KEY 1))
  35.   ;;将code和data转换成字符串
  36.   (setq data (vl-list->string data))
  37.   (setq data (list (substr data 1 8) (substr data 9 8) (substr data 17 8) (substr data 25 8)
  38.        (substr data 33 8) (substr data 41 8) (substr data 49 8) (substr data 57 8)))
  39.   (setq data (mapcar 'vl-string->list data))
  40.   (setq data (vl-list->string (mapcar '(lambda(x) (BinToDec (cons 0 x))) data)))

  41.   (setq CODE (vl-list->string CODE))
  42.   (setq CODE (list (substr CODE 1 8) (substr CODE 9 8) (substr CODE 17 8) (substr CODE 25 8)
  43.        (substr CODE 33 8) (substr CODE 41 8) (substr CODE 49 8) (substr CODE 57 8)))
  44.   (setq CODE (mapcar 'vl-string->list CODE))
  45.   (setq CODE (vl-list->string (mapcar '(lambda(x) (BinToDec (cons 0 x))) CODE)))
  46.   
  47.   ;;提示
  48.   (princ "\n加密后的数据为:")(princ CODE)
  49.   (princ "\n解密后的数据为:")(princ DATA)
  50.   (princ)
  51.   )
然后我们来看看执行的结果:

从结果可以看出,数据进行加密,然后再进行解密就还原了。程序是可行的!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2021-6-23 13:24:54 | 显示全部楼层
留个脚印,备用
发表于 2021-6-24 14:13:35 | 显示全部楼层

留个脚印,备用
发表于 2022-12-24 18:19:57 | 显示全部楼层
前生 发表于 2021-6-24 14:13
留个脚印,备用

再留一个脚印
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-24 03:11 , Processed in 0.179313 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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