- UID
- 765036
- 积分
- 483
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2016-11-25
- 最后登录
- 1970-1-1
|
发表于 2018-5-10 21:48:47
|
显示全部楼层
//1 lsp文件加密:可以在cad中运行,但不可读
bool Protected_Lisp_1()
{
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())
{
return false;
}
else
{
// 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("_res","");
m_strOutFilePathName+="_pro.lsp";
strcpy(fou,((LPSTR&)m_strOutFilePathName));
}
//
FILE *in_file,*out_file;
//register char zf1,zf2;
in_file=fopen(fin,"rb");
if(in_file==NULL)
{
//printf("can not open file %s\n",fin);
AfxMessageBox("\n不能打开LISP源文件!");
return false;
}
CString strINdex;
fgets((LPSTR&)strINdex, 28, in_file);
if(strINdex.Find("PROTECTED LISP")!=-1)
{
fclose(in_file);
AfxMessageBox("\nLISP文件已经加密,不能再加密!");
return false;
}
out_file=fopen(fou,"wb");
if(out_file==NULL)
{
//printf("can not open file %s\n",fou);
fclose(in_file);
//exit(1);
AfxMessageBox("\n不能建立加密文件!");
return false;
}
//
//0~29:30Bytes,存储加密文件的标识字符串等 "AutoCAD PROTECTED LISP file\0x0D\0x0A\0x1A"
fputs("AutoCAD PROTECTED LISP file",out_file);//27个 \0x0D\0x0A\0x1A
fputc(0x0D,out_file);
fputc(0x0A,out_file);
fputc(0x1A,out_file);//共30个
//30:1Bytes,存储密码字符,如'A'
fputc(0x41,out_file);
unsigned char pass_ch=0x41;
unsigned char old_ch;
unsigned char new_ch;
unsigned int i;
fseek(in_file,0,SEEK_SET);
while (! feof (in_file))
{
old_ch=fgetc(in_file);
//文件结束中断循环
if (old_ch == 0x1A) //0x1A 文件结束
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=new_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;
} |
评分
-
查看全部评分
|