shad-go/otp/README.md

27 lines
2.1 KiB
Markdown
Raw Normal View History

2020-02-28 17:26:29 +00:00
# otp
Напишите код, который реализует схему шифрования [stream cipher](https://en.wikipedia.org/wiki/Stream_cipher).
Потоковый шифр обрабатывает поток по одному байту за раз. Каждый байт входного потока xor-ится с байтом из prng и записывается в выходной поток.
Вам нужно реализовать две версии api.
```golang
func NewReader(r io.Reader, prng io.Reader) io.Reader
func NewWriter(w io.Writer, prng io.Reader) io.Writer
```
* `NewReader` принимает входной поток `r` и генератор случайных чисел `prng`. `NewReader` возвращает
`io.Reader`, который читает поток из `r` и расшифровывает его с помощью `prng`.
* `NewWriter` принимает выходной поток `w` и генератор случайных чисел `prng`. `NewWriter` возвращает
`io.Writer`, который шифрует поток с помощью `prng` и пишет его в `w`.
Вы можете считать, что prng никогда не может вернуть ошибку.
## Замечания
- Прочитайте контракт [io.Reader](https://golang.org/pkg/io/#Reader) и [io.Writer](https://golang.org/pkg/io/#Writer) в документации.
- То что шифр работает с одним байтом, не значит что нужно передавать в Read() слайс размера 1.
- Функция `NewReader` не должна ничего читать из `r` и `prgn`.
2020-02-28 17:26:29 +00:00
- Подумайте, почему потоковый шифр в стандартной библиотеке имеет интерфейс [cipher.Stream](https://golang.org/pkg/crypto/cipher/#Stream), а не `io.Reader` как у нас.
- Для отладки вы можете использовать `iotest.NewReadLogger` и `iotest.NewWriteLogger` из пакета [iotest](https://golang.org/pkg/testing/iotest/).