LSP 加密与解密
本帖最后由 yxp 于 2018-5-15 14:02 编辑LISP 加密后的文件仍能被 CAD 正常加载运行,只是源码是乱码
LISP 加密属于一种过时的技术,此处贴出源码仅为爱好者学习
LISP 加密与解密算法来自 小东空间:w15994259099 的 c 语言代码,感谢他的共享精神,转载请注明出处
lisp 源码下载:
;;LISP 加密与解密by yxp 2018/05/14转载请保留出处
;;LISP 加密与解密算法来自 小东空间:w15994259099 的 c 语言代码
;;原文出自 http://bbs.xdcad.net/thread-703918-1-1.html
;;算法解读:
;;第一行必须是 "AutoCAD PROTECTED LISP file\0x0D\0x0A\0x1A"
;;第一行共计27个字符,0D 0A 代表回车换行,1A 代表文件结束,第 31 个字节为密钥 B
;;加密的算法是将原文 A 与密钥 B 进行逻辑异或运算,得到密文 C,即 (boole 6 A B)=C
;;解密的时候再用密文 C 与密钥 B 逻辑异或得到原文 A,即 (boole 6 C B)=A
;;值得注意的是,密钥 B 每使用一次就会更新一次,更新的方法是 密文左移 1 位
;;如果 B 超出单字节,溢出的位补到末尾 10011001 -> 100110010 -> 00110011
;;加密头文件
(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))
;; LISP 文件解密
(defun c:UnpassLsp( / bin LSP old new PasW fm ss a)
(setq a (getfiled "LSP解密 - 打开文件" (if LspPfn LspPfn "") "lsp" 0))
(if a (progn
(setq LspPfn a
LSP (read_Bin LspPfn) n 0)
(repeat 30 (setq bin (cons (car LSP) bin) LSP (cdr LSP)))
(setq PasW (car LSP) LSP (cdr LSP)) ;;读出密码
(if (and (equal bin *head*)PasW)(progn
(setq bin nil)
(while (and (setq old (car LSP))(/= 26 old))
(if (/= old 13)
(setq new (Boole 6 PasW old)
new (if (or (= new 13)(= new 26)) old new)
bin (if (= new 10)(cons 13 bin) bin)
bin (cons new bin)
PasW (lsh old 1)
PasW (if (> PasW 255)(- PasW 255) PasW)
)
)(setq LSP (cdr LSP))
)
(setq ss (vl-string-right-trim "_jiami" (vl-filename-base LspPfn))
fm (strcat (vl-filename-directory LspPfn) "\\"
ss "_jiemi" (vl-filename-extension LspPfn)))
(write_Bin (reverse bin) fm)
(princ "\n解密文件已保存:")(princ fm)
)(princ "\n不能解密未加密的文件")
)
))
(princ)
)
;; LISP 文件加密
(defun c:passLsp( / bin LSP old new PasW fm ss jc a)
(setq a (getfiled "LSP加密 - 打开文件" (if LspPfn LspPfn "") "lsp" 0))
(if a (progn
(setq LspPfn a
PasW (ascii "A") ;;密码
bin (cons PasW *head*)
LSP (read_Bin LspPfn)
jc LSP)
(repeat 30 (setq ss (cons (car jc)ss) jc (cdr jc)))
(if (equal (list (car ss)(cadr ss)(caddr ss)) '(26 10 13))
(princ "\n不能加密已加密过的文件")
(progn
(while (and (setq old (car LSP))(/= 26 old))
(if (/= old 13)
(setq new (Boole 6 PasW old)
new (if (or (= new 13)(= new 26)) old new)
bin (if (= new 10)(cons 13 bin) bin)
bin (cons new bin)
PasW (lsh new 1)
PasW (if (> PasW 255)(- PasW 255) PasW)
)
)(setq LSP (cdr LSP))
)
(setq fm (strcat (vl-filename-directory LspPfn) "\\"
(vl-filename-base LspPfn) "_jiami" (vl-filename-extension LspPfn)))
(write_Bin (reverse bin) fm)
(princ "\n加密文件已保存:")(princ fm)
))
))
(princ)
)
//lsp文件加密文件的解密:
bool unProtected_Lisp_1()
{undefined
char fin;
char fou;
// 选择的文件名称
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 这个加密没问题的,也是cad内部文件的一ge保护模式,故必须有第一句,加密后的把那一句去掉也不行了
算半公开的,以前有人专门写过论文
以前黄明儒在晓东发过一个老外的,但不全,这个是根据那个写的 本帖最后由 luqzcm 于 2018-5-17 19:45 编辑
出现提示:; 错误: 此类型的 LISP 值不能强制转换成 VARIANT:11130
好像是这个语句的问题:(vlax-safearray-fill vbin Blist)
没找的原因
CAD2014
好贴,支持! 你这是不是和猫老师那类同
加密后运行时间大大增加啊 厉害,高手呀!!! 提示:; 错误: 此类型的 LISP 值不能强制转换成 VARIANT:-9623 不知道什么问题. 谢谢 研究研究新手先保存下来 不明觉厉 好东西哇,非常感谢 11111111111111111111111111111