ΠΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» BB84 Π΄Π»Ρ ΠΊΠ²Π°Π½ΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ (QKD), Π½ΠΎ ΡΠΈΠΌΡΠ»ΠΈΡΡΠ΅ΠΌ ΠΊΠ²Π°Π½ΡΠΎΠ²ΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ΅ΡΠ΅Π· ΠΏΡΠ΅Π²Π΄ΠΎΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ ΡΠΈΡΠ»Π°.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ BB84:
cpp
#include <avr/random.h>
// ΠΠ²Π°Π½ΡΠΎΠ²ΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ (ΡΠΈΠΌΡΠ»ΡΡΠΈΡ)
enum QuantumState {
STATE_0, // |0>
STATE_1, // |1>
STATE_PLUS, // |+> = (|0> + |1>)/β2
STATE_MINUS // |-> = (|0> - |1>)/β2
};
// ΠΠ°Π·ΠΈΡΡ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ
enum Basis {
BASIS_Z, // ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² Z-Π±Π°Π·ΠΈΡΠ΅ (|0>, |1>)
BASIS_X // ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² X-Π±Π°Π·ΠΈΡΠ΅ (|+>, |->)
};
// ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΠΊΠ²Π°Π½ΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
QuantumState generateQuantumState() {
return (QuantumState)(rand() % 4);
}
// ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Π±Π°Π·ΠΈΡΠ°
Basis generateBasis() {
return (Basis)(rand() % 2);
}
// ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ²Π°Π½ΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π±Π°Π·ΠΈΡΠ΅
uint8_t measureQuantumState(QuantumState state, Basis basis) {
if (basis == BASIS_Z) {
return (state == STATE_0 || state == STATE_PLUS) ? 0 : 1;
} else {
return (state == STATE_0 || state == STATE_1) ? 0 : 1;
}
}
// ΠΡΠΎΡΠΎΠΊΠΎΠ» BB84 (ΠΠ»ΠΈΡΠ° ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ, ΠΠΎΠ± ΠΈΠ·ΠΌΠ΅ΡΡΠ΅Ρ)
struct BB84Result {
uint8_t aliceBits[128];
uint8_t bobBits[128];
Basis aliceBases[128];
Basis bobBases[128];
uint8_t keyLength;
uint8_t sharedKey[128];
};
BB84Result performBB84(uint8_t length) {
BB84Result result;
result.keyLength = 0;
// Π¨Π°Π³ 1: ΠΠ»ΠΈΡΠ° Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ Π±ΠΈΡΡ ΠΈ Π±Π°Π·ΠΈΡΡ
for (uint8_t i = 0; i < length; i++) {
result.aliceBits[i] = rand() % 2;
result.aliceBases[i] = generateBasis();
// ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΠΊΠ²Π°Π½ΡΠΎΠ²ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
QuantumState state;
if (result.aliceBits[i] == 0) {
state = (result.aliceBases[i] == BASIS_Z) ? STATE_0 : STATE_PLUS;
} else {
state = (result.aliceBases[i] == BASIS_Z) ? STATE_1 : STATE_MINUS;
}
// Π¨Π°Π³ 2: ΠΠΎΠ± ΠΈΠ·ΠΌΠ΅ΡΡΠ΅Ρ Π² ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΌ Π±Π°Π·ΠΈΡΠ΅
result.bobBases[i] = generateBasis();
result.bobBits[i] = measureQuantumState(state, result.bobBases[i]);
}
// Π¨Π°Π³ 3: Π‘ΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π°Π·ΠΈΡΠΎΠ² (ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ°Π½Π°Π»)
for (uint8_t i = 0; i < length; i++) {
if (result.aliceBases[i] == result.bobBases[i]) {
// ΠΠ°Π·ΠΈΡΡ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ - ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ Π±ΠΈΡ
result.sharedKey[result.keyLength] = result.aliceBits[i];
result.keyLength++;
}
}
// Π¨Π°Π³ 4: ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΠ΅ (ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΊΠ»ΡΡΠ°)
// ... (ΠΎΠΏΡΡΠ΅Π½ΠΎ Π΄Π»Ρ ΠΊΡΠ°ΡΠΊΠΎΡΡΠΈ)
return result;
}
// Π€ΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ (XOR Ρ ΠΊΠ»ΡΡΠΎΠΌ)
void encryptMessage(uint8_t* message, uint8_t len, uint8_t* key, uint8_t keyLen) {
for (uint8_t i = 0; i < len; i++) {
message[i] ^= key[i % keyLen];
}
}
void setup() {
Serial.begin(115200);
randomSeed(analogRead(A0));
// ΠΠ»ΠΈΡΠ° ΠΈ ΠΠΎΠ± ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ ΠΊΠ»ΡΡΠΎΠΌ
BB84Result result = performBB84(128);
Serial.print("ΠΠ²Π°Π½ΡΠΎΠ²ΡΠΉ ΠΊΠ»ΡΡ (");
Serial.print(result.keyLength);
Serial.println(" Π±ΠΈΡ):");
for (uint8_t i = 0; i < result.keyLength; i++) {
Serial.print(result.sharedKey[i]);
if ((i + 1) % 8 == 0) {
Serial.print(" ");
}
}
Serial.println();
// ΠΡΠΈΠΌΠ΅Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
uint8_t message[] = "ARDUINOHACKS FOREVER!";
uint8_t encrypted[32];
memcpy(encrypted, message, sizeof(message));
encryptMessage(encrypted, sizeof(message), result.sharedKey, result.keyLength);
Serial.print("ΠΠ°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅: ");
for (uint8_t i = 0; i < sizeof(message); i++) {
Serial.print(encrypted[i], HEX);
Serial.print(" ");
}
Serial.println();
}
void loop() {}