#!/usr/bin/perl

# $wiadomosc_wyjsciowa = klucz_jednorazowy( $wiadomosc_wejsciowa, $szyfr, $pozycja )
#
# Szyfrowanie lub odszyfrowywania $wiadomosc_wejsciowa przy uzyciu bitow 
# od polozenia $pozycja w pliku $szyfr. Po wykorzystaniu nalezy usunac te bity.
# (Nie nalezy odszyfrowywac wiadomosci poza kolejka, gdyz spowodowaloby
# to usuniecie bitow klucza wymaganych do przetworzenia innej wiadomosci.
# System musi obslugiwac funkcje truncate.)
#
sub klucz_jednorazowy {
    my ( $wiad, $szyfr, $pozycja ) = @_;
    my $dlugosc = length( $wiad );

    return undef
        if $pozycja < 0
        or ! -f $szyfr
        or ($pozycja + $dlugosc) > -s _;

    open PAD, "<$szyfr" or return undef;
    seek PAD, 2, -$pozycja or return undef;
    my $klucz;
    sysread PAD, $klucz, $dlugosc or return undef;
    close PAD;
    truncate $szyfr, $pozycja;

    return ($wiad ^ $klucz);
}

