MFC下读写文件然后用RC4算法加密的程序有Bug ,请大牛看一下。有偿。麻烦尽快回复。这个代码旨在进行文件读写,
MFC下读写文件然后用RC4算法加密的程序有Bug ,请大牛看一下。有偿。麻烦尽快回复。
这个代码旨在进行文件读写,然后进行加解密
我想采用二进制的读写方式,但是感觉在强制类型转换的时候出现了问题
感觉文件读写的地方好像也有不妥。但是之前对这方面的知识了解甚少。所以请大牛来指教一下,谢谢
编译是没错的。但是就是达不到想要的效果。
封装RC4算法的头文件
#include<stdio.h>
#include<string.h>
#include "stdafx.h"
typedef unsigned long ULONG;
class Crc4
{
public:
//初始化sbox将密钥打乱
void rc4_init(unsigned char *s, unsigned char *key, ULONG Len)
{
int i =0, j = 0;
char k[256] = {0};
unsigned char s2[256] = {0};
unsigned char tmp = 0;
for(i=0;i<256;i++)
{
s[i]=i;
k[i]=key[i%Len];
}
for (i=0; i<256; i++)
{
j=(j+s[i]+k[i])%256;
tmp = s[i];
s[i] = s[j]; //交换s[i]和s[j]
s[j] = tmp;
}
}//始化函数
/*void rc4_swap()
{
char s2[256] = {0};
char s[256]={0};
for(int i=0;i<256;i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!
{
s2[i]=s[i];
}
}*/
void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len)
{
int i = 0, j = 0, t = 0;
unsigned long k = 0;
unsigned char tmp;
for(k=0;k<Len;k++)
{
i=(i+1)%256;
j=(j+s[i])%256;
tmp = s[i];
s[i] = s[j]; //交换s[x]和s[y]
s[j] = tmp;
t=(s[i]+s[j])%256;
Data[k] ^= s[t];
}
}//解密算法函数
};
Dlg的cpp文件:
void C加密算法Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
char key[256] = {"123"};
CStdioFile file1;
file1.Open(_T("D:\\1.ppt"),CFile::modeRead|CFile::typeBinary); //二进制形式打开文件1
ULONGLONG len=file1.GetLength(); //获取文件1的大小
BYTE *pdat=new BYTE[len+1]; //新建一个BYTE数组
file1.Read(pdat,len); //将文件1中的内容读取到BYTE数组中指针是pdat
char *pData = (char*)pdat; //由BYTE类型强制转换为char类型。新的指针是pdata
ULONG Len=strlen(key); //获取密钥大小
unsigned char s[256] = {0},s2[256] = {0};
Crc4 rc4;
rc4.rc4_init(s,(unsigned char *)key,Len); //初始化
//rc4.rc4_swap();
for(int i=0;i<256;i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!
{
s2[i]=s[i];
}
rc4.rc4_crypt(s,(unsigned char *)pData,strlen(pData));//加密
//MessageBox((LPCTSTR)pData); //弹出密文
//进行了加密
CStdioFile file2;
file2.Open(_T("D:\\2.ppt"),CFile::modeWrite|CFile::typeBinary);//二进制形式打开文件2
file2.Write(pdat,len); //将 此处感觉是pDate
file1.Close(); //关闭文件
file2.Close(); //关闭文件
//将加密的数据写入到2.txt
file2.Open(_T("D:\\2.ppt"),CFile::modeRead|CFile::typeBinary); //二进制形式打开文件2
ULONGLONG len1=file2.GetLength(); //获取文件2的大小
BYTE *pppdate=new BYTE[len1+1]; //新建一个BYTE数组
file2.Read(pppdate,len1); //将文件2中的内容读取到BYTE数组中指针是pppdate
char *ppdate=(char*)pppdate;
rc4.rc4_init(s,(unsigned char *)key,Len); //初始化密钥
rc4.rc4_crypt(s2,(unsigned char*)ppdate,strlen(ppdate)); //解密
CStdioFile file3;
file3.Open(_T("D:\\3.ppt"),CFile::modeWrite|CFile::typeBinary); //二进制形式打开文件3
file3.Write(ppdate,strlen(ppdate)); //写入文件3
file3.Close();
}
算法 加密 bug MFC 解密
[解决办法]
代码比较乱,有些变量自己都不清楚为什么要这么用吧
BYTE *pdat=new BYTE[len+1]; //新建一个BYTE数组
int nDataLen = file1.Read(pdat,len); //将文件1中的内容读取到BYTE数组中指针是pdat
这里应该先将pdat空间初始化
核心问题出在这里!
rc4.rc4_crypt(s,(unsigned char *)pData,strlen(pData));//加密
==strlen的使用是致命的。你这个pData数据中,可能存在0x00。如果你用strlen,会计算到第一个0x00截止,而不是pData实际的数据长度。这里应该使用从文件中读取到的数据的长度,即Read函数的返回值,也就是上方我用红色标注的nDataLen作为参数。
[解决办法]
下半部分的问题是一样的。分配空间要初始化,指针使用要严谨。
[解决办法]
file2.Write(pdat,len); //将 此处感觉是pDate
你加密后的内容写入文件时,长度怎么用len呢?加密后的长度与原始长度一样吗?如果一样,那为什么解密后的长度变长了?
[解决办法]
file3.Write(ppdate,strlen(ppdate)); //写入文件3
这里又用错了,不能用strlen!!!!