generator liczb pseudolosowych i LFSR

0

Cześć,
Mam do napisania generator liczb pseudolosowych bazujący na LFSR o zadanym stopniu wielomianu. Problem w tym, że nie mam pojęcia jak się za to zabrać. Prawdopodobnie mam zrobić do tego szyfrowanie i odszyfrowanie. Ktoś podpowie lub poda jakiś ciekawy artykuł do przestudiowania? Jakie przykładowe dane wejściowe mogą być w tym zadaniu?

1

Masz tutaj kod dla 56-cio bitowego lfsra z Wikipedii:

#include <stdint.h>
#include <stdio.h>


int
main(void)
{
	uint64_t start_state = 0x12345678UL;
	uint64_t lfsr = start_state;

	int i = 102;
	do
	{
		uint64_t lsb = lfsr & 1LL;

		lfsr >>= 1LL;
		lfsr ^= (-lsb & ((1UL << 55) | (1UL << 54) | (1UL << 34) | (1UL << 33)));
		printf("%014lx\n", lfsr);
	} while (--i > 0);
	return (0);
}

Tutaj link dla innych wielomianów http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf - zrób sobie tablicę gdzie dla ilości bitów masz po prostu wielomian zapisany w postaci stałej. A, no i do szyfrowania to jednak bym tego nie używał. That's all folks.

0

@kapojot:
Ogólnie od wczoraj czytam o tym i nie bardzo dalej rozumiem, jak to zakodzić i o co chodzi. Ktoś może mi napisać jakieś przykładowe dane WEJSCIOWE? Musze zrobić szyfrowanie i deszyfrację danych. W materiałach, które przeglądałem często pojawia się "seed" i "tap" - co to jest?
Następna sprawa skąd mam wiedzieć w których miejsach te bramki XOR mam łączyć?
Dokładna treść zadania brzmi:
title
Nie wiem jak sie za to zabrać i jak z tymi danymi wejsciowymi.

0

W powyższym kodzie:
seed = start_state
tap = lfsr
Może tak będzie łatwiej.

1

Dobra, wyjaśnienie:
LFSR generuje pseudolosowy strumień liczb o określonej długości (n bitów), który posiada ciekawą cechę okresu o długości 2^n-1 elementów. Oznacza to, że jeśli np. n = 3, to dostaniesz wszystkie liczby z zakresu 1 - 7 w losowej kolejności i żadna nie powtórzy się do momentu kolejnego okresu LFSR. To jest z jednej strony dobre (np. jako generator noncek do różnej maści szyfrów, w tym AES-GCM) ale z drugiej strony osłabia potencjalne szyfry strumieniowe oparte na takim generatorze. Problem z LFSR jest też taki, że atakujący, znając szyfrowane plaintext (bo to np. fragment html) może przy wyłapaniu odpowiedniej ilości danych ustalić stan LFSR i od tego momentu predykuje w przód wyjście pseudolosowe, co umożliwia mu odszyfrowanie całej komunikacji. Dlatego mówiłem, że to słabe.

Skoro jesteśmy już przy szyfrach strumieniowych, to szyfry strumieniowy składa się z generatora pseudolosowego sterowanego (seedowanego) kluczem. Oznacza to, że jeśli dwa razy ustawisz seed na taką samą wartość to dostaniesz dokładnie te same sekwencje danych. Szyfr strumieniowy po prostu xoruje wyjście generatora z plaintextem aby otrzymać wyjście. W drugą stronę działa to dokładnie tak samo, dostajesz szyfrogram, który jest deszyfrowany za pomocą wyjścia z LFSR. Jak będę miał chwilę czasu, to zrobię Ci taką implementację

0

Kod z Wikipedii:

# include <stdint.h>
int main(void) {
    uint16_t start_state = 0xACE1u;  /* Any nonzero start state will work. */
    uint16_t lfsr = start_state;
    unsigned period = 0;

    do {
        unsigned lsb = lfsr & 1;   /* Get LSB (i.e., the output bit). */
        lfsr >>= 1;                /* Shift register */
        if (lsb)                   /* If the output bit is 1, apply toggle mask. */
            lfsr ^= 0xB400u;
        ++period;
    } while (lfsr != start_state);

    return 0;
}

Gdzie w tym przykładzie znajduję się tzw. tap? I czym jest ta maska ( 0xB400u )?
LINK Czytałem o tym LFSR tu i ten tap ma odpowiadać, które bity się XORuje. Tylko nie widzę tego w tym kodzie z Wikipedii.

0

Tap to ta maska - ona definiuje bity, które zmienią stan lfsra na kolejny. Ja przez "tapnięcie" rozumiem przexorowanie stanu, stąd powyższa wypowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1