Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Szyfrowanie przy użyciu permutacji.

Ostatnio zmodyfikowano 2014-01-25 12:28
Autor Wiadomość
Rafals
Temat założony przez niniejszego użytkownika
Szyfrowanie przy użyciu permutacji.
» 2014-01-18 20:32:46
Witam.
Jedna z wytycznych co do projektu to:
"program losuje klucz do szyfrowania, który jest dowolną permutacją o długości  co najwyżej 1024 elementy".
Mam rozumieć przez to, że tworzę sobie tablicę np o wielkości 500 i wpisuję w nią losowe wartości z zakresu ilości kolumn tablicy, której używam do kodowania tekstu?
Czyli np
tab = {0,1,2, 2,0,1, 0,2,1...} itd.?


Mam dodatkowy problem, nie mam pojęcia jak napisać sprawdzanie czy liczby w trójkach są różne od siebie. Tzn, nie wiem jak sprawdzać np w 2 trójce, 3 itd.

To jest pomysł na ten problem, ale coś nie idzie:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

bool czybyla( int tab[], int wylosowana, int indeks, int trojka )
{
    if( indeks == 0 )
         return true;
   
    for( int i = trojka; i < indeks; i++ )
    if( tab[ i ] == wylosowana )
         return false;
   
    return true;
}

int main()
{
    srand( time( NULL ) );
    int tab[ 500 ];
    int kluczlos;
    int a = 0;
   
    for( int i = 0; i < 500; i++ )
         tab[ i ] = - 1;
   
    for( int i = 0; i < 500; )
    {
        kluczlos = rand() % 3;
        if( i != 0 && i % 3 == 0 )
             a += 3;
       
        if( czybyla( tab, kluczlos, i, a ) )
        {
            tab[ i ] = kluczlos;
            i++;
        }
    }
   
    for( int i = 0; i < 500; i++ )
         cout << tab[ i ];
   
    return 0;
}

Problem rozwiązany z losowaniem trójek, w których są cyfry różne od siebie.

Pytanie dotyczące klucza nadal aktualne. Czy ten kod jest poprawny dla wymagania z projektu?
P-102490
Wiesiek
» 2014-01-20 10:19:55
Permutacja o długości n, to tablica t[n], w której stoją liczby bez powtórzeń o wartościach od 0 do n-1. Informacja t/==b oznacza, że liczbę o numerze a wstawiamy na pozycji b. W szyfrowaniu słowo "program"  szyfrujemy permutacją długości 7 przestawiając według wzoru permutacji litery, np permutacja 3,5,0,1,2,6,4 da szyfrogram "gapromr"
P-102595
Rafals
Temat założony przez niniejszego użytkownika
» 2014-01-22 19:49:34
Czyli zadanie polega na tym, aby wylosować liczby z przedziału 0 do 1024 i według tego przestawiać litery z kolejnych wierszy.
Więc napiszę sobie tutaj idee programu i jak byście mogli rzucić okiem czy o to chodzi.
Losuję sobie klucz o długości 1024. Następnie mam plik tekstowy o długości 2000 znaków.
klucz = {1020, 3, 513, 439, 989,... } itd.
Teraz mam w sumie dwie opcje i wydaje mi się że jedna z nich jest prostsza do napisania.
1) Ta łatwiejsza, pobieram 1020 znak z wiersza i zapisuję na zerowej pozycji nowej zmiennej tekstowej, pobieram 3 znak i zapisuję na pierwszej pozycji nowej zmiennej, pobieram 513 znak i zapisuję na drugiej pozycji, itd.

2) Pobieram 1 znak i zapisuję na 1020 pozycji nowej zmiennej tekstowej, pobieram drugi znak i zapisuję na 3 pozycji itd.

