我做的几个简单加密解密,但是加解密后总有多余的几个字符,希望大家能帮我看看!!

Andrionda 2004-12-27 02:58:46
有很多问题,小弟水平次,大家见笑拉!! 呵呵

CTOSTR():将Edit1--Edit4的全部Text内容放入 Edit7当中.
qubuzifu():是对全部可见字符进行的加密.
GMTZM(AnsiString StrSMe):是进行简单的异或加密.
RSAJJM():本来打算做RSA加密的,无赖选择的好些素数加密后都是乱码,所以选择了固定的数字,
不过字母pr加密解密后还是乱码。
Button1Click: 选择加密选择!

Edit7-〉Text:放入的是Edit1--Edit4的全部Text内容(作为将要加密的字符)
Edit5-〉Text:存放加密后的字符。
Edit6-〉Text:存放解密后的字符。



#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
ComboBox1->Items->Add("RSA法");
ComboBox1->Items->Add("全部字符");
ComboBox1->Items->Add("异或法");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RSAJJM()
{
int e=7,d=103,n=133;

CTOSTR();

char *p5=new char[Edit7->Text.Length()];
char *p6=new char[Edit7->Text.Length()];
strcpy(p5,Edit7->Text.c_str());
for(int i=0;i<Edit7->Text.Length();i++)
p6[i]=Transform(p5[i],e,n);
Edit5->Text=StrPas(p6);

char *p7=new char[Edit5->Text.Length()];
char *p8=new char[Edit5->Text.Length()];
strcpy(p7,Edit5->Text.c_str());
for(int i=0;i<Edit5->Text.Length();i++)
p8[i]=Transform(p7[i],d,n);
Edit6->Text=StrPas(p8);
}
//----------------------------------------------------------------------------
int __fastcall TForm1::Transform(char m,int k,int n)
{
long int r=1;
char bk[16];
itoa(k,bk,2);
for (unsigned int i=0;i<strlen(bk);i++)
{
r=(r*r)%n;
if (bk[i] == '1')
{
r=(r*m)%n;
}
}
return r;
}
//----------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
i=ComboBox1->ItemIndex;
switch(i)
{
case 0: RSAJJM(); break;
case 1: qubuzifu(); break;
case 2: yihuo(); break;
default: break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CTOSTR()
{
char str[100];
int k=0;
char *p1=new char[Edit1->Text.Length()];
char *p2=new char[Edit2->Text.Length()];
char *p3=new char[Edit3->Text.Length()];
char *p4=new char[Edit4->Text.Length()];
strcpy(p1,Edit1->Text.c_str());
for(int i=0;i<Edit1->Text.Length();i++)
str[k++]=p1[i];

strcpy(p2,Edit2->Text.c_str());
for(int i=0;i<Edit2->Text.Length();i++)
str[k++]=p2[i];

strcpy(p3,Edit3->Text.c_str());
for(int i=0;i<Edit3->Text.Length();i++)
str[k++]=p3[i];

strcpy(p4,Edit4->Text.c_str());
for(int i=0;i<Edit4->Text.Length();i++)
str[k++]=p4[i];

Edit7->Text=StrPas(str);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::qubuzifu()
{
CTOSTR();
char *p1=new char[Edit7->Text.Length()];
strcpy(p1,Edit7->Text.c_str());
for(int i=0;i<Edit7->Text.Length();i++)
p1[i]=(p1[i]-32)*7%95+32;
Edit5->Text=StrPas(p1);

char *p2=new char[Edit5->Text.Length()];
strcpy(p2,Edit5->Text.c_str());
for(int i=0;i<Edit5->Text.Length();i++)
{
for(int j=0;j<7;j++)
{
if(((p2[i]-32)+j*95)%7==0)
{
p2[i]=((p2[i]-32)+j*95)/7+32;
break;
}
}
}
Edit6->Text=StrPas(p2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::yihuo()
{
CTOSTR();
Edit5->Text=GMTZM(Edit7->Text);
Edit6->Text=GMTZM(Edit5->Text);
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::GMTZM(AnsiString StrSMe)
{
AnsiString astrEcode;
AnsiString *Str =& StrSMe;
static const char i_UserKey[5] = {0x2A, 0x2B, 0x3D, 0x13, 0x4F};
if (Str->Length() > 0)
for (int i = 1;i <= Str->Length(); i++)
astrEcode = astrEcode + (char)(*Str->SubString(i,1).c_str() ^ (i+i_UserKey[i%5]));
return astrEcode;
}
//---------------------------------------------------------------------------
...全文
210 点赞 收藏 14
写回复
14 条回复
Andrionda 2005年01月06日
才看出来,其实CTOSTR() 函数的功能可以这样实现
我真是晕拉
AnsiString str;
str=Edit1->Text+Edit2->Text+
Edit3->Text+Edit4->Text;
Edit7->Text=str;
回复 点赞
kunlunlang 2004年12月30日
要对尾字符做处理才可以
回复 点赞
Andrionda 2004年12月30日
我试了一下,原因出在CTOSTR() 函数上,加密解密都对着呢!
还有就是RSA解密后的字符‘6’成了‘?’ 这该怎么解决呢,我把好些素数都试过拉
回复 点赞
Andrionda 2004年12月30日
现在即使里面没有字符,经过处理以后也会产生新字符,这是怎么回事啊?
回复 点赞
Andrionda 2004年12月29日
sangxiao() 兄:谢谢了先!!呵呵
回复 点赞
sangxiao 2004年12月28日
lz7777@etang.com
回复 点赞
sangxiao 2004年12月28日
to PLYAT(沙漠狐) :

void __fastcall TForm1::CTOSTR()
{
char *str;
int count;
int k=0;
char *p1=new char[Edit1->Text.Length()];
char *p2=new char[Edit2->Text.Length()];
char *p3=new char[Edit3->Text.Length()];
char *p4=new char[Edit4->Text.Length()];
count = Edit1->Text.Length() + Edit2->Text.Length() +
Edit3->Text.Length() +Edit4->Text.Length();
str = new char[count];
.......
}


我已经验证在全部字符加密好用.
回复 点赞
Andrionda 2004年12月28日
sangxiao: 用动态数组该怎么做? 还得麻烦你不吝赐教。谢谢
回复 点赞
Andrionda 2004年12月27日
我给大家都发过去 帮小弟看看! 谢谢了先
我妹是: plyat@163.com
回复 点赞
ccrun.com 2004年12月27日
挖卡卡,给俺来一份。
回复 点赞
ccrun.com 2004年12月27日
test
回复 点赞
netsys2 2004年12月27日
如果不是非得用公钥体制,

可留妹,给你发一个AES的。
回复 点赞
kinglh 2004年12月27日
帮你UP
回复 点赞
sangxiao 2004年12月27日
void __fastcall TForm1::CTOSTR()
{
char str[100];
.....
}

这个数组str建议改成动态生成的,长度为(Edit1-〉Text的长度+ Edit2-〉Text的长度+Edit3-〉Text的长度+Edit4-〉Text的长度),这样的话应该没问题。
回复 点赞
发动态
发帖子
茶馆
创建于2007-08-02

360

社区成员

2.0w+

社区内容

C++ Builder 茶馆
社区公告
暂无公告