#define MAX_TITKOS 10000
#define OLVASAS_BUFFER 512
#define KULCS_MERET 6
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
double
atlagos_szohossz (const char *titkos, int titkos_meret)
{
int sz = 0;
for (int i = 0; i < titkos_meret; ++i)
if (titkos[i] == ' ')
++sz;
return (double) titkos_meret / sz;
}
int
tiszta_lehet (const char *titkos, int titkos_meret)
{
// a tiszta szoveg valszeg tartalmazza a gyakori magyar szavakat
// illetve az átlagos szóhossz vizsgálatával csökkentjük a
// potenciális töréseket
double szohossz = atlagos_szohossz (titkos, titkos_meret);
return szohossz > 6.0 && szohossz < 9.0
&& strcasestr (titkos, "hogy") && strcasestr (titkos, "nem")
&& strcasestr (titkos, "az") && strcasestr (titkos, "ha");
}
void
exor (const char kulcs[], int kulcs_meret, char titkos[], int titkos_meret, char* buffer)
{
int kulcs_index = 0;
for (int i = 0; i < titkos_meret; ++i)
{
buffer[i] = titkos[i] ^ kulcs[kulcs_index];
kulcs_index = (kulcs_index + 1) % kulcs_meret;
}
}
void
exor_tores (const char kulcs[], int kulcs_meret, char titkos[],
int titkos_meret)
{
char *buffer;
if ((buffer
= (char *)malloc(sizeof(char)*titkos_meret
)) == NULL
) {
printf("Memoria szetbombazva...\n"); }
exor (kulcs, kulcs_meret, titkos, titkos_meret, buffer);
if (tiszta_lehet (buffer, titkos_meret))
printf("Kulcs: [%s]\nTiszta szoveg: %s\n", kulcs
, buffer
);
}
int
main (void)
{
char titkos[MAX_TITKOS];
char* p = titkos;
int olvasott_bajtok;
unsigned int key;
// titkos fajt berantasa
while ((olvasott_bajtok =
read (0, (void *) p,
(p - titkos + OLVASAS_BUFFER <
MAX_TITKOS) ? OLVASAS_BUFFER : titkos + MAX_TITKOS - p)))
p += olvasott_bajtok;
// maradek hely nullazasa a titkos bufferben
for (int i = 0; i < MAX_TITKOS - (p - titkos); ++i)
titkos[p - titkos + i] = '\0';
// osszes kulcs eloallitasa
#pragma omp parallel for
for (key = 0; key < 1000000; key++)
{
char* kulcs;
if ((kulcs
= (char *)malloc(sizeof(char)*KULCS_MERET
)) == NULL
) {
printf("Memoria szetbombazva...\n"); }
exor_tores (kulcs, KULCS_MERET, titkos, p - titkos);
if (key
% 10000000 == 0) printf("PARAM"); }
return 0;
}
I2RlZmluZSBNQVhfVElUS09TIDEwMDAwCiNkZWZpbmUgT0xWQVNBU19CVUZGRVIgNTEyCiNkZWZpbmUgS1VMQ1NfTUVSRVQgNiAKI2RlZmluZSBfR05VX1NPVVJDRQoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+Cgpkb3VibGUKYXRsYWdvc19zem9ob3NzeiAoY29uc3QgY2hhciAqdGl0a29zLCBpbnQgdGl0a29zX21lcmV0KQp7CiAgaW50IHN6ID0gMDsKICBmb3IgKGludCBpID0gMDsgaSA8IHRpdGtvc19tZXJldDsgKytpKQogICAgaWYgKHRpdGtvc1tpXSA9PSAnICcpCiAgICAgICsrc3o7CgogIHJldHVybiAoZG91YmxlKSB0aXRrb3NfbWVyZXQgLyBzejsKfQoKaW50CnRpc3p0YV9sZWhldCAoY29uc3QgY2hhciAqdGl0a29zLCBpbnQgdGl0a29zX21lcmV0KQp7CiAgLy8gYSB0aXN6dGEgc3pvdmVnIHZhbHN6ZWcgdGFydGFsbWF6emEgYSBneWFrb3JpIG1hZ3lhciBzemF2YWthdAogIC8vIGlsbGV0dmUgYXogw6F0bGFnb3Mgc3rDs2hvc3N6IHZpenNnw6FsYXTDoXZhbCBjc8O2a2tlbnRqw7xrIGEKICAvLyBwb3RlbmNpw6FsaXMgdMO2csOpc2VrZXQKCiAgZG91YmxlIHN6b2hvc3N6ID0gYXRsYWdvc19zem9ob3NzeiAodGl0a29zLCB0aXRrb3NfbWVyZXQpOwoKICByZXR1cm4gc3pvaG9zc3ogPiA2LjAgJiYgc3pvaG9zc3ogPCA5LjAKICAgICYmIHN0cmNhc2VzdHIgKHRpdGtvcywgImhvZ3kiKSAmJiBzdHJjYXNlc3RyICh0aXRrb3MsICJuZW0iKQogICAgJiYgc3RyY2FzZXN0ciAodGl0a29zLCAiYXoiKSAmJiBzdHJjYXNlc3RyICh0aXRrb3MsICJoYSIpOwoKfQoKdm9pZApleG9yIChjb25zdCBjaGFyIGt1bGNzW10sIGludCBrdWxjc19tZXJldCwgY2hhciB0aXRrb3NbXSwgaW50IHRpdGtvc19tZXJldCwgY2hhciogYnVmZmVyKQp7CgogIGludCBrdWxjc19pbmRleCA9IDA7CgogIGZvciAoaW50IGkgPSAwOyBpIDwgdGl0a29zX21lcmV0OyArK2kpCiAgICB7CgogICAgICBidWZmZXJbaV0gPSB0aXRrb3NbaV0gXiBrdWxjc1trdWxjc19pbmRleF07CiAgICAgIGt1bGNzX2luZGV4ID0gKGt1bGNzX2luZGV4ICsgMSkgJSBrdWxjc19tZXJldDsKCiAgICB9Cgp9Cgp2b2lkCmV4b3JfdG9yZXMgKGNvbnN0IGNoYXIga3VsY3NbXSwgaW50IGt1bGNzX21lcmV0LCBjaGFyIHRpdGtvc1tdLAoJICAgIGludCB0aXRrb3NfbWVyZXQpCnsKICBjaGFyICpidWZmZXI7CgogIGlmICgoYnVmZmVyID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpKnRpdGtvc19tZXJldCkpID09IE5VTEwpCiAgewogICAgICBwcmludGYoIk1lbW9yaWEgc3pldGJvbWJhenZhLi4uXG4iKTsKICAgICAgZXhpdCgtMSk7CiAgfQoKICBleG9yIChrdWxjcywga3VsY3NfbWVyZXQsIHRpdGtvcywgdGl0a29zX21lcmV0LCBidWZmZXIpOwoKICBpZiAodGlzenRhX2xlaGV0IChidWZmZXIsIHRpdGtvc19tZXJldCkpCiAgICAgcHJpbnRmKCJLdWxjczogWyVzXVxuVGlzenRhIHN6b3ZlZzogJXNcbiIsIGt1bGNzLCBidWZmZXIpOwogIAogIGZyZWUoYnVmZmVyKTsKfQoKaW50Cm1haW4gKHZvaWQpCnsKCiAgY2hhciB0aXRrb3NbTUFYX1RJVEtPU107CiAgY2hhciogcCA9IHRpdGtvczsKICBpbnQgb2x2YXNvdHRfYmFqdG9rOwogIHVuc2lnbmVkIGludCBrZXk7CgogIC8vIHRpdGtvcyBmYWp0IGJlcmFudGFzYQogIHdoaWxlICgob2x2YXNvdHRfYmFqdG9rID0KCSAgcmVhZCAoMCwgKHZvaWQgKikgcCwKCQkocCAtIHRpdGtvcyArIE9MVkFTQVNfQlVGRkVSIDwKCQkgTUFYX1RJVEtPUykgPyBPTFZBU0FTX0JVRkZFUiA6IHRpdGtvcyArIE1BWF9USVRLT1MgLSBwKSkpCiAgICBwICs9IG9sdmFzb3R0X2JhanRvazsKCiAgLy8gbWFyYWRlayBoZWx5IG51bGxhemFzYSBhIHRpdGtvcyBidWZmZXJiZW4gIAogIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1RJVEtPUyAtIChwIC0gdGl0a29zKTsgKytpKQogICAgdGl0a29zW3AgLSB0aXRrb3MgKyBpXSA9ICdcMCc7CgogIC8vIG9zc3plcyBrdWxjcyBlbG9hbGxpdGFzYQogICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvcgogIGZvciAoa2V5ID0gMDsga2V5IDwgMTAwMDAwMDsga2V5KyspCiAgewogICAgICBjaGFyKiBrdWxjczsKCiAgICAgIGlmICgoa3VsY3MgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqS1VMQ1NfTUVSRVQpKSA9PSBOVUxMKQogICAgICB7CiAgICAgICAgICBwcmludGYoIk1lbW9yaWEgc3pldGJvbWJhenZhLi4uXG4iKTsKICAgICAgICAgIGV4aXQoLTEpOwogICAgICB9CgogICAgICBzcHJpbnRmKGt1bGNzLCAiJS42ZCIsIGtleSk7CgogICAgICBleG9yX3RvcmVzIChrdWxjcywgS1VMQ1NfTUVSRVQsIHRpdGtvcywgcCAtIHRpdGtvcyk7CiAgICAgIGZyZWUoa3VsY3MpOwogICAgICAKICAgICAgaWYgKGtleSAlIDEwMDAwMDAwID09IDApIHByaW50ZigiUEFSQU0iKTsKICB9CgoKICByZXR1cm4gMDsKfQ==