首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

MFC停读写文件然后用RC4算法加密的程序有Bug ,请大牛看一下。有偿。麻烦尽快回复

2013-06-19 
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!!!!

热点排行