数据加密 V2.0






4.20/5 (2投票s)
数据加密 V2.0
引言
数据加密是一个敏感问题。它一直是各种出版物中众多文章的主题。这里介绍的程序基于原生 Windows API。它使用 Visual Studio 2019 和 C++ 开发。
原理
数据加密使用 "CALG_RC4" 类型的编码。我围绕这个原则开发了一个不同的接口。拥有更大的灵活性总是很有趣的。拖放的支持者和 `SendTo` 的支持者都会发现他们想要的东西,我们不会忘记 GUI 和命令文件。它可以加密/解密任何文件类型。输出文件与输入文件位于同一位置。每当讨论数据加密的密码问题时,我做出一个选择,密码是在程序生成过程中动态包含的。它位于一个 <key.huff> 文件中(查看空间资源问题)。它以资源形式呈现。此文件使用霍夫曼方法编码。
编码阶段 | 解码阶段 |
输入: 文件.<扩展名> | 输入: 文件.<扩展名>.yltr |
输出: 输入.<扩展名>.yltr | 输出: 文件.<扩展名> |
加密/解密时间取决于几个因素
- 文件的大小
- CPU 的性能
- 您的 PC 上可用的 RAM
不同的界面
为了更灵活地使用该程序,我特意设计了几个用户界面
- GUI 界面
- 命令文件
SendTo
- 拖放(在
DialogBox
上) - 拖放(在图标上)
- 文件关联 « .yltr »
GUI 界面
通过双击图形界面中的图标启动程序。它很简单。根据用户对文本启动按钮的选择而变化。
默认情况下,编码
或者
有两种选择,颜色和文本随用户的选择而变化。
命令文件
从一个简单的 "命令提示符",该程序可以启动。
- 加密: <路径>AES.exe <路径>用于加密的文件.扩展名
- 解码: <路径>AES.exe <路径>要解码的文件.扩展名.yltr
SendTo
该程序会自动在用户空间("SendTo
" 空间)中创建一个快捷方式。我们将一个或多个文件发送到该快捷方式。
拖放(在 DialogBox 上)
在 GUI 模式下启动程序后,该程序将接受多个文件。
文件关联
在安装阶段自动添加 « .yltr ».“ 扩展名。
示例代码
整个程序是用 C ++ 和 MFC Microsoft 编写的,大量使用了动态构建的类和对象。在此演示中呈现所有代码是很困难的,并且会使它变得枯燥。这不是这篇文章的目的。
示例 1: 在用户空间中动态创建 "SendTo
" 图标。
Send_::SendTO()
{
Charge_Constante();
Chemin_complet = Current_Dir() + Back_slash ;
Nom_exécutable_complet = Chemin_complet + AfxGetAppName() +
Extention nom_du_Racoourcis = Nom_app;
nom_sortie_complet = Sepcial_Folder(CSIDL_SENDTO) +
Back_slash + AfxGetAppName() + Ext_lnk;
CreateShortCut(Nom_exécutable_complet, nom_du_Racoourcis,
nom_sortie_complet, Chemin_complet, Chemin_complet);
}
示例 2: 分析传递给程序的参数
BOOL Analyse_back_groung::Run(LPTSTR *pt_chaine, int Count)
{
if (Count == 1) return (FALSE);
for (int i = 1; i < Count; i++)
{
Liste_fichier.add(pt_chaine[i]);
}
for (int i = 0; i < liste_fichier.GetSize(); i++)
{
Traitement_fichier(liste_fichier.GetAt(i));
}
Liste_fichier.RemoveAll();
return (TRUE);
}
示例 3: 调整文件名
该程序仅请求输入文件的名称,它自己计算输出文件的名称。以下是在编码阶段的方法
- 文件输入:file.txt 如果输出文件不存在,则输出文件将是:file.yltr
- 文件输入:file.txt 如果输出文件存在 (file.yltr),则输出文件将是:File (1).yltr
- 文件输入:file.txt 如果输出文件存在 (file (1).yltr),则输出文件将是:File (2).yltr
- 等等
类 <AjustFileName>
文件: AjustFileName.cpp 和 AjustFileName.h
示例 4: 一些颜色
ENIGMA 程序中有 3 个彩色对象:一个文本、一个按钮和一个单选按钮。它们是 3 个类
文本
- 文件: ColorStatic.cpp 和 ColorStatic.h
- 用法:在
Object m_text
上声明 - 然后:
m_text.SubclassDlgItem(IDC_STATIC, this);
- 然后:
m_text.SetTextColor(RED);
Button
- 文件: Mybutton.cpp 和 Mybutton.h
- 用法:声明一个
Object m_chk
- 然后:
m_chk.SubclassDlgItem (IDOK, this);
- 然后:
m_chk.SetTextColor (RED) ;
单选按钮
- 文件: ColorRadiobutton.cpp 和 ColorRadiobutton.cpp
- 用法:声明一个
Object m_radio_0
- 然后:
m_radio_0.SubclassDlgItem (IDC_RADIO1, this);
- 然后:
m_radio_0.SetTextColor (RED);
- 然后:
m_radio_0.SetCheck (true);
示例 5: 从编码的资源中提取数据
文件: C_Ressource.cpp 和 C_Ressource.h
Get_Ressource_huff(char * result, int ID)
{
DWORD dwSize = 0;
int lg = 0;
HESRULT hRes = FindResource (NULL, MAKEINTRESOURCE(ID), RT_RCDATA); // RT_RCDATA
if (hRes != NULL)
{
dwSize = SizeofResource(NULL, hRes);
HGLOBAL MemoryHandle = LoadResource(NULL, hRes);
if (MemoryHandle != NULL)
{
char* resText = (char *) LockResource(MemoryHandle);
char* text = (char*)malloc(dwSize + 1);
if (text != NULL) { memcpy(text, resText, dwSize);}
text[dwSize] = 0;
simple_Huffman *pt_huff = new simple_Huffman;
lg = pt_huff->Decompress((BYTE *)text, dwSize);
memcpy(result, pt_huff->getOutput(), lg);
pt_huff->Finalize();
delete pt_huff;
FreeResource(MemoryHandle);
free (text);
}
FreeResource((HANDLE)hRes);
}
return (lg);
}
链接器选项
链接器指令用于将 ".text" 部分与 ".rcdata" 部分合并,而无需修改源代码,只需添加此选项链接器。
#pragma comment(linker,"/merge:.rdata=.text")
之前(发布)
之后(发布)
结论
使用这个新版本,密码存储在可执行文件中,但它被霍夫曼方法压缩。我只是向您展示您可以添加到程序中,在这种情况下,是一个具有更友好的用户界面的加密程序。
历史
- 2019 年 10 月 16 日:初始版本