CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [RSA] Przekroczenie zakresu (char)

[RSA] Przekroczenie zakresu (char)

dział ogólny

[RSA] Przekroczenie zakresu (char)

Nowy postprzez kwgrkwgr » sobota, 7 maja 2011, 18:59

Mam za zadanie napisać program który będzie robił takie rzeczy:
2. Wykorzystując funkcje z programu RSA_KEY napisać i uruchomić własny program, który będzie wykonywał następujące czynności:
- generował klucze kryptograficzne,
- szyfrował jeden znak w kodzie ASCII i drukował wynik szyfrowania,
- deszyfrował utworzony kryptogram i drukował wynik deszyfrowania.
W wyniku szyfrowania znaków kodu ASCII można otrzymać liczby dwubajtowe. Przy drukowaniu kryptogramów w postaci znakowej należy wówczas używać dwóch znaków.
3. Zastosować opracowany program do szyfrowania i deszyfrowania plików dyskowych.


To co mam aktualnie pod linkiem: http://chomikuj.pl/kwgr/Ciekawostki/RSA/lab5+BBC*2b*2b.rar

A mój problem to właśnie: liczby dwubajtowe nie bardzo rozumie co mam zrobić? W C# wiem że wszystko jest zapisywane na 2 bajtach ale jak zrobić to w Borland 6 C++?
Tu kawałki kodu:

KOD cpp:     UKRYJ  
        AnsiString Text1 = "";
        AnsiString Text2 = "";
        int i = 0;
        int OdcztChar = 0;
        char temp ;
        Text1 = Memo2->Lines->Text ;
        if(CheckBox1->Checked)
        for( i = 1 ; i <= Text1.Length() ; i++)
        {
          OdcztChar = (int)Text1.operator [](i);
          Text2 +=  (char)potega_mod((long)OdcztChar,Klucz_e,p);
        }

        if(!CheckBox1->Checked)
        Text2 = Text1;
        Memo3->Lines->Text = Text2;


KOD cpp:     UKRYJ  
        AnsiString Text1 = "";
        AnsiString Text2 = "";
        int i = 0;
        int OdcztChar = 0;
        char temp ;
        Text1 = Memo3->Lines->Text ;
        for( i = 1 ; i <= Text1.Length() ; i++)
        {
          OdcztChar = (int)Text1.operator [](i);
          Text2 +=  (char)potega_mod((long)OdcztChar,Klucz_d,p);
        }
        Memo4->Lines->Text = Text2;


Wersja dla pojedyńczego znaku (szyfrowanie i opreracja odwrotna):
KOD cpp:     UKRYJ  
        int OdcztChar = (int)Edit1->Text.operator [](1);
        if(CheckBox1->Checked)
        OdcztChar = potega_mod((long)OdcztChar,Klucz_e,p);
        Edit2->Text = OdcztChar;

       int OdcztChar = Edit2->Text.ToInt();
       if(CheckBox1->Checked)
       OdcztChar = potega_mod((long)OdcztChar,Klucz_d,p);
       Edit3->Text = (char)OdcztChar;



Nie wiem jak z 3 punktem? Czy wystarczy? Problem może polegać na tym że ja mam to dla plików txt a nie wiem czy ma być dla (*.*)?
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: [RSA] Przekroczenie zakresu (char)

Nowy postprzez polymorphism » sobota, 7 maja 2011, 20:17

KOD cpp:     UKRYJ  
OdcztChar = (int)Text1.operator [](i);

Heh, a tak nie prościej:
KOD cpp:     UKRYJ  
OdcztChar = (int)Text1[ i ];

:?:
A mój problem to właśnie: liczby dwubajtowe nie bardzo rozumie co mam zrobić?

Chodzi (chyba) o to, że jeśli w wyniku szyfrowania znaku otrzymasz wartość 16 bitową, wtedy musisz ją rozbić na dwie wartości ośmiobitowe, które kolejno wyświetlasz.
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

Re: [RSA] Przekroczenie zakresu (char)

Nowy postprzez kwgrkwgr » sobota, 7 maja 2011, 21:23

Czasem pojawia mi się problem z rzutowaniem, oto przykład:
d - > ‰ -> f
a powinno być:
d - > ‰ -> d
jak wyłączę konwersję to mam:
d - > 137 -> d (137 - to poprawna wartość odczytana)
a w przypadku
KOD cpp:     UKRYJ  
OdcztChar = (int)Edit2->Text[1];

odczytuje mi "-119"

To zależy od wylosowanych danych do RSA, raz działa OK a czasem nie.
Jak inaczej mógłbym to odczytać? Nie jest to tak bardzo ważne ale przydałoby się wiedzieć.
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: [RSA] Przekroczenie zakresu (char)

Nowy postprzez polymorphism » sobota, 7 maja 2011, 21:42

W sumie nie bardzo rozumiem, o czym piszesz.
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

