明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8987|回复: 25

[讨论] LSP 加密与解密

  [复制链接]
发表于 2018-5-15 13:38:14 | 显示全部楼层 |阅读模式
本帖最后由 yxp 于 2018-5-15 14:02 编辑

LISP 加密后的文件仍能被 CAD 正常加载运行,只是源码是乱码
LISP 加密属于一种过时的技术,此处贴出源码仅为爱好者学习
LISP 加密与解密算法来自 小东空间:w15994259099 的 c 语言代码,感谢他的共享精神,转载请注明出处
lisp 源码下载:
  1. ;;LISP 加密与解密  by yxp 2018/05/14  转载请保留出处
  2. ;;LISP 加密与解密算法来自 小东空间:w15994259099 的 c 语言代码
  3. ;;原文出自 http://bbs.xdcad.net/thread-703918-1-1.html
  4. ;;算法解读:
  5. ;;第一行必须是 "AutoCAD PROTECTED LISP file\0x0D\0x0A\0x1A"
  6. ;;第一行共计27个字符,0D 0A 代表回车换行,1A 代表文件结束,第 31 个字节为密钥 B
  7. ;;加密的算法是将原文 A 与密钥 B 进行逻辑异或运算,得到密文 C,即 (boole 6 A B)=C
  8. ;;解密的时候再用密文 C 与密钥 B 逻辑异或得到原文 A,即 (boole 6 C B)=A
  9. ;;值得注意的是,密钥 B 每使用一次就会更新一次,更新的方法是 密文左移 1 位
  10. ;;如果 B 超出单字节,溢出的位补到末尾 10011001 -> 100110010 -> 00110011


  11. ;;加密头文件
  12. (setq *head* '(26 10 13 101 108 105 102 32 80 83 73 76 32 68 69 84 67 69 84 79 82 80 32 68 65 67 111 116 117 65))


  13. ;; LISP 文件解密
  14. (defun c:UnpassLsp( / bin LSP old new PasW fm ss a)
  15. (setq a (getfiled "LSP解密 - 打开文件" (if LspPfn LspPfn "") "lsp" 0))
  16. (if a (progn
  17.   (setq LspPfn a
  18.     LSP (read_Bin LspPfn) n 0)
  19.   (repeat 30 (setq bin (cons (car LSP) bin) LSP (cdr LSP)))
  20.   (setq PasW (car LSP) LSP (cdr LSP)) ;;读出密码
  21.   (if (and (equal bin *head*)PasW)(progn
  22.     (setq bin nil)
  23.     (while (and (setq old (car LSP))(/= 26 old))
  24.       (if (/= old 13)
  25.         (setq new (Boole 6 PasW old)
  26.           new (if (or (= new 13)(= new 26)) old new)
  27.           bin (if (= new 10)(cons 13 bin) bin)
  28.           bin (cons new bin)
  29.           PasW (lsh old 1)
  30.           PasW (if (> PasW 255)(- PasW 255) PasW)
  31.         )
  32.       )(setq LSP (cdr LSP))
  33.     )
  34.     (setq ss (vl-string-right-trim "_jiami" (vl-filename-base LspPfn))
  35.       fm (strcat (vl-filename-directory LspPfn) "\\"
  36.       ss "_jiemi" (vl-filename-extension LspPfn)))
  37.     (write_Bin (reverse bin) fm)
  38.     (princ "\n解密文件已保存:")(princ fm)
  39.   )(princ "\n不能解密未加密的文件")
  40.   )
  41. ))
  42. (princ)
  43. )


  44. ;; LISP 文件加密
  45. (defun c:passLsp( / bin LSP old new PasW fm ss jc a)
  46. (setq a (getfiled "LSP加密 - 打开文件" (if LspPfn LspPfn "") "lsp" 0))
  47. (if a (progn
  48.   (setq LspPfn a
  49.     PasW (ascii "A") ;;密码
  50.     bin (cons PasW *head*)
  51.     LSP (read_Bin LspPfn)
  52.     jc LSP)
  53.   (repeat 30 (setq ss (cons (car jc)ss) jc (cdr jc)))
  54.   (if (equal (list (car ss)(cadr ss)(caddr ss)) '(26 10 13))
  55.     (princ "\n不能加密已加密过的文件")
  56.     (progn
  57.     (while (and (setq old (car LSP))(/= 26 old))
  58.       (if (/= old 13)
  59.         (setq new (Boole 6 PasW old)
  60.           new (if (or (= new 13)(= new 26)) old new)
  61.           bin (if (= new 10)(cons 13 bin) bin)
  62.           bin (cons new bin)
  63.           PasW (lsh new 1)
  64.           PasW (if (> PasW 255)(- PasW 255) PasW)
  65.         )
  66.       )(setq LSP (cdr LSP))
  67.     )
  68.     (setq fm (strcat (vl-filename-directory LspPfn) "\\"
  69.       (vl-filename-base LspPfn) "_jiami" (vl-filename-extension LspPfn)))
  70.     (write_Bin (reverse bin) fm)
  71.     (princ "\n加密文件已保存:")(princ fm)
  72.   ))
  73. ))
  74. (princ)
  75. )

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-2-11 09:39:43 | 显示全部楼层
//lsp文件加密文件的解密:

bool unProtected_Lisp_1()

{undefined

char fin[1000];

char fou[1000];

// 选择的文件名称

CString lv_strFileName = _T("");

// 设置文件过滤格式

CString lv_strFilterLSP = _T("lsp文件(*.lsp)|*.lsp|");

CString lv_strFileFilter = lv_strFilterLSP;

// 设置文件后缀名称

CString lv_strName[] = {"", "lsp",""};

CString lv_strExtension = _T("");

CString m_strFilePathName;

CString m_strFileName;

CString m_strExtName;

// 打开保存文件对话框

CFileDialog lv_FileOpenDlg(FALSE, NULL, NULL, OFN_HIDEREADONLY, lv_strFileFilter);

lv_FileOpenDlg.m_ofn.lpstrTitle   =   "【LISP文件解密】 选择已加密的LISP文件:";

if (IDOK != lv_FileOpenDlg.DoModal())

{undefined

return false;

}

else

{undefined

//  CString CFileDialog::GetPathName :得到完整文件名,包括目录名和扩展名如:c:/test/test1.txt

//  CString CFileDialog::GetFileName :得到完整文件名,包括扩展名如:test1.txt

//  CString CFileDialog::GetFileExt  :得到完整文件扩展名,如:txt

//  CString CFileDialog::GetFileTitle:得到完整文件名,不包括目录名和扩展名如:test1

m_strFilePathName = lv_FileOpenDlg.GetPathName();

m_strFileName = lv_FileOpenDlg.GetFileName();

m_strExtName = lv_FileOpenDlg.GetFileExt();

strcpy(fin,((LPSTR&)m_strFilePathName));

CString m_strOutFilePathName=m_strFilePathName.Left(m_strFilePathName.GetLength()-4);

m_strOutFilePathName.Replace("_pro","");

m_strOutFilePathName+="_res.lsp";

strcpy(fou,((LPSTR&)m_strOutFilePathName));

}

//

FILE *in_file,*out_file;

//register char zf1,zf2;

in_file=fopen(fin,"rb");

if(in_file==NULL)

{undefined

AfxMessageBox("\n不能打开LISP已加密的源文件!");

return false;

}

CString strINdex;

fgets((LPSTR&)strINdex, 28, in_file);

if(strINdex.Find("PROTECTED LISP")==-1)

{undefined

fclose(in_file);

AfxMessageBox("\nLISP文件没有加密,不用解密!");

return false;

}

out_file=fopen(fou,"wb");

if(out_file==NULL)

{undefined

fclose(in_file);

AfxMessageBox("\n不能建立LISP解密文件!");

return false;

}

//30:1Bytes,存储密码字符,如'A'

//fputc('A',out_file);

unsigned char pass_ch;

long strPass=30;

fseek(in_file,strPass,SEEK_SET);

pass_ch=fgetc(in_file);

//fputs(";;AutoCAD unPROTECTED LISP file",out_file);//27个

//fputs("\0x0D\0x0A",out_file);

//putc(0x0A,out_file);//27个 0x0A

//printf("strPass=%s\n",pass_ch);

//CString strFormat;

//strFormat.Format("strPass=%d\n",pass_ch);

//AfxMessageBox(strFormat);

int nIndex=0;

unsigned char old_ch;

unsigned char new_ch;

unsigned int i;

fseek(in_file,31,SEEK_SET);

while (! feof (in_file))

{undefined

old_ch=fgetc(in_file);

//文件结束中断循环

if (old_ch == 0x1A) //0x1A 文件结束

{undefined

break;

}

//若为回车继续循环

if (old_ch == 0x0D) //0x0D 回车

continue;

//异或运算

new_ch = pass_ch ^ old_ch;

//用上一密码字符

if ((new_ch == 0x0D)||(new_ch == 0x1A)) //是 回车 或 文件结束

new_ch=old_ch;

//若为换行,则加回车

if (new_ch == 0x0A) //0x0A 换行

putc (0x0D,out_file); //0x0D 回车

//写入已加密字符

putc(new_ch,out_file);

//左移一位,相当于乘2

i=old_ch; //注意:这里与加密不同!!!

i = i<<1;

//溢出位1,加到末位

if (i>255)

i=i-255;

//产生新的密码字符

pass_ch = (unsigned char) i;

}

fclose (in_file);

//putc(0x1A,out_file);

fclose (out_file);

return true;

}
————————————————
版权声明:本文为CSDN博主「weixin_39902608」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39902608/article/details/111764004
发表于 2020-11-13 21:32:29 | 显示全部楼层
这个加密没问题的,也是cad内部文件的一ge保护模式,故必须有第一句,加密后的把那一句去掉也不行了

算半公开的,以前有人专门写过论文

以前黄明儒在晓东发过一个老外的,但不全,这个是根据那个写的
发表于 2018-5-16 20:50:20 | 显示全部楼层
本帖最后由 luqzcm 于 2018-5-17 19:45 编辑

出现提示:; 错误: 此类型的 LISP 值不能强制转换成 VARIANT:  11130

好像是这个语句的问题:(vlax-safearray-fill vbin Blist)

没找的原因
CAD2014

点评

yxp
你是哪个版本的CAD?  发表于 2018-5-17 00:43
发表于 2018-5-15 16:36:01 | 显示全部楼层
你这是不是和猫老师那类同
加密后运行时间大大增加啊
发表于 2018-5-15 16:45:15 | 显示全部楼层
厉害,高手呀!!!
发表于 2018-5-16 09:23:45 | 显示全部楼层
提示:; 错误: 此类型的 LISP 值不能强制转换成 VARIANT:  -9623 不知道什么问题.

点评

yxp
2010以上CAD运行都没问题啊  发表于 2018-5-17 00:44
发表于 2018-5-16 11:59:21 | 显示全部楼层
谢谢 研究研究  新手  先保存下来
发表于 2018-5-16 13:23:21 | 显示全部楼层
不明觉厉               
发表于 2018-5-16 15:55:35 | 显示全部楼层
好东西哇,非常感谢
发表于 2018-5-17 08:40:18 | 显示全部楼层
11111111111111111111111111111
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 02:08 , Processed in 0.271760 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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