65.9K
CodeProject 正在变化。 阅读更多。
Home

数据加密 V2.0

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (2投票s)

2019年10月17日

CPOL

4分钟阅读

viewsIcon

5956

downloadIcon

316

数据加密 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.cppAjustFileName.h

示例 4: 一些颜色

ENIGMA 程序中有 3 个彩色对象:一个文本、一个按钮和一个单选按钮。它们是 3 个类

文本
  • 文件: ColorStatic.cppColorStatic.h
  • 用法:在 Object m_text 上声明
  • 然后:m_text.SubclassDlgItem(IDC_STATIC, this);
  • 然后:m_text.SetTextColor(RED);
Button
  • 文件: Mybutton.cppMybutton.h
  • 用法:声明一个 Object m_chk
  • 然后:m_chk.SubclassDlgItem (IDOK, this);
  • 然后:m_chk.SetTextColor (RED) ;
单选按钮
  • 文件: ColorRadiobutton.cppColorRadiobutton.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.cppC_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 日:初始版本
© . All rights reserved.