Następnie zapisuję wynik do pliku.
Ogólna idea dobra?
P-102872
Wiesiek
» 2014-01-24 11:13:51
W szyfrowaniu przestawieniowym (czyli permutacyjnym) długość szyfrowanego tekstu powinna być wielokrotnością długości klucza. Jeśli tekst jest zbyt krótki, to można jego koniec uzupełnić wybranym znakiem (albo umówionym zestawem, np. w razie potrzeby uzupełnienia w tekście do szyfrowania na koniec wstawiamy dwie kropki i dowolny ciąg znaków, aby uzyskać wymaganą długość). W Twoim przypadku tekst jawny ma 2000 znaków, więc poszerzasz go do 2048 znaków. Dalej szyfrujesz według drugiej metody (ja omyłkowo podałem sposób deszyfrowania tekstu zaszyfrowanego)
P-103028
Rafals
Temat założony przez niniejszego użytkownika
» 2014-01-25 00:56:40
Więc, ogarnąłem szyfrowanie. Teraz mam problem z odszyfrowaniem. Szyfrowanie zrobiłem w sposób pierwszy. Odszyfrować chcę tak, że do nowego stringa na pozcyje podana z pliku klucza, przypisuję kolejne litery z pliku z szyfrem.
Dla przykładu.
rafal
plik_klucz = {3,4,2,1,0}
plik_szyfr = alfar

Problem polega na tym że jak podam do nowego stringa aby na pozycji 3 zapisał a, na pozycji 4 zapisał l, na pozycji 2 zapisał f, na pozycji 1 zapisał a i na pozycji 0 zapisał r. Problem jest w momencie jeżeli jest to ciąg znaków. W programie i zestawie danych które posiadam, np klucz zaczyna się liczbą 856 i na tej pozycji powinien mi zapisać pierwszy znak z szyfru. Lecz on zapisuje ciąg znaków z szyfru od 856 miejsca...
Kod:
C/C++
deszyfrowanie_klucz( tab_klucz );
do
{
    cout << "Wprowadz nazwe pliku z zaszyfrowanymi danymi.\n";
    cout << "Nazwa pliku bez rozszezenia: ";
    cin.clear();
    cin.sync();
    cin >> plik_dane_de;
    plik_dane_de += ".txt";
    plik.open( plik_dane_de.c_str() );
    if( !plik.good() )
         cout << "\nBrak pliku w folderze z programem lub zostala wprowadzona bledna nazwa pliku.\n\n";
   
} while( !plik.good() );

while( true )
{
    plik >> dane;
    tekst = dane;
    //cout << tekst << endl;
    //getch();
    if( !plik.good() )
         break;
   
}
//cout << tekst;
//cout << tekst.length();
for( int i = 0; i < ROZMIAR_KLUCZA; i++ )
{
    //cout << tab_klucz[i] << endl;
    dane_de_2[ tab_klucz[ i ] ] += tekst[ i ];
    //cout << dane_de_2 << endl;
    getch();
}
//cout << dane_de_2;
//for(int i=0; i<ROZMIAR_KLUCZA; i++)
//  cout << tab_klucz[i];
getch();
break;
funkcja deszyfrowanie_klucz po prostu przypisuje liczby klucza z pliku do tablicy.
P-103126
stryku
» 2014-01-25 03:16:17
TO POD SPODEM JEST GŁUPIE BO NIE DOCZYTAŁEM. DALEJ JEST ODP

Jeżeli dobrze rozumiem to powinno być tak chyba
C/C++
for( int i = 0; i < ROZMIAR_KLUCZA; i++ )
{
    //cout << tab_klucz[i] << endl;
    dane_de_2[ i ] += tekst[ tab_klucz[ i ] ];
    //cout << dane_de_2 << endl;
    getch();
}

To już będzie mądrzejsze
C/C++
#include <string>
#include <iostream>

const int rozmiar = 5;

using namespace std;

int main() {
    // your code goes here
    int plik_klucz[ rozmiar ] = { 3, 4, 2, 1, 0 };
    string plik_szyfr = "alfar",
    wynik = plik_szyfr;
   
    for( int i = 0; i < rozmiar; i++ )
         wynik[ plik_klucz[ i ] ] = plik_szyfr[ i ];
   
    cout << wynik;
   
    return 0;
}
takie coś naskrobałem i działa
myślę, że zamiast
C/C++
dane_de_2[ tab_klucz[ i ] ] += tekst[ i ];
dałbyś
C/C++
dane_de_2[ tab_klucz[ i ] ] = tekst[ i ];
i by działało
P-103128
Rafals
Temat założony przez niniejszego użytkownika
» 2014-01-25 12:28:58
Ok skoro problem rozwiązany usuwam ostatni wpis i zamieszczam poprawny kod oraz wyedytowany. Pewnie ilość zmiennych można jeszcze zmniejszyć, aby dla case1 i 2 były po prostu te same. Ale to później, bo już mi głowa pęka :P
P-103134
« 1 »
  Strona 1 z 1