Mam problem z odkodowaniem szyfru. Stosuje się do tych wzorów E(a,b,x)=a*x+b(mod 26), D(a,b,x)=a`*(x-b)(mod 26), ale chyba coś jest nie tak… Pewnie banał. Będę wdzięczny za pomoc.
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
string alfabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int b=alfabet.size();
string tekst="TOJESTZAKODOWANAWIADOMOSC";
string codetable;
string uncodetable;
int a=tekst.size();
string code, uncode;
int k0=2;
int k1=3;
for (int i=0; i
{
codetable+=alfabet[(i*k1+k0)%26];
}
for (int i=0; i
{
for (int j=0; j
{
if (tekst[i]==alfabet[j])
{
code+=codetable[j];
}
}
}
for (int i=0; i
{
uncodetable+=codetable[(i*(k1-k0))%26]; //wzor odszyfrowujacy
}
for (int i=0; i
{
for (int j=0; j
{
if (code[i]==codetable[j])
{
uncode+=uncodetable[j];
}
}
}
cout<
system("PAUSE");
return EXIT_SUCCESS;
}
[/code]
no tak… to ja akurat wiem… tyle że nie mogę wymyśleć jak powinien wyglądać algorytm odszyfrowujący (ta feralna linijka), m.in problem sprawia to modulo, bo nie wiem jak je uwzględnić.
Właśnie dlatego podałem tamten link, bo tam jest wyjaśnione jak sobie z tym poradzić. No ale tu masz gotowca:
#include
using namespace std;
int main(int argc, char *argv[])
{
// http://www.shodor.org/interactivate/discussions/CryptographyCipher/
string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string text = "TOJESTZAKODOWANAWIADOMOSC";
int a = 3;
int b = 2;
int aSize = alphabet.size();
int tSize = text.size();
string code, codetable, uncode, uncodetable;
int c,d;
for (int i = 0; i < aSize; i++)
{
codetable += alphabet[(i*a+b)%aSize];
}
for (int i = 0; i < tSize; i++)
{
for (int j = 0; j < aSize; j++)
{
if (text[i] == alphabet[j])
{
code += codetable[j];
}
}
}
for (int i = 1; i <= aSize; i++)
{
c = aSize*i+1;
if (c%a == 0)
{
c /= a;
break;
}
}
for (int i = 0; i < aSize; i++)
{
d = (c*(i-b))%aSize;
if (d < 0) d += aSize;
uncodetable += codetable[d];
}
for (int i = 0; i < tSize; i++)
{
for (int j = 0; j < aSize; j++)
{
if (code[i] == codetable[j])
{
uncode += uncodetable[j];
}
}
}
cout<
cin.get();
return 0;
}
[/code]
EDIT:
Jeszcze jedno … tekstu nie musisz mieć takiego zbitego. Możesz wprowadzić znak spacji do alfabetu i wówczas szyfrować wiadomość “TO JEST ZAKODOWANA WIADOMOSC”. Należy tylko przy tym pamiętać, żeby największym wspólnym dzielnikiem a i ilości znaków w alfabecie było 1. W tym wypadku będziesz miał 27 znaków w alfabecie, czyli jako a możesz użyć np. 4 zamiast 3.