Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Шифрование данных


Автор: RiLL 23.5.2009, 02:43
Всем доброго времени суток.Помогите плз разбраться с лабой в Borland C++ Builder 6
Дано такое задание
Зашифровать открытый текст сначала с помощью многоалфавитной подстановки,затем с помощью одноалфавитной подстановки.Расшифровать
Т.е у мена форма,на ней эдит для открытого текста,кнопочка Зашифровать,едит для зашифрованного текста(должно сначала шифроваться многоалф,а затем то,что получилось сразу же одноалфавитной).Расшифровывется задом наперед..smile(т.е сначала одноалфавитная расшифровывается,затем многоалфавитная и в итоге должны получить открытый текст)
вот что у меня получилось
Код

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

#include <vcl.h>
#include<string.h>
#pragma hdrstop
#define MAXLEN 30
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//функция, используемая при сортировке
int lt(const void *a,const void *b)
{
  if(*(char*)a<*(char*)b) return -1;
  else if(*(char*)a==*(char*)b) return 0;
  else return 1;
}

//длина шифотекста
unsigned size;

//шифротекст
char tmp[MAXLEN];

//функция шифрования

//mnogoalfavitnoe shifrovanie
void Encrypt(const char *str,const char *key,char *res, unsigned n)
{
  char tmp[MAXLEN];
  if(n<strlen(key)) strncpy(tmp, key, n);
  else strncpy(tmp, key, n);
  while(strlen(tmp)<n)
  strncat(tmp,"  ", 1);
//cikl shifrovaniya
  for(unsigned i=0; i<n; i++)
  res[i]=(str[i] + tmp[i]) % 256;
  res[n]='\0';
}

//odnoalfavitnoe shifrovanie
void Encrypt1(const char *str, const char *key,char *res,unsigned n)
{
  for(unsigned i=0;i<n;i++)
  res[i] = (str[i] + key) % 256;
  res[n] = '\0';
}


//функция расшифрования

//odnoalfavitnoe rashifrovanie
void Decrypt1(const char *str,const char *key,char *res,unsigned n)
{
  for(unsigned i=0;i<n;i++)
  res[i]=(str[i]+256-key) % 256;
  res[n]='\0';
}

//mnogoalfavitnoe rashifrovanie
void Decrypt(const char *str,const char *key,char *res,unsigned n)
{
   char tmp[MAXLEN];
   if(n<strlen(key)) strncpy(tmp, key, n);
   else strncpy(tmp, key, n);
   while(strlen(tmp)<n)
   strncat(tmp," ",1);
//цикл расшифрования
   for(unsigned i=0;i<n;i++)
   res[i]=(str[i]+256-tmp[i]) % 256;
  //добавление 0-символа в конец расшифрованного текста
   res[n]='\0';
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//вызов функции шифрования
Encrypt(Edit1->Text.c_str(),Edit3->Text.c_str(),tmp);
Edit2->Text=tmp;
Encrypt1(Edit2->Text.c_str(),Edit3->Text.c_str(),tmp);


/*if(isdigit(Edit3->Text[1]))
 Encrypt(Edit1->Text.c_str(),Edit3->Text[1]-'0',tmp);
else Encrypt(Edit1->Text.c_str(),Edit3->Text[1],tmp); */
//отображение шифротекста
Edit2->Text=tmp;
//сохранение длины шифротекста
size=Edit2->Text.Length();
Button2->Enabled=true;
Button1->Enabled=false;
}

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

void __fastcall TForm1::Button2Click(TObject *Sender)
{
//вызов функции расшифрования
  Decrypt1(Edit2->Text.c_str(),Edit3->Text.c_str(),tmp,size);
   Edit1->Text=AnsiString(tmp).SubString(1,MAXLEN);
  Decrypt(Edit1->Text.c_str(),Edit3->Text.c_str(),tmp,size);
/*if(isdigit(Edit3->Text[1]))
 Decrypt(Edit2->Text.c_str(),Edit3->Text[1]-'0',tmp,size);
else Decrypt(Edit2->Text.c_str(),Edit3->Text[1],tmp,size);*/
//отображение расшифрованного текста
Edit1->Text=AnsiString(tmp).SubString(1,MAXLEN);
Button1->Enabled=true;
Button2->Enabled=false;
}




первая ошибка,которая нашлась и я не знаю как ее исправить находится тут
//odnoalfavitnoe shifrovanie
void Encrypt1(const char *str, const char *key,char *res,unsigned n)
{
  for(unsigned i=0;i<n;i++)
  res[i] = (str[i] + key) % 256;
  res[n] = '\0';
}
выделяется эта строка
 res[i] = (str[i] + key) % 256;
пишется вроде что-то типа этого
Illegal use of pointer
правда не уверен на 100% что это к этому относится:(

Автор: fry 24.5.2009, 01:18
Цитата

выделяется эта строка
 res[i] = (str[i] + key) % 256;
пишется вроде что-то типа этого
Illegal use of pointer
правда не уверен на 100% что это к этому относится:(


Ну, здесь явно видно, что, типа, ну ты понял о чем я......

Пиши ошибку полностью, в следующий раз будет легче разобраться если чего серьезнее этого будет.

Код

void Encrypt1(const char *str, const char *key,char *res,unsigned n)
{
  for(unsigned i=0;i<n;i++)
  res[i] = (str[i] + key) % 256;
  res[n] = '\0';
}


Может так:

Код

void Encrypt1(const char *str, const char *key,char *res,unsigned n)
{
  for(unsigned i=0;i<n;i++)            
  res[i] = (str[i] + key[i]) % 256;  <<---------------<-<-<
  res[n] = '\0';
}



Автор: andrew_121 24.5.2009, 07:37
Цитата(fry @  24.5.2009,  01:18 Найти цитируемый пост)
Может так:

Да. При условии что оба массива одного размера. Но не факт!

Автор: RiLL 24.5.2009, 12:21
fry,andrew_121 спасибо за помощь
еще 1 вопросик можно?
вот это
Код

void Encrypt1(const char *str, const char *key,char *res,unsigned n)

и это
Код

Encrypt1(Edit2->Text.c_str(),Edit3->Text.c_str(),tmp);



выделяется вот эта строка
Код

Encrypt1(Edit2->Text.c_str(),Edit3->Text.c_str(),tmp);


и пишется ошибка
  [C++ Error] Unit1.cpp(86): E2193 Too few parameters in call to 'Encrypt(const char *,const char *,char *,unsigned int)'
  [C++ Error] Unit1.cpp(88): E2193 Too few parameters in call to 'Encrypt1(const char *,const char *,char *,unsigned int)'

помогите исправить плз?

Автор: zim22 24.5.2009, 12:38
Цитата(RiLL @  24.5.2009,  12:21 Найти цитируемый пост)
 [C++ Error] Unit1.cpp(86): E2193 Too few parameters in call to 'Encrypt(const char *,const char *,char *,unsigned int)'

слишком мало параметров.
функции нужно 4 параметра.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)