Lev
3 years ago
7 changed files with 451 additions and 24 deletions
@ -0,0 +1,13 @@ |
|||||||
|
# Квантовая криптография - менторский проект |
||||||
|
|
||||||
|
|
||||||
|
## Симулятор |
||||||
|
|
||||||
|
Симулятор лежит в папке `model`. Его главные элементы: |
||||||
|
|
||||||
|
- Абстрактный класс `Channel` ([тут](model/channel.py)). В нем описаны методы, которые должны быть у канала. |
||||||
|
Теоретически можно написать реализацию даже для реального оборудования, но тут есть только `ChannelSym` - симуляция канала. |
||||||
|
|
||||||
|
- Класс `Alice` ([тут](model/alice.py)). Объекты этого класса используют канал (то есть объект любого класса, реализующего абстрактные методы из `Channel`) и реализуют протокол генерации ключа BB84 со стороны отправителя. |
||||||
|
- Класс `Bob` ([тут](model/bob.py)). Как Алиса, только не Алиса, а Боб: реализует получателя в протоколе |
||||||
|
- Класс `EveBS` ([тут](model/eve.py)). Реализует beam splitter атаку на `ChannelSym` |
File diff suppressed because one or more lines are too long
@ -0,0 +1,30 @@ |
|||||||
|
from dataclasses import dataclass, field |
||||||
|
import typing |
||||||
|
from random import choice, uniform |
||||||
|
|
||||||
|
|
||||||
|
@dataclass |
||||||
|
class EveBS: |
||||||
|
hijack_probability: float = 0.45 |
||||||
|
my_basises: typing.List[bool] = field(default_factory=list) |
||||||
|
obtained_data: typing.List[typing.Optional[bool]] = field(default_factory=list) |
||||||
|
|
||||||
|
def process_photons(self, photons: typing.List[typing.Tuple[bool, bool]]) -> typing.List[typing.Tuple[bool, bool]]: |
||||||
|
basis = choice([False, True]) |
||||||
|
self.my_basises.append(basis) |
||||||
|
clicks = [0, 0] |
||||||
|
passed = [] |
||||||
|
for photon in photons: |
||||||
|
if uniform(0, 1) <= self.hijack_probability: |
||||||
|
photon_bit, photon_basis = photon |
||||||
|
if photon_basis == basis: |
||||||
|
clicks[photon_bit] += 1 |
||||||
|
else: |
||||||
|
clicks[choice([0, 1])] += 1 |
||||||
|
else: |
||||||
|
passed.append(photon) |
||||||
|
if any(clicks) and not all(clicks): |
||||||
|
self.obtained_data.append(bool(clicks[1])) |
||||||
|
else: |
||||||
|
self.obtained_data.append(None) |
||||||
|
return passed |
Loading…
Reference in new issue