文件加密问题!

Yea 2003-12-01 03:19:26
我现在用filewrite和fileread保存和写的文件都是明文。我想给文件加密,有没有加密控件或代码?如果自己编写该怎么样下手?
...全文
83 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yea 2003-12-03
  • 打赏
  • 举报
回复
没人回答我了吗?
Yea 2003-12-02
  • 打赏
  • 举报
回复
to:zxcdewq(工作·快乐<李木>)
请问加密函数和解密函数就可以把明文加密和解密,为什么需要加密钥匙??钥匙有什么用呢?
比如我的加密函数把a变为6.我用解密函数解密的时候遇到6就解成a不就完了吗?为什么要钥匙呢?
fancy05 2003-12-01
  • 打赏
  • 举报
回复
www.51delphi.com 有加密的控件下载,叫TurboPower ...
zxcdewq 2003-12-01
  • 打赏
  • 举报
回复
简单的字符串加密类


//---------------------------------------------------------------------------

#ifndef EncryptH
#define EncryptH
#include <Classes.hpp>

class Encrypt
{
public:// User declarations
AnsiString __fastcall EncryptCode(AnsiString sstr) ; //加密字符串
AnsiString __fastcall UnEncryptCode(AnsiString dstr); //解密字符串
private:
int __fastcall EncryptKey( int EnKey, bool UnKey ) ; //转换要保存加密钥匙
int __fastcall GetKey(); //得到随机加密钥匙
};
//---------------------------------------------------------------------------
#endif


#pragma hdrstop

#include "Encrypt.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)


AnsiString __fastcall Encrypt::EncryptCode(AnsiString Encrypt)
{
int Key; //加密钥匙,每次生成不同的钥匙,记录到字符串中解密时使用
int Len; //要加密的字符串长度
AnsiString SStr;

Len = Encrypt.Length();
char *TempCr = new char[Len + 3]; //前两位写入符串长度和加密钥匙
int *TempInt = new int[Len + 3];

memset(TempCr,'\0',(Len + 3));
memset(TempInt,'\0',(Len + 3));
strcpy(TempCr+2, Encrypt.c_str()); //从第三位开始复制字符串到字符数组

Key = GetKey(); //得到随机的加密钥匙
TempInt[0] = Len; //写入字符串头两位,长度和加密钥匙
TempInt[1] = EncryptKey(Key, true) ;
SStr = "0x" + IntToHex(TempInt[0], 1) ; //在每个加密后字符前加0x表示16进制数
SStr += "0x" + IntToHex(TempInt[1], 1) ;

//循环写入字符串每个字符
for (int i=2; i<Len+2; i++)
{
TempCr[i] = TempCr[i]^Key ;
TempCr[i] += Key + 4 ;

TempInt[i] = TempCr[i]; //存储为数字可以避免遇到'\0'断开字符串的情况
TempInt[i] += Key -3;
AnsiString s = IntToHex(TempInt[i], 1); //把整形转为16进制存储
SStr += "0x" + s ;
}

delete[] TempCr;
delete[] TempInt;
return SStr + "0x";
}
//---------------------------------------------------------------------------



AnsiString __fastcall Encrypt::UnEncryptCode(AnsiString UnEncrypt)
{
int Key; //要提取的加密钥匙
int Len; //要提取的加密前的字符串长度
AnsiString DStr;


UnEncrypt.Delete(1, 2); //删除第一个0x
int P1 = UnEncrypt.Pos("0x"); //定位到下一个0x,
Len = StrToInt("0x" + UnEncrypt.SubString(1, P1-1)); //得到加密前文件长度
UnEncrypt = UnEncrypt.SubString(P1, UnEncrypt.Length()); //去掉已经解密出来的字符

UnEncrypt.Delete(1, 2);
P1 = UnEncrypt.Pos("0x");
Key = StrToInt("0x" + UnEncrypt.SubString(1, P1-1));
Key = EncryptKey(Key, false); //得到转换后的加密钥匙
UnEncrypt = UnEncrypt.SubString(P1, UnEncrypt.Length());

char *TempCr = new char[Len + 1];
char *TempInt = new char[Len + 1];
memset(TempCr, 0, (Len + 1));
memset(TempInt, 0, (Len + 1));

//循环解密每个字符,恢复字符串
for(int i=0; i<Len; i++)
{
int TL = UnEncrypt.Length();
if(TL <=0 )
{
if(Len != i)
{
//如果解密后长度和加密前不一样,则加密后文件被修改过。

// MessageBox(NULL, "加密后文件被修改过!请检查。", "出错了!", NULL);
}
break;
}

UnEncrypt.Delete(1, 2);
DStr = UnEncrypt.SubString(1, UnEncrypt.Pos("0x")-1) ;
UnEncrypt = UnEncrypt.SubString(UnEncrypt.Pos("0x"), TL - UnEncrypt.Pos("0x"));

/* int UL = DStr.Length();

//因为加密后字符长度不超过8位,如果大于8则被修改过
if( UL>8 )
{
if(MessageBox(NULL, "加密后文件被修改过!点击'是' 跳过错误继续解密,点击'否'停止解密。",
"出错了!", MB_YESNO) ==IDYES)
{
DStr = "00";
}
else
{
break;
}
} */

TempInt[i] = StrToInt("0x" + DStr) ;
TempInt[i] -= Key - 3;
TempCr[i] = TempInt[i];
TempCr[i] -= Key + 4;
TempCr[i] ^= Key;

}

AnsiString OkStr = String(TempCr); //字符数组转换为字符串
delete [] TempInt;
delete [] TempCr ;
return OkStr;

}
//---------------------------------------------------------------------------


int __fastcall Encrypt::GetKey()
{
int EnKey ;
Randomize(); //随机种子
EnKey = random(200) + 1; //得到随机加密钥匙
return EnKey;
}
//---------------------------------------------------------------------------

int __fastcall Encrypt::EncryptKey( int EnKey, bool UnKey )
{
if(UnKey)
{
EnKey += 4 ;
EnKey *= 4 ;
}
else
{
EnKey /= 4 ;
EnKey -= 4 ;
}

return EnKey; //返回加密后钥匙,不明文存储加密钥匙,提高加密保险度
}
//---------------------------------------------------------------------------

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