Re: [RSA] Przekroczenie zakresu (char)

Nowy postprzez kwgrkwgr » sobota, 7 maja 2011, 21:45

OK bo też tego za bardzo nie rozumie ale rozwiązaniem tego by było zmienić kodowanie znaków tak by tak jak w C# każdy znak był kodowany 2 bajtowo.
Tylko że nie mam zielonego pojęcia jak to zrobić w Borland 6.

Znaki które otrzymuję są na tej stronie: http://impuls.elektroda.eu/joomla/index.php?option=com_content&view=article&id=201&Itemid=247
lecz nie wiem jak tego użyć.

Mogę ten projekt otworzyć w Builder 2010 a on wspiera Unicode lecz jak to rzutować?

Dzięki.
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: [RSA] Przekroczenie zakresu (char)

Nowy postprzez polymorphism » sobota, 7 maja 2011, 22:16

W C# znaki są dwubajtowe, bo tam ciągi znaków kodowane są w unikodzie (utf-16). W zadaniu masz kodować znaki ASCII, zatem kody są ośmiobitowe.

Widzę to tak:
KOD cpp:     UKRYJ  
long x = potega_mod((unsigned char)Text1[ i ], Klucz_e, p);
Text2 += (int) (unsigned char)x;
if(x > 255)
{
    Text2 +=  ' ';
    Text2 +=  (int) (unsigned char)(x >> 8);
}    
 

Przy założeniu, że x < 216
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

Re: [RSA] Przekroczenie zakresu (char)

Nowy postprzez kwgrkwgr » poniedziałek, 9 maja 2011, 12:45

Po rozmowie z wykładowcą wiem co miałem nie tak i co mam zmienić i o co się teraz zapytać.
To co potrzebuje:

Wiem że int ma 4 bajty lecz mi będą potrzebne tylko 2 bajty które będę wykorzystywał.
KOD cpp:     UKRYJ  
  // kodowanie znaku
unsigned OdczytZakod = potega_mod((long)OdcztChar,Klucz_e,n);
// n nie przekracza "FFFF" wiec wartość w OdczytZakod potrzebuję rozbić na 2 wartości FF i FF a potem obie rzutować na (char)
unsigned char PierwszyZnak =   // wyższe bajty int    
unsigned char DrugiZnak = // niższe bajty
AnsiString Tekst = (char)PierwszyZnak;   Tekst += (char)DrugiZnak;
 


KOD cpp:     UKRYJ  
// odkowanie znaku
unsigned char PierwszyZnak = Text1[ 1 ] ;
unsigned char DrugiZnak = Text1[ 2 ] ;

// jak to teraz połączyć w "int" ?  
Dzięki
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: [RSA] Przekroczenie zakresu (char)

Nowy postprzez polymorphism » poniedziałek, 9 maja 2011, 12:52

KOD cpp:     UKRYJ  
OdczytZakod = DrugiZnak;
OdczytZakod |= PierwszyZnak << 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

Re: [RSA] Przekroczenie zakresu (char)

Nowy postprzez Corvis » poniedziałek, 9 maja 2011, 13:14

albo

KOD cpp:     UKRYJ  
OdczytZakod = (PierwszyZnak + (DrugiZnak << 8));
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: [RSA] Przekroczenie zakresu (char)

Nowy postprzez polymorphism » poniedziałek, 9 maja 2011, 13:20

Corvis, według opisu PierwszyZnak to "wyższe bajty" a nie niższe.
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

Re: [RSA] Przekroczenie zakresu (char)

Nowy postprzez kwgrkwgr » poniedziałek, 9 maja 2011, 13:43

OK Działa choć nie końca wiem jak. To wystarczy.
Dla wyjaśnienia w polu Edit->Text = "AB" , potem A = PiwrszyZnak B = DrugiZnak (przebienie na postać liczbową 2 bajty) i potem odkodowanie. Konwersja na char.

KOD cpp:     UKRYJ  
// Rozdzielenie int na 2 składowe
   int OdczytZakod = Edit7->Text.ToInt();
   Edit9->Text =  OdczytZakod % 256;
   Edit8->Text =  OdczytZakod >> 8 ;

// Łączenie składowych w całość
int OdczytZakod = Edit8->Text.ToInt();
OdczytZakod |=  Edit7->Text.ToInt() << 8;
Edit9->Text = OdczytZakod;
Co do reszty to na razie wydaje mi się że wiem jak zrobić chodzi o rzutowania na (char).

W tekście który będę szyfrował po operacji szyfrowania mogą postać z znaki niedrukowalne, chciałbym sobie uprościć sprawę by zamiast int konwertować na na char to int konwertować na HEX przy użyciu funkcji " IntToHex() " lecz później by mi się przydała funkcja odwrotna lecz jej w Builder 6 nie widzę. Chodzi o to że bym miał w postaci stringa np: "A25B" i chciałbym to wstawić do int. HexStrToInt() nie mam dostępnej.

