CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [DES] Jak podpiąć i funkcję z innego pliku c cpp?

[DES] Jak podpiąć i funkcję z innego pliku c cpp?

dział ogólny

[DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez kwgrkwgr » niedziela, 8 maja 2011, 08:31

Mam taki problem. Na stronie Helion znalazłem Książkę i kody do książki "Algorytmy w C".
Wyodrębniłem kilka plików i stworzyłem projekt w DevC++ -> poszło lecz nie znam elementów do budowy interfejsu graficznego w tej aplikacji.
Stworzyłem projekt w Borland C++ 6 (mogę również w 2010), dołączyłem pliki (tak mi się wydaje), lecz builder nie widzi 2 funkcji które są mi potrzebne.

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned char      destmp[8],
                   desptx[8],
                   desctx[8],
                   deskey[8];

Huge               rsatmp,
                   rsaptx,
                   rsactx;

RsaPubKey          rsapubkey;
RsaPriKey          rsaprikey;

int                i;

destmp[0] = 0xab;
destmp[1] = 0xc0;
destmp[2] = 0x00;
destmp[3] = 0x00;
destmp[4] = 0x00;
destmp[5] = 0x00;
destmp[6] = 0x00;
destmp[7] = 0x00;

deskey[0] = 0x12;
deskey[1] = 0x30;
deskey[2] = 0x00;
deskey[3] = 0x00;
deskey[4] = 0x00;
deskey[5] = 0x00;
deskey[6] = 0x00;
deskey[7] = 0x00;

//des_encipher(destmp, desctx, deskey);
//des_decipher(desctx, desptx, deskey);  


Domyślam że muszę coś jeszcze dopisać w pliku ".h" lecz nie wiem co i gdzie.


[Linker Error] Unresolved external 'des_encipher(const unsigned char *, unsigned char *, const unsigned char *)' referenced from P:\GRY\LAB4 C++\HELIONBUILDERDES\UNIT1.OBJ
[Linker Error] Unresolved external 'des_decipher(const unsigned char *, unsigned char *, const unsigned char *)' referenced from P:\GRY\LAB4 C++\HELIONBUILDERDES\UNIT1.OBJ



Plik z projektem w aktualnym surowym stanie jest pod linkiem: http://chomikuj.pl/kwgr/Ciekawostki/DES/HelionBuilderDES.rar

Następnie będę chciał dane zamiast mieć wpisane na sztywno podawać je z pola TEdit->Text, lecz jak konwertować AnsiStringa do postaci HEX tak by go potem bez problemu przypisać do tabel: destmp i deskey. W sieci znalazłem taką metodę:

KOD cpp:     UKRYJ  
char buffer[10];
char bufHex[10];
for(j = 0; j < 10; j++)
    sprintf(bufHex, "%X", buffer[j]);


Lecz czy jest może coś lepszego?

Dzięki za pomoc.
Avatar użytkownika
kwgrkwgr
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 13 kwietnia 2011, 16:37
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WinXP Win7
Kompilator: C++ Builder 6;
C++ Builder 2010;
MS Visual 2008 C#;
Gadu Gadu: 9692051
    Windows XPOpera

Re: [DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez Cyfrowy Baron » niedziela, 8 maja 2011, 08:56

To co tworzysz w DevC++ możesz równie dobrze stworzyć w C++Builder, a wtedy nie będzie problemu z dołączaniem plików.

kwgrkwgr napisał(a):Domyślam że muszę coś jeszcze dopisać w pliku ".h" lecz nie wiem co i gdzie.


Możliwe, że chodzi o to: ► patrz serwis: Cyfrowy Baron dział:teoria -> tworzenie modułów. - instrukcja extern.



AnsiStringa do postaci HEX tak by go potem bez problemu przypisać do tabel: destmp i deskey. W sieci znalazłem taką metodę:


Najpierw String na liczbę, czyli int, a potem na hex, czyli użyj funkcji IntToHex:

KOD cpp:     UKRYJ  
int x = Edit1->Text.ToInt();
String hex = IntToHex(x, 6);
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez kwgrkwgr » niedziela, 8 maja 2011, 09:59

http://programowanie.cal.pl/cyfbar/teor10.htm
Zrobiłem tak jak w tym linku i nie pomogło a moje pliki wyglądają tak:
KOD cpp:     UKRYJ  
// Plik źródłowy np. Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "encrypt.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TEdit *Edit1;
        TEdit *Edit2;
        TButton *Button2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
private:        // User declarations
public:         // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


KOD cpp:     UKRYJ  
// Plik źródłowy np. Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#pragma hdrstop

#include "Unit1.h"
#include "des.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

char *StrToHexStr(char *str)
{
 char *newstr = new char[(strlen(str)*2)+1];
 char *cpold = str;
 char *cpnew = newstr;

 while('\0' != *cpold) {
 sprintf(cpnew, "%02X", (char)(*cpold++));
 cpnew+=2;
 }
 *(cpnew) = '\0';
 return(newstr);
}

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

void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned char      destmp[8],
                   desptx[8],
                   desctx[8],
                   deskey[8];

Huge               rsatmp,
                   rsaptx,
                   rsactx;

RsaPubKey          rsapubkey;
RsaPriKey          rsaprikey;

int                i;

destmp[0] = 0xab;
destmp[1] = 0xc0;
destmp[2] = 0x00;
destmp[3] = 0x00;
destmp[4] = 0x00;
destmp[5] = 0x00;
destmp[6] = 0x00;
destmp[7] = 0x00;

deskey[0] = 0x12;
deskey[1] = 0x30;
deskey[2] = 0x00;
deskey[3] = 0x00;
deskey[4] = 0x00;
deskey[5] = 0x00;
deskey[6] = 0x00;
deskey[7] = 0x00;

des_encipher(destmp, desctx, deskey);
des_decipher(desctx, desptx, deskey);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        Edit1->Text = "";
        Edit2->Text = "";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
        //char buffer[10] ;
        char buffer[10] = {'a','b','c','d','e','f','g','h','i','j'};
        int j;
        char bufHex[10];


        //buffer[10] = {'a','b','c','d','e','f','g','h','i','j'};
         

        for(j = 0; j < 10; j++)
         sprintf(bufHex, "%X", buffer[j]);
       char * test = StrToHexStr(Edit1->Text.c_str());
       Edit2->Text =  test;
}
//---------------------------------------------------------------------------
 


KOD cpp:     UKRYJ  
// Plik źródłowy np. des.c

#pragma hdrstop

#include "des.h"

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

#pragma package(smart_init)

/*****************************************************************************
*                                                                            *
*  --------------------------------- des.c --------------------------------  *
*                                                                            *
*****************************************************************************/


#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "des.h"     ////////////////
#include "bit.h"
#include "encrypt.h"

/*****************************************************************************
*                                                                            *
*  Odwzorowanie opisujące przekształcanie klucza.                            *
*                                                                            *
*****************************************************************************/


static const int DesTransform[56] = {

   57, 49, 41, 33, 25, 17,  9,  1, 58, 50, 42, 34, 26, 18,
   10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,
   63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22,
   14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,  4

};

/*****************************************************************************
*                                                                            *
*  Liczba rotacji przy wylcizaniu podkluczy.                                 *
*                                                                            *
*****************************************************************************/


static const int DesRotations[16] = {

   1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1

};

/*****************************************************************************
*                                                                            *
*  Odwzorowowanie do wyboru podkluczy z permutacją.                          *
*                                                                            *
*****************************************************************************/


static const int DesPermuted[48] = {

   14, 17, 11, 24,  1,  5,  3, 28, 15,  6, 21, 10,
   23, 19, 12,  4, 26,  8, 16,  7, 27, 20, 13,  2,
   41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
   44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32

};

/*****************************************************************************
*                                                                            *
*  Odwzorowanie opisujące permutację początkową bloków danych.               *
*                                                                            *
*****************************************************************************/


static const int DesInitial[64] = {

   58, 50, 42, 34, 26, 18, 10,  2, 60, 52, 44, 36, 28, 20, 12,  4,
   62, 54, 46, 38, 30, 22, 14,  6, 64, 56, 48, 40, 32, 24, 16,  8,
   57, 49, 41, 33, 25, 17,  9,  1, 59, 51, 43, 35, 27, 19, 11,  3,
   61, 53, 45, 37, 29, 21, 13,  5, 63, 55, 47, 39, 31, 23, 15,  7

};

/*****************************************************************************
*                                                                            *
*  Odwzorowanie opisujące permutację rozszerzającą bloków danych.            *
*                                                                            *
*****************************************************************************/


static const int DesExpansion[48] = {

   32,  1,  2,  3,  4,  5,  4,  5,  6,  7,  8,  9,
    8,  9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
   16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
   24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32,  1

};

/*****************************************************************************
*                                                                            *
*  Tablice odpowiadające podstawioniom S-ramek na blokach danych.            *
*                                                                            *
*****************************************************************************/


static const int DesSbox[8][4][16] = {

   {
   {14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7},
   { 0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8},
   { 4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0},
   {15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13},
   },

   {
   {15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10},
   { 3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5},
   { 0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15},
   {13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9},
   },

   {
   {10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8},
   {13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1},
   {13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7},
   { 1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12},
   },

   {
   { 7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15},
   {13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9},
   {10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4},
   { 3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14},
   },

   {
   { 2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9},
   {14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6},
   { 4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14},
   {11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3},
   },

   {
   {12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11},
   {10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8},
   { 9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6},
   { 4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13},
   },

   {
   { 4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1},
   {13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6},
   { 1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2},
   { 6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12},
   },

   {
   {13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7},
   { 1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2},
   { 7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8},
   { 2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11},
   },

};

/*****************************************************************************
*                                                                            *
*  Odwzorowanie permutacji P-ramki na blokach danych.                        *
*                                                                            *
*****************************************************************************/


static const int DesPbox[32] = {

   16,  7, 20, 21, 29, 12, 28, 17,  1, 15, 23, 26,  5, 18, 31, 10,
    2,  8, 24, 14, 32, 27,  3,  9, 19, 13, 30,  6, 22, 11,  4, 25

};

/*****************************************************************************
*                                                                            *
*  Odwzorowanie permutacji kończowej na blokach danych.                      *
*                                                                            *
*****************************************************************************/


static const int DesFinal[64] = {

   40,  8, 48, 16, 56, 24, 64, 32, 39,  7, 47, 15, 55, 23, 63, 31,
   38,  6, 46, 14, 54, 22, 62, 30, 37,  5, 45, 13, 53, 21, 61, 29,
   36,  4, 44, 12, 52, 20, 60, 28, 35,  3, 43, 11, 51, 19, 59, 27,
   34,  2, 42, 10, 50, 18, 58, 26, 33,  1, 41,  9, 49, 17, 57, 25

};

/*****************************************************************************
*                                                                            *
*  Definicja typu służącego do rozróżnienia szyfrowania i deszyfrowania.     *
*                                                                            *
*****************************************************************************/


typedef enum DesEorD_ {encipher, decipher} DesEorD;

/*****************************************************************************
*                                                                            *
*  -------------------------------- permute -------------------------------  *
*                                                                            *
*****************************************************************************/


static void permute(unsigned char *bits, const int *mapping, int n) {

unsigned char      temp[8];

int                i;

/*****************************************************************************
*                                                                            *
*  Permutacja bufora za pomocą odwzorowania n-pozycyjnego.                   *
*                                                                            *
*****************************************************************************/


memset(temp, 0, (int)ceil(n / 8));

for (i = 0; i < n; i++)
   bit_set(temp, i, bit_get(bits, mapping[i] - 1));

memcpy(bits, temp, (int)ceil(n / 8));

return;

}

/*****************************************************************************
*                                                                            *
*  ------------------------------- des_main -------------------------------  *
*                                                                            *
*****************************************************************************/


static int des_main(const unsigned char *source, unsigned char *target, const
   unsigned char *key, DesEorD direction) {

static unsigned char subkeys[16][7];

unsigned char        temp[8],
                     lkey[4],
                     rkey[4],
                     lblk[6],
                     rblk[6],
                     fblk[6],
                     xblk[6],
                     sblk;

int                  row,
                     col,
                     i,
                     j,
                     k,
                     p;

/*****************************************************************************
*                                                                            *
*  Jeśli key ma wartość NULL, używamy podkluczy wyliczonych uprzednio.       *
*                                                                            *
*****************************************************************************/


if (key != NULL) {

   /**************************************************************************
   *                                                                         *
   *  Kopia lokalna klucza.                                                  *
   *                                                                         *
   **************************************************************************/


   memcpy(temp, key, 8);

   /**************************************************************************
   *                                                                         *
   *  Permutacja i kompresja klucza na 56 bitów.                             *
   *                                                                         *
   **************************************************************************/


   permute(temp, DesTransform, 56);

   /**************************************************************************
   *                                                                         *
   *  Podział klucza na dwia 28-bitowe bloki.                                *
   *                                                                         *
   **************************************************************************/


   memset(lkey, 0, 4);
   memset(rkey, 0, 4);

   for (j = 0; j < 28; j++)
      bit_set(lkey, j, bit_get(temp, j));

   for (j = 0; j < 28; j++)
      bit_set(rkey, j, bit_get(temp, j + 28));

   /**************************************************************************
   *                                                                         *
   *  Wyliczanie podkluczy dla poszczególnych tur.                           *
   *                                                                         *
   **************************************************************************/


   for (i = 0; i < 16; i++) {

      /***********************************************************************
      *                                                                      *
      *  Rotacja poszczególnych bloków według ich tury.                      *
      *                                                                      *
      ***********************************************************************/


      bit_rot_left(lkey, 28, DesRotations[i]);
      bit_rot_left(rkey, 28, DesRotations[i]);

      /***********************************************************************
      *                                                                      *
      *  Złączanie bloków w pojedyncz podklucz.                              *
      *                                                                      *
      ***********************************************************************/


      for (j = 0; j < 28; j++)
         bit_set(subkeys[i], j, bit_get(lkey, j));

      for (j = 0; j < 28; j++)
         bit_set(subkeys[i], j + 28, bit_get(rkey, j));

      /***********************************************************************
      *                                                                      *
      *  Permutacja z wyborem.                                               *
      *                                                                      *
      ***********************************************************************/


      permute(subkeys[i], DesPermuted, 48);

   }

}

/*****************************************************************************
*                                                                            *
*  Lokalna kopia tekstu źródłowego.                                          *
*                                                                            *
*****************************************************************************/


memcpy(temp, source, 8);

/*****************************************************************************
*                                                                            *
*  Permutacja początkowa.                                                    *
*                                                                            *
*****************************************************************************/


permute(temp, DesInitial, 64);

/*****************************************************************************
*                                                                            *
*  Podziała tekstu źródłowego na lewy i prawy blok, oba po 32 bity.          *
*                                                                            *
*****************************************************************************/


memcpy(lblk, &temp[0], 4);
memcpy(rblk, &temp[4], 4);

/*****************************************************************************
*                                                                            *
*  Zaszyfrowanie lub odszyfrowanie tekstu źródłowego.                        *
*                                                                            *
*****************************************************************************/


for (i = 0; i < 16; i++) {

   /**************************************************************************
   *                                                                         *
   *  Zaczynamy wyliczanie f.                                                *
   *                                                                         *
   **************************************************************************/


   memcpy(fblk, rblk, 4);

   /**************************************************************************
   *                                                                         *
   *  Permutacja i rozszerzenie kopii prawego bloku na 48 bitów.             *
   *                                                                         *
   **************************************************************************/


   permute(fblk, DesExpansion, 48);

   /**************************************************************************
   *                                                                         *
   *  Zastsowanie podklucza odpowiedniego dla danej tury.                    *
   *                                                                         *
   **************************************************************************/


   if (direction == encipher) {

      /***********************************************************************
      *                                                                      *
      *  W przypadku szyfrowania klucze stosujemy w kolejności rosnącej.     *
      *                                                                      *
      ***********************************************************************/


      bit_xor(fblk, subkeys[i], xblk, 48);
      memcpy(fblk, xblk, 6);

      }

   else {

      /***********************************************************************
      *                                                                      *
      *  W przypadku deszyfrowania klucze stosujemy w kolejności malejącej.  *
      *                                                                      *
      ***********************************************************************/


      bit_xor(fblk, subkeys[15 - i], xblk, 48);
      memcpy(fblk, xblk, 6);

   }

   /**************************************************************************
   *                                                                         *
   *  Podstawienia S-ramek.                                                  *
   *                                                                         *
   **************************************************************************/


   p = 0;

   for (j = 0; j < 8; j++) {

      /***********************************************************************
      *                                                                      *
      *  Wyliczanie wiersza i kolumny w tabilcy S-ramek.                     *
      *                                                                      *
      ***********************************************************************/


      row = (bit_get(fblk, (j * 6)+0) * 2) + (bit_get(fblk, (j * 6)+5) * 1);
      col = (bit_get(fblk, (j * 6)+1) * 8) + (bit_get(fblk, (j * 6)+2) * 4) +
            (bit_get(fblk, (j * 6)+3) * 2) + (bit_get(fblk, (j * 6)+4) * 1);

      /***********************************************************************
      *                                                                      *
      *  Podstawienie S-ramki według aktualnego sześciobitowego bloku.       *
      *                                                                      *
      ***********************************************************************/


      sblk = (unsigned char)DesSbox[j][row][col];

      for (k = 4; k < 8; k++) {

         bit_set(fblk, p, bit_get(&sblk, k));
         p++;

      }

   }

   /**************************************************************************
   *                                                                         *
   *  Permutacja P-ramki w celu zakończenia wyliczania f.                    *
   *                                                                         *
   **************************************************************************/


   permute(fblk, DesPbox, 32);

   /**************************************************************************
   *                                                                         *
   *  Wyliczanie XOR lewego bloku i f.                                       *
   *                                                                         *
   **************************************************************************/


   bit_xor(lblk, fblk, xblk, 32);

   /**************************************************************************
   *                                                                         *
   *  Ustawienie lewego bloku dla tury.                                      *
   *                                                                         *
   **************************************************************************/


   memcpy(lblk, rblk, 4);

   /**************************************************************************
   *                                                                         *
   *  Ustawienie prawego bloku dla tury.                                     *
   *                                                                         *
   **************************************************************************/


   memcpy(rblk, xblk, 4);

}

/*****************************************************************************
*                                                                            *
*  Ustawienie tekstu docelowego tak, aby zawierał p[onownie połączone bloki  *
*  prawy i lewy.                                                             *
*                                                                            *
*****************************************************************************/


memcpy(&target[0], rblk, 4);
memcpy(&target[4], lblk, 4);

/*****************************************************************************
*                                                                            *
*  Permutacja końcowa.                                                       *
*                                                                            *
*****************************************************************************/


permute(target, DesFinal, 64);

return 0;

}

/*****************************************************************************
*                                                                            *
*  ----------------------------- des_encipher -----------------------------  *
*                                                                            *
*****************************************************************************/


void des_encipher(const unsigned char *plaintext, unsigned char *ciphertext,
   const unsigned char *key) {

des_main(plaintext, ciphertext, key, encipher);

return;

}

/*****************************************************************************
*                                                                            *
*  ----------------------------- des_decipher -----------------------------  *
*                                                                            *
*****************************************************************************/


void des_decipher(const unsigned char *ciphertext, unsigned char *plaintext,
   const unsigned char *key) {

des_main(ciphertext, plaintext, key, decipher);

return;

}


KOD cpp:     UKRYJ  
// Plik źródłowy np. des.h
//---------------------------------------------------------------------------
#ifndef desH
#define desH
//---------------------------------------------------------------------------
extern void des_encipher(const unsigned char *plaintext, unsigned char *ciphertext, const unsigned char *key);
extern void des_decipher(const unsigned char *ciphertext, unsigned char *plaintext, const unsigned char *key) ;
//---------------------------------------------------------------------------
#endif
I okazuje się że nadal sypie tymi błędami.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
kwgrkwgr
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 13 kwietnia 2011, 16:37
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WinXP Win7
Kompilator: C++ Builder 6;
C++ Builder 2010;
MS Visual 2008 C#;
Gadu Gadu: 9692051
    Windows XPOpera

Re: [DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez Cyfrowy Baron » niedziela, 8 maja 2011, 10:25

Nie wiem! Kod wydaj się w porządku. Utwórz moduł des.* w C++Builder, w menu File masz przecież New Unit, czy jakoś podobnie. Utworzone zostaną dwa pliki *.cpp i *.h. Zapisz je pod nazwą des a utworzone zostaną dwa pliki des.cpp i des.h. Przecież opisałem jak się tworzy moduły w C++Builder.

Inna możliwość dodaj pliki des.* które masz do projektu poprzez menu Project -> Add to project.

Skoro masz pliki des.c i des.h to nie wiem, czy C++Builder 6 domyślnie łączy plik des.c z plikiem des.h a wszak do projektu włączasz przez sekcję include plik *.h.

Ewentualnie zmień rozszerzenie pliku des.c na des.cpp
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez kwgrkwgr » niedziela, 8 maja 2011, 10:32

Niestety postąpiłem bardzo mało ambitnie. Skopiowałem zawartość 2 plików des.c i bit.c do Unit1.cpp i idzie a wygląda tak:
KOD cpp:     UKRYJ  
// Plik źródłowy np. Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
//****************************************************************************
/*****************************************************************************
*                                                                            *
*  --------------------------------- bit.c --------------------------------  *
*                                                                            *
*****************************************************************************/


#include <string.h>

#include "bit.h"

/*****************************************************************************
*                                                                            *
*  -------------------------------- bit_get -------------------------------  *
*                                                                            *
*****************************************************************************/


int bit_get(const unsigned char *bits, int pos) {

unsigned char      mask;

int                i;

/*****************************************************************************
*                                                                            *
*  Ustawiamy maskę na pobierany bit.                                         *
*                                                                            *
*****************************************************************************/


mask = 0x80;

for (i = 0; i < (pos % 8); i++)
   mask = mask >> 1;

/*****************************************************************************
*                                                                            *
*  Pobieramy bit.                                                            *
*                                                                            *
*****************************************************************************/


return (((mask & bits[(int)(pos / 8)]) == mask) ? 1 : 0);

}

/*****************************************************************************
*                                                                            *
*  -------------------------------- bit_set -------------------------------  *
*                                                                            *
*****************************************************************************/


void bit_set(unsigned char *bits, int pos, int state) {

unsigned char      mask;

int                i;

/*****************************************************************************
*                                                                            *
*  Ustawiamy maskę na ustawiany bit.                                         *
*                                                                            *
*****************************************************************************/


mask = 0x80;

for (i = 0; i < (pos % 8); i++)
   mask = mask >> 1;

/*****************************************************************************
*                                                                            *
*  Ustawiamy bit.                                                            *
*                                                                            *
*****************************************************************************/


if (state)
   bits[pos / 8] = bits[pos / 8] | mask;
else
   bits[pos / 8] = bits[pos / 8] & (~mask);

return;

}

/*****************************************************************************
*                                                                            *
*  -------------------------------- bit_xor -------------------------------  *
*                                                                            *
*****************************************************************************/


void bit_xor(const unsigned char *bits1, const unsigned char *bits2, unsigned
   char *bitsx, int size) {

int                i;

/*****************************************************************************
*                                                                            *
*  Wyliczamy bitowe XOR (LUB wyłączające) dwóch buforów.                     *
*                                                                            *
*****************************************************************************/


for (i = 0; i < size; i++) {

   if (bit_get(bits1, i) != bit_get(bits2, i))
      bit_set(bitsx, i, 1);
   else
      bit_set(bitsx, i, 0);

}

return;

}

/*****************************************************************************
*                                                                            *
*  ----------------------------- bit_rot_left -----------------------------  *
*                                                                            *
*****************************************************************************/


void bit_rot_left(unsigned char *bits, int size, int count) {

int                fbit,
                   lbit,
                   i,
                   j;

/*****************************************************************************
*                                                                            *
*  Przesuwamy bufor w lewo o wskazaną liczbę bitów.                          *
*                                                                            *
*****************************************************************************/


if (size > 0) {

   for (j = 0; j < count; j++) {

      for (i = 0; i <= ((size - 1) / 8); i++) {


         /********************************************************************
         *                                                                   *
         *  Pobieramy bit wysuwany poza bieżący bajt.                        *
         *                                                                   *
         ********************************************************************/


         lbit = bit_get(&bits[i], 0);

         if (i == 0) {

            /*****************************************************************
            *                                                                *
            *  Zapamiętujemy bit z pierrwszego bajtu.                        *
            *                                                                *
            *****************************************************************/


            fbit = lbit;

            }

         else {

            /*****************************************************************
            *                                                                *
            *  Ustawiamy prawy bit poprzedniego bajta na wartość lewego bita *
            *  wysuwanego poza bieżący bajt.                                 *
            *                                                                *
            *****************************************************************/


            bit_set(&bits[i - 1], 7, lbit);

         }

         /********************************************************************
         *                                                                   *
         *  Przesuwamy bieżący bajt w lewo.                                  *
         *                                                                   *
         ********************************************************************/


         bits[i] = bits[i] << 1;

      }

      /***********************************************************************
      *                                                                      *
      *  Ustawiamy prawy bit bufora na wartość bita przesuniętego poza       *
      *  pierwszy bajt.                                                      *
      *                                                                      *
      ***********************************************************************/


      bit_set(bits, size - 1, fbit);

   }

}

return;

}



//*****************************************************************************

//*****************************************************************************
// Plik źródłowy np. des.c
/*****************************************************************************
*                                                                            *
*  --------------------------------- des.c --------------------------------  *
*                                                                            *
*****************************************************************************/


#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "des.h"     ////////////////
#include "bit.h"
#include "encrypt.h"

/*****************************************************************************
*                                                                            *
*  Odwzorowanie opisujące przekształcanie klucza.                            *
*                                                                            *
*****************************************************************************/


static const int DesTransform[56] = {

   57, 49, 41, 33, 25, 17,  9,  1, 58, 50, 42, 34, 26, 18,
   10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,
   63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22,
   14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,  4

};

/*****************************************************************************
*                                                                            *
*  Liczba rotacji przy wylcizaniu podkluczy.                                 *
*                                                                            *
*****************************************************************************/


static const int DesRotations[16] = {

   1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1

};

/*****************************************************************************
*                                                                            *
*  Odwzorowowanie do wyboru podkluczy z permutacją.                          *
*                                                                            *
*****************************************************************************/


static const int DesPermuted[48] = {

   14, 17, 11, 24,  1,  5,  3, 28, 15,  6, 21, 10,
   23, 19, 12,  4, 26,  8, 16,  7, 27, 20, 13,  2,
   41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
   44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32

};

/*****************************************************************************
*                                                                            *
*  Odwzorowanie opisujące permutację początkową bloków danych.               *
*                                                                            *
*****************************************************************************/


static const int DesInitial[64] = {

   58, 50, 42, 34, 26, 18, 10,  2, 60, 52, 44, 36, 28, 20, 12,  4,
   62, 54, 46, 38, 30, 22, 14,  6, 64, 56, 48, 40, 32, 24, 16,  8,
   57, 49, 41, 33, 25, 17,  9,  1, 59, 51, 43, 35, 27, 19, 11,  3,
   61, 53, 45, 37, 29, 21, 13,  5, 63, 55, 47, 39, 31, 23, 15,  7

};

/*****************************************************************************
*                                                                            *
*  Odwzorowanie opisujące permutację rozszerzającą bloków danych.            *
*                                                                            *
*****************************************************************************/


static const int DesExpansion[48] = {

   32,  1,  2,  3,  4,  5,  4,  5,  6,  7,  8,  9,
    8,  9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
   16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
   24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32,  1

};

/*****************************************************************************
*                                                                            *
*  Tablice odpowiadające podstawioniom S-ramek na blokach danych.            *
*                                                                            *
*****************************************************************************/


static const int DesSbox[8][4][16] = {

   {
   {14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7},
   { 0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8},
   { 4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0},
   {15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13},
   },

   {
   {15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10},
   { 3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5},
   { 0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15},
   {13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9},
   },

   {
   {10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8},
   {13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1},
   {13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7},
   { 1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12},
   },

   {
   { 7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15},
   {13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9},
   {10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4},
   { 3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14},
   },

   {
   { 2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9},
   {14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6},
   { 4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14},
   {11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3},
   },

   {
   {12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11},
   {10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8},
   { 9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6},
   { 4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13},
   },

   {
   { 4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1},
   {13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6},
   { 1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2},
   { 6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12},
   },

   {
   {13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7},
   { 1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2},
   { 7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8},
   { 2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11},
   },

};

/*****************************************************************************
*                                                                            *
*  Odwzorowanie permutacji P-ramki na blokach danych.                        *
*                                                                            *
*****************************************************************************/


static const int DesPbox[32] = {

   16,  7, 20, 21, 29, 12, 28, 17,  1, 15, 23, 26,  5, 18, 31, 10,
    2,  8, 24, 14, 32, 27,  3,  9, 19, 13, 30,  6, 22, 11,  4, 25

};

/*****************************************************************************
*                                                                            *
*  Odwzorowanie permutacji kończowej na blokach danych.                      *
*                                                                            *
*****************************************************************************/


static const int DesFinal[64] = {

   40,  8, 48, 16, 56, 24, 64, 32, 39,  7, 47, 15, 55, 23, 63, 31,
   38,  6, 46, 14, 54, 22, 62, 30, 37,  5, 45, 13, 53, 21, 61, 29,
   36,  4, 44, 12, 52, 20, 60, 28, 35,  3, 43, 11, 51, 19, 59, 27,
   34,  2, 42, 10, 50, 18, 58, 26, 33,  1, 41,  9, 49, 17, 57, 25

};

/*****************************************************************************
*                                                                            *
*  Definicja typu służącego do rozróżnienia szyfrowania i deszyfrowania.     *
*                                                                            *
*****************************************************************************/


typedef enum DesEorD_ {encipher, decipher} DesEorD;

/*****************************************************************************
*                                                                            *
*  -------------------------------- permute -------------------------------  *
*                                                                            *
*****************************************************************************/


static void permute(unsigned char *bits, const int *mapping, int n) {

unsigned char      temp[8];

int                i;

/*****************************************************************************
*                                                                            *
*  Permutacja bufora za pomocą odwzorowania n-pozycyjnego.                   *
*                                                                            *
*****************************************************************************/


memset(temp, 0, (int)ceil(n / 8));

for (i = 0; i < n; i++)
   bit_set(temp, i, bit_get(bits, mapping[i] - 1));

memcpy(bits, temp, (int)ceil(n / 8));

return;

}

/*****************************************************************************
*                                                                            *
*  ------------------------------- des_main -------------------------------  *
*                                                                            *
*****************************************************************************/


static int des_main(const unsigned char *source, unsigned char *target, const
   unsigned char *key, DesEorD direction) {

static unsigned char subkeys[16][7];

unsigned char        temp[8],
                     lkey[4],
                     rkey[4],
                     lblk[6],
                     rblk[6],
                     fblk[6],
                     xblk[6],
                     sblk;

int                  row,
                     col,
                     i,
                     j,
                     k,
                     p;

/*****************************************************************************
*                                                                            *
*  Jeśli key ma wartość NULL, używamy podkluczy wyliczonych uprzednio.       *
*                                                                            *
*****************************************************************************/


if (key != NULL) {

   /**************************************************************************
   *                                                                         *
   *  Kopia lokalna klucza.                                                  *
   *                                                                         *
   **************************************************************************/


   memcpy(temp, key, 8);

   /**************************************************************************
   *                                                                         *
   *  Permutacja i kompresja klucza na 56 bitów.                             *
   *                                                                         *
   **************************************************************************/


   permute(temp, DesTransform, 56);

   /**************************************************************************
   *                                                                         *
   *  Podział klucza na dwia 28-bitowe bloki.                                *
   *                                                                         *
   **************************************************************************/


   memset(lkey, 0, 4);
   memset(rkey, 0, 4);

   for (j = 0; j < 28; j++)
      bit_set(lkey, j, bit_get(temp, j));

   for (j = 0; j < 28; j++)
      bit_set(rkey, j, bit_get(temp, j + 28));

   /**************************************************************************
   *                                                                         *
   *  Wyliczanie podkluczy dla poszczególnych tur.                           *
   *                                                                         *
   **************************************************************************/


   for (i = 0; i < 16; i++) {

      /***********************************************************************
      *                                                                      *
      *  Rotacja poszczególnych bloków według ich tury.                      *
      *                                                                      *
      ***********************************************************************/


      bit_rot_left(lkey, 28, DesRotations[i]);
      bit_rot_left(rkey, 28, DesRotations[i]);

      /***********************************************************************
      *                                                                      *
      *  Złączanie bloków w pojedyncz podklucz.                              *
      *                                                                      *
      ***********************************************************************/


      for (j = 0; j < 28; j++)
         bit_set(subkeys[i], j, bit_get(lkey, j));

      for (j = 0; j < 28; j++)
         bit_set(subkeys[i], j + 28, bit_get(rkey, j));

      /***********************************************************************
      *                                                                      *
      *  Permutacja z wyborem.                                               *
      *                                                                      *
      ***********************************************************************/


      permute(subkeys[i], DesPermuted, 48);

   }

}

/*****************************************************************************
*                                                                            *
*  Lokalna kopia tekstu źródłowego.                                          *
*                                                                            *
*****************************************************************************/


memcpy(temp, source, 8);

/*****************************************************************************
*                                                                            *
*  Permutacja początkowa.                                                    *
*                                                                            *
*****************************************************************************/


permute(temp, DesInitial, 64);

/*****************************************************************************
*                                                                            *
*  Podziała tekstu źródłowego na lewy i prawy blok, oba po 32 bity.          *
*                                                                            *
*****************************************************************************/


memcpy(lblk, &temp[0], 4);
memcpy(rblk, &temp[4], 4);

/*****************************************************************************
*                                                                            *
*  Zaszyfrowanie lub odszyfrowanie tekstu źródłowego.                        *
*                                                                            *
*****************************************************************************/


for (i = 0; i < 16; i++) {

   /**************************************************************************
   *                                                                         *
   *  Zaczynamy wyliczanie f.                                                *
   *                                                                         *
   **************************************************************************/


   memcpy(fblk, rblk, 4);

   /**************************************************************************
   *                                                                         *
   *  Permutacja i rozszerzenie kopii prawego bloku na 48 bitów.             *
   *                                                                         *
   **************************************************************************/


   permute(fblk, DesExpansion, 48);

   /**************************************************************************
   *                                                                         *
   *  Zastsowanie podklucza odpowiedniego dla danej tury.                    *
   *                                                                         *
   **************************************************************************/


   if (direction == encipher) {

      /***********************************************************************
      *                                                                      *
      *  W przypadku szyfrowania klucze stosujemy w kolejności rosnącej.     *
      *                                                                      *
      ***********************************************************************/


      bit_xor(fblk, subkeys[i], xblk, 48);
      memcpy(fblk, xblk, 6);

      }

   else {

      /***********************************************************************
      *                                                                      *
      *  W przypadku deszyfrowania klucze stosujemy w kolejności malejącej.  *
      *                                                                      *
      ***********************************************************************/


      bit_xor(fblk, subkeys[15 - i], xblk, 48);
      memcpy(fblk, xblk, 6);

   }

   /**************************************************************************
   *                                                                         *
   *  Podstawienia S-ramek.                                                  *
   *                                                                         *
   **************************************************************************/


   p = 0;

   for (j = 0; j < 8; j++) {

      /***********************************************************************
      *                                                                      *
      *  Wyliczanie wiersza i kolumny w tabilcy S-ramek.                     *
      *                                                                      *
      ***********************************************************************/


      row = (bit_get(fblk, (j * 6)+0) * 2) + (bit_get(fblk, (j * 6)+5) * 1);
      col = (bit_get(fblk, (j * 6)+1) * 8) + (bit_get(fblk, (j * 6)+2) * 4) +
            (bit_get(fblk, (j * 6)+3) * 2) + (bit_get(fblk, (j * 6)+4) * 1);

      /***********************************************************************
      *                                                                      *
      *  Podstawienie S-ramki według aktualnego sześciobitowego bloku.       *
      *                                                                      *
      ***********************************************************************/


      sblk = (unsigned char)DesSbox[j][row][col];

      for (k = 4; k < 8; k++) {

         bit_set(fblk, p, bit_get(&sblk, k));
         p++;

      }

   }

   /**************************************************************************
   *                                                                         *
   *  Permutacja P-ramki w celu zakończenia wyliczania f.                    *
   *                                                                         *
   **************************************************************************/


   permute(fblk, DesPbox, 32);

   /**************************************************************************
   *                                                                         *
   *  Wyliczanie XOR lewego bloku i f.                                       *
   *                                                                         *
   **************************************************************************/


   bit_xor(lblk, fblk, xblk, 32);

   /**************************************************************************
   *                                                                         *
   *  Ustawienie lewego bloku dla tury.                                      *
   *                                                                         *
   **************************************************************************/


   memcpy(lblk, rblk, 4);

   /**************************************************************************
   *                                                                         *
   *  Ustawienie prawego bloku dla tury.                                     *
   *                                                                         *
   **************************************************************************/


   memcpy(rblk, xblk, 4);

}

/*****************************************************************************
*                                                                            *
*  Ustawienie tekstu docelowego tak, aby zawierał p[onownie połączone bloki  *
*  prawy i lewy.                                                             *
*                                                                            *
*****************************************************************************/


memcpy(&target[0], rblk, 4);
memcpy(&target[4], lblk, 4);

/*****************************************************************************
*                                                                            *
*  Permutacja końcowa.                                                       *
*                                                                            *
*****************************************************************************/


permute(target, DesFinal, 64);

return 0;

}

/*****************************************************************************
*                                                                            *
*  ----------------------------- des_encipher -----------------------------  *
*                                                                            *
*****************************************************************************/


void des_encipher(const unsigned char *plaintext, unsigned char *ciphertext,
   const unsigned char *key) {

des_main(plaintext, ciphertext, key, encipher);

return;

}

/*****************************************************************************
*                                                                            *
*  ----------------------------- des_decipher -----------------------------  *
*                                                                            *
*****************************************************************************/


void des_decipher(const unsigned char *ciphertext, unsigned char *plaintext,
   const unsigned char *key) {

des_main(ciphertext, plaintext, key, decipher);

return;

}






//*****************************************************************************

char *StrToHexStr(char *str)
{
 char *newstr = new char[(strlen(str)*2)+1];
 char *cpold = str;
 char *cpnew = newstr;

 while('\0' != *cpold) {
 sprintf(cpnew, "%02X", (char)(*cpold++));
 cpnew+=2;
 }
 *(cpnew) = '\0';
 return(newstr);
}

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

void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned char      destmp[8],
                   desptx[8],
                   desctx[8],
                   deskey[8];

Huge               rsatmp,
                   rsaptx,
                   rsactx;

RsaPubKey          rsapubkey;
RsaPriKey          rsaprikey;

int                i;

destmp[0] = 0xab;
destmp[1] = 0xc0;
destmp[2] = 0x00;
destmp[3] = 0x00;
destmp[4] = 0x00;
destmp[5] = 0x00;
destmp[6] = 0x00;
destmp[7] = 0x00;

deskey[0] = 0x12;
deskey[1] = 0x30;
deskey[2] = 0x00;
deskey[3] = 0x00;
deskey[4] = 0x00;
deskey[5] = 0x00;
deskey[6] = 0x00;
deskey[7] = 0x00;

des_encipher(destmp, desctx, deskey);
des_decipher(desctx, desptx, deskey);
AnsiString ttt = "";
ttt = (char)destmp;
/*
Memo1->Lines->Add(destmp);
Memo1->Lines->Add(desctx);
Memo1->Lines->Add(desctx);
Memo1->Lines->Add(desptx);
Memo1->Lines->Add(deskey);               /**/

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        Edit1->Text = "";
        Edit2->Text = "";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
       char * test = StrToHexStr(Edit1->Text.c_str());
       Edit2->Text =  test;
}
//---------------------------------------------------------------------------


Teraz pozostałe operacje jak wpisywanie z Edit1 do tabeli bajtów a później ich wyświetlanie.
Niestety prosta konstrukcja Memo1->Lines->Add(destmp); nie działa lub Memo1->Lines->Add((char)destmp); lub działa niepoprawnie więc będę musiał pomyśleć w jaki sposób tab unsigned char wpisać do AnsiString.

A konkretnie chcę jak najszybciej zrobić:
Kod: Zaznacz cały
3.   Przekształcić program CIPHER.PAS (CIPH.CPP) i odpowiednie procedury tak aby było możliwe wykonanie operacji szyfrowania i deszyfrowania jednego bloku tekstu zawierającego znaki   kodu   szesnastkowego.   Wprowadzić opcję pozwalającą na   używanie   stałego   klucza   i   jego   zmianę na żądanie.
4.   Dostosować opracowany program do szyfrowania i deszyfrowania bloków zawierających znaki  kodu ASCII.
(CIPH.CPP)  - to program od wykładowcy którego nie kumam a robi to samo co ten z książki Helion gdzie jest chociaż jakoś opisany

Oddać program i mieć kurs przedmiot z głowy.
Avatar użytkownika
kwgrkwgr
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 13 kwietnia 2011, 16:37
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WinXP Win7
Kompilator: C++ Builder 6;
C++ Builder 2010;
MS Visual 2008 C#;
Gadu Gadu: 9692051
    Windows XPOpera

Re: [DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez Cyfrowy Baron » niedziela, 8 maja 2011, 10:47

Jak rozumiem błędy już się nie pojawiają. Kopiując zawartość pliku powinieneś skopiować do pliku *.cpp z pliku *.c tylko to co znajduje się pod wpisem: #pragma resource "*.dfm". Powinieneś też zachować porządek i wpisy incude umieszczać razem, a nie rozrzucać je po całym pliku.



kwgrkwgr napisał(a):Niestety prosta konstrukcja Memo1->Lines->Add(destmp); nie działa lub Memo1->Lines->Add((char)destmp); lub działa niepoprawnie


Jeżeli coś nie działa to opisz problem: jak działa i dlaczego nie działa.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez kwgrkwgr » niedziela, 8 maja 2011, 11:05

KOD cpp:     UKRYJ  
Memo1->Lines->Add(destmp);
Memo1->Lines->Add(desctx);
Memo1->Lines->Add(desctx);
Memo1->Lines->Add(desptx);
Memo1->Lines->Add(deskey);  

[C++ Error] Unit1.cpp(836): E2034 Cannot convert 'unsigned char *' to 'AnsiString'
[C++ Error] Unit1.cpp(836): E2342 Type mismatch in parameter 'S' (wanted 'const AnsiString', got 'unsigned char *')
[C++ Error] Unit1.cpp(837): E2034 Cannot convert 'unsigned char *' to 'AnsiString'
[C++ Error] Unit1.cpp(837): E2342 Type mismatch in parameter 'S' (wanted 'const AnsiString', got 'unsigned char *')
[C++ Error] Unit1.cpp(838): E2034 Cannot convert 'unsigned char *' to 'AnsiString'
[C++ Error] Unit1.cpp(838): E2342 Type mismatch in parameter 'S' (wanted 'const AnsiString', got 'unsigned char *')
[C++ Error] Unit1.cpp(839): E2034 Cannot convert 'unsigned char *' to 'AnsiString'
[C++ Error] Unit1.cpp(839): E2342 Type mismatch in parameter 'S' (wanted 'const AnsiString', got 'unsigned char *')
[C++ Error] Unit1.cpp(840): E2034 Cannot convert 'unsigned char *' to 'AnsiString'
[C++ Error] Unit1.cpp(840): E2342 Type mismatch in parameter 'S' (wanted 'const AnsiString', got 'unsigned char *')


A tym drugim przypadku zapisuje tylko pojedynczy znak i jeszcze niepoprawnie.
Teraz walczę z konstrukcją:
KOD cpp:     UKRYJ  
AnsiString ttt = "";
for( i = 0 ; i < 8 ; i++) ttt += (int)destmp[i];
Memo1->Lines->Add(ttt);   ttt = "";

for( i = 0 ; i < 8 ; i++) ttt += desctx[i];
Memo1->Lines->Add(ttt);   ttt = "";

for( i = 0 ; i < 8 ; i++) ttt += deskey[i];
Memo1->Lines->Add(ttt);   ttt = "";

des_encipher(destmp, desctx, deskey);
ttt = "";
for( i = 0 ; i < 8 ; i++) ttt += destmp[i];
Memo1->Lines->Add(ttt);   ttt = "";

for( i = 0 ; i < 8 ; i++) ttt += desctx[i];
Memo1->Lines->Add(ttt);   ttt = "";

for( i = 0 ; i < 8 ; i++) ttt += deskey[i];
Memo1->Lines->Add(ttt);   ttt = "";
des_decipher(desctx, desptx, deskey);
ttt = "";
for( i = 0 ; i < 8 ; i++) ttt += destmp[i];
Memo1->Lines->Add(ttt);   ttt = "";

for( i = 0 ; i < 8 ; i++) ttt += desctx[i];
Memo1->Lines->Add(ttt);   ttt = "";

for( i = 0 ; i < 8 ; i++) ttt += deskey[i];
Memo1->Lines->Add(ttt);   ttt = "";
Pokazuje już coś więcej lecz w liczbach 0..9 a ma być 0..F (0..FF). Myślę czy to robię poprawnie czy nie?

W pliku z książki Helion wyświetlanie było pod konsolą i wyglądało tak:
KOD cpp:     UKRYJ  
fprintf(stdout, "Przed zaszyfrowaniem\n");

fprintf(stdout, "destmp: %02x %02x %02x %02x %02x %02x %02x %02x\n",
   destmp[0], destmp[1], destmp[2], destmp[3], destmp[4], destmp[5],
   destmp[6], destmp[7]);

fprintf(stdout, "deskey: %02x %02x %02x %02x %02x %02x %02x %02x\n",
   deskey[0], deskey[1], deskey[2], deskey[3], deskey[4], deskey[5],
   deskey[6], deskey[7]);

des_encipher(destmp, desctx, deskey);

fprintf(stdout, "Po zaszyfrowaniu\n");

fprintf(stdout, "destmp: %02x %02x %02x %02x %02x %02x %02x %02x\n",
   destmp[0], destmp[1], destmp[2], destmp[3], destmp[4], destmp[5],
   destmp[6], destmp[7]);

fprintf(stdout, "desctx: %02x %02x %02x %02x %02x %02x %02x %02x\n",
   desctx[0], desctx[1], desctx[2], desctx[3], desctx[4], desctx[5],
   desctx[6], desctx[7]);

fprintf(stdout, "Przed odszyfrowaniem\n");

fprintf(stdout, "desctx: %02x %02x %02x %02x %02x %02x %02x %02x\n",
   desctx[0], desctx[1], desctx[2], desctx[3], desctx[4], desctx[5],
   desctx[6], desctx[7]);

fprintf(stdout, "deskey: %02x %02x %02x %02x %02x %02x %02x %02x\n",
   deskey[0], deskey[1], deskey[2], deskey[3], deskey[4], deskey[5],
   deskey[6], deskey[7]);

des_decipher(desctx, desptx, deskey);

fprintf(stdout, "Po odszyfrowaniu\n");

fprintf(stdout, "desctx: %02x %02x %02x %02x %02x %02x %02x %02x\n",
   desctx[0], desctx[1], desctx[2], desctx[3], desctx[4], desctx[5],
   desctx[6], desctx[7]);

fprintf(stdout, "desptx: %02x %02x %02x %02x %02x %02x %02x %02x\n",
   desptx[0], desptx[1], desptx[2], desptx[3], desptx[4], desptx[5],
   desptx[6], desptx[7]);
Czy jest możliwe by zamiast na ekran wrzucać to do AnsiString a później do Memo?
Ostatnio edytowano niedziela, 8 maja 2011, 11:33 przez kwgrkwgr, łącznie edytowano 1 raz
Avatar użytkownika
kwgrkwgr
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 13 kwietnia 2011, 16:37
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WinXP Win7
Kompilator: C++ Builder 6;
C++ Builder 2010;
MS Visual 2008 C#;
Gadu Gadu: 9692051
    Windows XPOpera

Re: [DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez Cyfrowy Baron » niedziela, 8 maja 2011, 11:13

Czytaj komunikaty błędów ze zrozumieniem:

Cannot convert 'unsigned char *' to 'AnsiString' - nie można prze-konwertować zmiennej typu 'unsigned char *' na zmienną AnsiString
Type mismatch in parameter 'S' (wanted 'const AnsiString', got 'unsigned char *') - niezgodność parametru 'S' (potrzebny ''const AnsiString' otrzymany 'unsigned char *')

Nie wiem których linii dotyczą te komunikaty, więc trudno mi powiedzieć gdzie jest błąd, ale przypuszczam, że chodzi o to:

KOD cpp:     UKRYJ  
ttt += (int)destmp[ i ];


Nie możesz inkrementować zmiennej typu AnsiString (ttt) zmienną typu int ( (int)destmp[i] )

Spróbuj tak:

KOD cpp:     UKRYJ  
int ttt = 0;
for( i = 0 ; i < 8 ; i++) ttt += (int)destmp[i];
Memo1->Lines->Add(ttt);   ttt = 0;

for( i = 0 ; i < 8 ; i++) ttt += desctx[i];
Memo1->Lines->Add(ttt);   ttt = 0;

for( i = 0 ; i < 8 ; i++) ttt += deskey[i];
Memo1->Lines->Add(ttt);   ttt = 0;

des_encipher(destmp, desctx, deskey);
ttt = 0;
for( i = 0 ; i < 8 ; i++) ttt += destmp[i];
Memo1->Lines->Add(ttt);   ttt = 0;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez kwgrkwgr » niedziela, 8 maja 2011, 11:59

Dzięki lecz chodziło mi o taki sposób wyświetlania:
KOD cpp:     UKRYJ  
tttt = "Tablica destmp = ";
for( i = 0 ; i < 8 ; i++){  tttt += IntToHex((int)destmp[i], 2);}
 Memo1->Lines->Add(tttt);

tttt = "Tablica desctx = ";
for( i = 0 ; i < 8 ; i++){  tttt += IntToHex((int)desctx[i], 2);}
 Memo1->Lines->Add(tttt);

tttt = "Tablica deskey = ";
for( i = 0 ; i < 8 ; i++){  tttt += IntToHex((int)deskey[i], 2);}
 Memo1->Lines->Add(tttt);
To oznacza że ten kawałek programu miałbym już chyba za sobą. Teraz Jak Wpisać dane z Edit1->Text do deskey i do destmp.
Funkcja
KOD cpp:     UKRYJ  
char *StrToHexStr(char *str)
{
 char *newstr = new char[(strlen(str)*2)+1];
 char *cpold = str;
 char *cpnew = newstr;

 while('\0' != *cpold) {
 sprintf(cpnew, "%02X", (char)(*cpold++));
 cpnew+=2;
 }
 *(cpnew) = '\0';
 return(newstr);
}
Jak na razie dobrze sobie daje radę taką operacją lecz podaje ona szesnastkowo numer znaku ASCII.
A pasowała mi by funkcja postaci byte DanaSzest = Edit2->Text.toHex. Po prostu to co mam zapisane 0..5..9..F zapisać jako int czy coś inngo. A niestety funkcja .ToInt() wywala się dla znaków a..f. Muszę pomyśleć.
Avatar użytkownika
kwgrkwgr
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 13 kwietnia 2011, 16:37
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WinXP Win7
Kompilator: C++ Builder 6;
C++ Builder 2010;
MS Visual 2008 C#;
Gadu Gadu: 9692051
    Windows XPOpera

Re: [DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez Cyfrowy Baron » niedziela, 8 maja 2011, 12:07

kwgrkwgr napisał(a):Teraz Jak Wpisać dane z Edit1->Text do deskey i do destmp.


Podając nazwy zmiennych podawaj również jakiego są typu. Domyślam się że to typ char, więc przy wpisywaniu użyj funkcji sprintf:

coś w tym stylu:

KOD cpp:     UKRYJ  
char Buf[100];
sprintf(Buf, "%s", Edit1->Text.c_str());


dopasuj sobie...

Przy konwersji ze zmiennej String na char stosuje się funkcję .c_str().
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez kwgrkwgr » poniedziałek, 9 maja 2011, 20:14

Ponawiam pytanie wraz z wyjaśnieniami (Teraz Jak Wpisać dane z Edit1->Text do deskey i do destmp.)

By sprawdzić czy program działał na sztywno mam:
KOD cpp:     UKRYJ  
unsigned char      destmp[8],
                   desptx[8],
                   desctx[8],
                   deskey[8];

destmp[0] = 0xab;
destmp[1] = 0xc0;
destmp[2] = 0x00;
destmp[3] = 0x00;
destmp[4] = 0x00;
destmp[5] = 0x00;
destmp[6] = 0x00;
destmp[7] = 0x00;

deskey[0] = 0x12;
deskey[1] = 0x30;
deskey[2] = 0x00;
deskey[3] = 0x00;
deskey[4] = 0x00;
deskey[5] = 0x00;
deskey[6] = 0x00;
deskey[7] = 0x00;

A chodzi o jak to tych 2 tablic przesłać dane z Edit1->Text ? Jak zrobię Edit1->Text.c_str() to otrzymam wskaźnik na tab char ale chyba nie o to chodzi?
Jak zrobić by dana postaci AnsiString tt = "ABC0000000000000"; przeszła do "destmp" . Jak to zrzutować?



W załącznikach program w który podajemy klucz DES HEX lub jako ASCII i możemy zaszyfrować tekst do postaci wynikowej ASCII (nie polecam) lub HEX oraz zapisać lub wczytać plik tekstowy. Może komuś się przyda? Jest obsługa trybu CBC. Kod na pewno nie jest super lecz jakoś działa.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
kwgrkwgr
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 13 kwietnia 2011, 16:37
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WinXP Win7
Kompilator: C++ Builder 6;
C++ Builder 2010;
MS Visual 2008 C#;
Gadu Gadu: 9692051
    Windows XPOpera

Re: [DES] Jak podpiąć i funkcję z innego pliku c cpp?

Nowy postprzez polymorphism » wtorek, 10 maja 2011, 10:10

Jak zrobić by dana postaci AnsiString tt = "ABC0000000000000"; przeszła do "destmp" . Jak to zrzutować?

Np. tak:
KOD cpp:     UKRYJ  
unsigned char destmp[8];

if(sscanf(Edit1->Text.c_str(), "%llx", &destmp[0]) != 1) throw "fuck!";
reverse(destmp, destmp + 8);

/* lub */

if(!(istringstream(Edit1->Text.c_str()) >> hex >> *((__int64*)&destmp)))throw "fuck!";
reverse(destmp, destmp + 8);
 
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron