/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <string.h>
#include <stdio.h>
const int keychar_size = 256, scan_size = 65536;
const char* expandname[] = {".加密文件"};
//生成一个字节的密码的函数,将str指向的length字节内容逐字节按位异或运算
char getKey(const char *str, int length) {
char key = 0x00;//更改这个常数可以“二重加密”,相同图片产生不同密码
while (length-- > 0) {
key ^= *str++;
}
return key;
}
//将长度为strlength的字符串str,用长度为keylength的key加密
void strdenc(char *str, int strlength, const char *key, int keylength) {
int i, j;
if (keylength > 0)
for (i = j = 0; i < strlength; i++, j++) {
if (j >= keylength)j -= keylength;
str[i] ^= key[j];
}
}
//返回keychar_size,让调用dll的外部程序获得size信息
inline DLLIMPORT int getkeycharsize() {
return keychar_size;
}
inline int isenc(const char *filename) {
for (int i = sizeof(expandname) / sizeof(const char*); i > 0; i--) {
if (!stricmp(filename, expandname[i - 1]))return 1;
}
return 0;
}
//从bmp或bin读取key
DLLIMPORT int KeyRead(const char *filename, char *key, int * keylength) {//bmp需要keylength,bin可以随便传值
char*file;
FILE*fp = fopen(filename, "rb");
if (fp) {
file = strrchr(filename, '.');
if (!stricmp(file, ".bin")) {
fread(keylength, 4, 1, fp);
if (*keylength > keychar_size)
*keylength = ((*keylength & 0xff) << 24) + ((*keylength & 0xff00) << 8) + ((*keylength & 0xff0000) >> 8) + ((*keylength & 0xff000000) >> 24);
if (*keylength > keychar_size) {
MessageBox(NULL, "error: key.bin文件格式错误", "错误", MB_OK);
} else if (*keylength) {
fread(key, 1, *keylength, fp);
}
} else if (!stricmp(file, ".bmp")) {
BITMAPFILEHEADER bmpheader;
fread(&bmpheader, 14, 1, fp);
if (bmpheader.bfType == 0x4d42) {//检查文件头
BITMAPINFOHEADER bmpinfo;
fread(&bmpinfo, 40, 1, fp);
//基本确认文件合法,输入密码长
if (bmpinfo.biHeight < *keylength) {
MessageBox(NULL, "error: 密码字节数大于图片高度", "错误", MB_OK);
} else {//执行操作
//分配生成密码的字节数(bmp图像每行按4字节对齐,对齐的字节也生成密码)
int scansize = (((bmpinfo.biBitCount * bmpinfo.biWidth + 7) / 8 + 3) / 4 * 4) * (bmpinfo.biHeight / *keylength);
char scanline[scansize];
//定位
fseek(fp, bmpheader.bfOffBits, SEEK_SET);
//读取和生成密码
for (int i = 0; i < *keylength; i++) {
fread(scanline, 1, scansize, fp);
key[i] = getKey(scanline, scansize);
}
}
} else {
MessageBox(NULL, "error: 无法识别bmp文件文件头", "错误", MB_OK);
}
} else {
MessageBox(NULL, "error: 不能识别该类型文件(只能识别bmp和bin)", "错误", MB_OK);
}
} else {
MessageBox(NULL, "error: 文件未打开", "错误", MB_OK);
}
fclose(fp);
return 0;
}
DLLIMPORT int FileDEnc(const char *filename, const char *key, int keylength) {
char *file;
char sfname[strlen(filename) + 64], scan[scan_size];
int num;
strcpy(sfname, filename);
file = strrchr(sfname, '.');
if (!file || !isenc(file)) {
strcpy(sfname + strlen(sfname), ".加密文件");
} else {
*file = '\0';
}
FILE *ifp = fopen(filename, "rb"), *ofp = fopen(sfname, "wb");
if (ifp) {
while (!feof(ifp)) {
num = fread(scan, 1, scan_size, ifp);
strdenc(scan, num, key, keylength);
fwrite(scan, 1, num, ofp);
}
}else{
MessageBox(NULL, "error: 文件未打开", "错误", MB_OK);
}
fclose(ifp);
fclose(ofp);
return 0;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
switch (fdwReason) {
case DLL_PROCESS_ATTACH: {
break;
}
case DLL_PROCESS_DETACH: {
break;
}
case DLL_THREAD_ATTACH: {
break;
}
case DLL_THREAD_DETACH: {
break;
}
}
/* Return TRUE on success, FALSE on failure */
return TRUE;
}
用按位异或(^)运算实现文件加密的代码,c语言写dll,vb调用dll中的函数
需积分: 0 33 浏览量
更新于2022-12-20
收藏 289KB RAR 举报
在IT领域,安全性和隐私保护是至关重要的,而文件加密是一种常见的保护手段。本文将深入探讨如何使用按位异或(^)运算实现文件加密,并在C语言中编写DLL动态链接库,然后通过VB6(Visual Basic 6)调用这些函数进行文件加密。这种方法巧妙地利用了位操作的特性,使得加密过程既高效又相对简单。
按位异或运算符"^"在编程中是一种二进制运算,它对两个操作数的每一位进行异或操作。如果两个位相同,结果为0;如果不同,结果为1。这个性质使得异或运算是可逆的,即A ^ B = C,那么C ^ B = A,这为文件加密提供了基础。
在C语言中,创建DLL文件的过程如下:
1. 创建一个新的C项目,定义一个函数,如`int encryptFile(char* inputFile, char* outputFile, char* key)`,其中输入文件名、输出文件名和密钥作为参数。
2. 在该函数内部,读取输入文件的内容到一个缓冲区,然后逐字节与密钥进行异或操作,将结果写入到输出文件。
3. 编译这个C项目,生成动态链接库(dll)文件,例如"**denc.dll**"。
VB6调用C语言编写的DLL步骤如下:
1. 在VB6中创建一个新的工程,导入denc.dll,这样VB6就可以访问DLL中的函数。
2. 定义一个外部函数声明,对应于C语言中的`encryptFile`函数,例如:`Public Declare Function encryptFile Lib "denc.dll" (ByVal input As String, ByVal output As String, ByVal key As String) As Integer`。
3. 创建一个用户界面,包含输入文件路径、输出文件路径和密钥的输入框,以及一个执行加密操作的按钮。
4. 当按钮被点击时,调用`encryptFile`函数,并传入相应的参数,例如`encryptFile txtInput.Text, txtOutput.Text, txtKey.Text`。
5. 编译VB6工程,生成可执行文件,例如"**文件加密.exe**",这样用户就可以通过这个图形界面来加密文件。
资源中提供的"vb写的界面"可能包含VB6工程文件(*.vbp)和相关的VB源代码(*.frm),用于构建用户界面。而"c写的dll"指的是C语言编写的动态链接库源代码(*.c)和编译后的库文件(*.dll)。
这种文件加密方法利用了C语言的效率和VB6的易用性,通过按位异或运算实现了简单的文件加密,适用于对小规模数据进行快速加密。然而,对于大规模或高安全性需求的场景,更复杂的加密算法(如AES、RSA等)和库应该被考虑,以提供更强的安全保障。

ksgpjhqf
- 粉丝: 421
最新资源
- python 练习题,python题目
- 【嵌入式系统】基于STM32单片机的按键控制LED闪烁程序:初学者快速上手指南
- 首个实现全参数训练的知识产权大模型 -MoZi(墨子)
- ADO.NET专业项目实战指南
- 一项基于大模型的App隐私开关探测技术
- 支持多情感男女声,实时离线文本合成 TTS,可单模变声、调速率音量及自定义语音模型
- 首个全参数训练的知识产权大模型 MoZi (墨子)
- 基于 Next.js 的大模型小说创作工具 AI-Novel
- mmexport1755910142185.mp4
- 基于 Next.js 的大模型小说创作工具 AI-Novel
- 【移动应用开发】多框架教程汇总:智慧林业IoT、Rhodes、Kivy、Android、Ionic4开发资源与入门指导
- 冰心3.9多开(推荐).apk
- 唯雨超自然-1.6.apk
- 大数据信息的处理模式与模型构建
- 基于 TinyVue 的前后端分离后台管理系统,支持在线配置菜单、路由、国际化及页签模式、多级菜单,模板丰富、构建工具多样,功能强大且开箱即用!
- CST联合Matlab仿真程序