封装好的类如下,
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];
}
}//解密算法函数
};
MFC封装好了在控制台中进行进行调用可以成功,但是封装到了MFC中就不能实现了.
MFC中代码:
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);            //将文件1中的内容读取到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);
file3.Write(ppdate,strlen(ppdate));
file3.Close();}
加解密txt文档出现了如下的错误,
加密前:
加密后:
解密后:新建立了3个ppt文件进行测试,加密后打不开,解密后的文件为空。
求大牛指点啊算法解密加密