Która z tych funkcji które gdzieś znalazłem będzie najwłaściwsza:
KOD cpp:     UKRYJ  
int ConvertStrToInt( char* s )
{
    int  n = 0;
    char c = *s++;

    while( c >= '0' && c <= '9' )
    {
        n = n * 10 + (c - '0');
        c = *s++;
    }

    return n;
}

long ConvertHexStrToLong( char* s )
{
    int hexDigit[] = { 10, 11, 12, 13, 14, 15 };
    long n = 0;
    char c = *s++;

    while( c != '\0' )
    {
        if( c >= '0' && c <= '9' )
            n = n * 16 + (c - '0');
        else
        {
            c = tolower( c );
            n = n * 16 + hexDigit[(c - 'a')];
        }

        c = *s++;
    }

    return n;
}

unsigned int  hexstr2int(char* s)
{
  unsigned int n;
  int r;

  r = sscanf(s,"%x",&n);

  if (r != 1) {
    printf("error when change hex string to integer.");
    exit(0);
  }
  return n;
}

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);
}


Dzięki to podpowiedź.
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: [RSA] Przekroczenie zakresu (char)

Nowy postprzez Cyfrowy Baron » poniedziałek, 9 maja 2011, 15:20

kwgrkwgr napisał(a): Chodzi o to że bym miał w postaci stringa np: "A25B" i chciałbym to wstawić do int.


Nie możesz! Zmienna typu integer przechowuje tylko liczby całkowite, wiec nie możesz do zmiennej wstawić liter A i B. Może źle Ciebie zrozumiałem, a Ty po prostu chcesz zamienić wartość heksadecymalną na dziesiętną?! Jeżeli tak to proponuję coś takiego:

KOD cpp:     UKRYJ  
#include <tchar.h>
int HexToInt(const TCHAR *value)
{
 struct CHexMap
 {
  TCHAR chr;
  int value;
 };
 const int HexMapL = 16;
 CHexMap HexMap[HexMapL] =
 {
  {'0', 0}, {'1', 1},
  {'2', 2}, {'3', 3},
  {'4', 4}, {'5', 5},
  {'6', 6}, {'7', 7},
  {'8', 8}, {'9', 9},
  {'A', 10}, {'B', 11},
  {'C', 12}, {'D', 13},
  {'E', 14}, {'F', 15}
 };
 TCHAR *mstr = _tcsupr(_tcsdup(value));
 TCHAR *s = mstr;
 int result = 0;
 if(*s == '0' && *(s + 1) == 'X') s += 2;
 bool firsttime = true;
 while (*s != '\0')
 {
  bool found = false;
  for(int i = 0; i < HexMapL; i++)
  {
   if(*s == HexMap[i].chr)
   {
    if(!firsttime) result <<= 4;
    result |= HexMap[i].value;
    found = true;
    break;
   }
  }
  if(!found) break;
  s++;
  firsttime = false;
 }
 free(mstr);
 return result;
}
//---------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 String hex = "A25B"; /* lepiej mieć to w char, ale piszesz, że chodzi o String */

 Edit1->Text = String( HexToInt( hex.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: [RSA] Przekroczenie zakresu (char)

Nowy postprzez kwgrkwgr » poniedziałek, 9 maja 2011, 15:55

Dlaczego w AnsiString? Nie wiem przyzwyczaiłem się że prawie wszytko co jest tekstem ładuje do AnsiStrong.

Kolejny problem polega na tym że ten kawałek kodu działa lecz nie do końca:
Jest OK jeśli OdczytZakod > 255 , wówczas wpisuje 2 znaki i jest OK lecz jak jest do 255 to nie wstawia nic. Dlaczego?
KOD cpp:     UKRYJ  
                unsigned char A,B;
                A = OdczytZakod >> 8 ;
                B = OdczytZakod % 256  ;
                AnsiString tt = (char) A;
                tt +=  (char)         B;
                Edit2->Text = tt ;


To przechodzi i działa OK. O co chodzi z przypisaniem NULL do AnsiString? NULL == (char)0, a nie przypisaniem niczego?
KOD cpp:     UKRYJ  
                unsigned char A,B; AnsiString tt = "";
                A = OdczytZakod >> 8 ;
                B = OdczytZakod % 256  ;
                if(A != 0)  tt = (char) A;
                tt +=  (char)         B;
                Edit2->Text = tt ;
W załącznikach chyba gotowa aplikacja która spełnia wszystkie podpunkty wykładowcy. Jeszcze nie oceniona, ale chyba będzie OK. Dodatkowo jest zapis zaszyfrowanego tekstu w postaci HEX (unika się znaków które się nie wyświetlają) można przesyłać przez GG. Lecz wg jakiejś książki ta wersja algorytmu nie jest bezpieczna. Dlaczego? Niepamiętań.
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


  • 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ł: Google [Bot] i 4 gości