🌌 Π§Π°ΡΡ‚ΡŒ 38: ΠšΠ²Π°Π½Ρ‚ΠΎΠ²ΠΎ-устойчивый ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π½Π° Arduino (Post-Quantum Cryptography)

Π‘ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ΠΌ ΠΊΠ²Π°Π½Ρ‚ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ (RSA, ECC) станут уязвимы. ΠœΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΊΠ²Π°Π½Ρ‚ΠΎΠ²ΠΎ-устойчивый Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ CRYSTALS-Kyber (Π½Π° основС Ρ€Π΅ΡˆΠ΅Ρ‚ΠΎΠΊ) Π½Π° ATmega328P!

РСализация Kyber-512 (упрощСнная вСрсия):

cpp

#include <avr/random.h>
#include <avr/pgmspace.h>

#define KYBER_N 256   // Π Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Ρ‚ΠΊΠΈ
#define KYBER_Q 3329  // ΠœΠΎΠ΄ΡƒΠ»ΡŒ
#define KYBER_K 2     // ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ бСзопасности

// Полином (коэффициСнты ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ Q)
struct Poly {
    int16_t coeffs[KYBER_N];
};

// ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠΎΠ²
struct PolyMatrix {
    Poly rows[KYBER_K];
    Poly cols[KYBER_K];
};

// ГСнСрация случайного ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠ°
void randomPoly(Poly* p) {
    for (uint8_t i = 0; i < KYBER_N; i++) {
        p->coeffs[i] = random(KYBER_Q);
    }
}

// Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠΎΠ² (быстроС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ НВВ)
void polyMul(Poly* a, Poly* b, Poly* result) {
    // УпрощСнная вСрсия (Π±Π΅Π· NTT для экономии RAM)
    for (uint8_t i = 0; i < KYBER_N; i++) {
        int32_t sum = 0;
        for (uint8_t j = 0; j < KYBER_N; j++) {
            sum += (int32_t)a->coeffs[j] * b->coeffs[(i - j + KYBER_N) % KYBER_N];
        }
        result->coeffs[i] = sum % KYBER_Q;
    }
}

// ГСнСрация ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ Kyber
struct KyberKeyPair {
    PolyMatrix publicKey;
    PolyMatrix privateKey;
};

void kyberKeyGen(KyberKeyPair* keys) {
    // Π¨Π°Π³ 1: ГСнСрация ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A (публичная)
    PolyMatrix A;
    for (uint8_t i = 0; i < KYBER_K; i++) {
        for (uint8_t j = 0; j < KYBER_K; j++) {
            randomPoly(&A.rows[i]);
        }
    }
    
    // Π¨Π°Π³ 2: ГСнСрация сСкрСтной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ S
    PolyMatrix S;
    for (uint8_t i = 0; i < KYBER_K; i++) {
        for (uint8_t j = 0; j < KYBER_K; j++) {
            // Π‘Π΅ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ коэффициСнты: -1, 0, 1
            S.rows[i].coeffs[j] = random(-1, 2);
        }
    }
    
    // Π¨Π°Π³ 3: ВычислСниС ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ B = A * S + E
    PolyMatrix B;
    for (uint8_t i = 0; i < KYBER_K; i++) {
        for (uint8_t j = 0; j < KYBER_K; j++) {
            // B = A * S (ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎ)
            Poly temp;
            polyMul(&A.rows[i], &S.rows[j], &temp);
            B.rows[i].coeffs[j] = (temp.coeffs[0] + random(-2, 3)) % KYBER_Q;
        }
    }
    
    // БохраняСм ΠΊΠ»ΡŽΡ‡ΠΈ
    keys->publicKey = B;
    keys->privateKey = S;
}

// Π¨ΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ сообщСния (Π±Π°ΠΉΡ‚ Π² ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌ)
void kyberEncrypt(uint8_t* message, uint8_t len, PolyMatrix* publicKey, PolyMatrix* ciphertext) {
    // ГСнСрация случайного ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠ° r (для маскировки)
    Poly r;
    randomPoly(&r);
    
    // Π¨ΠΈΡ„Ρ€ΡƒΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π°ΠΉΡ‚
    for (uint8_t i = 0; i < len; i++) {
        Poly m;
        for (uint8_t j = 0; j < KYBER_N; j++) {
            m.coeffs[j] = (message[i] >> (j % 8)) & 1;
        }
        
        // c = publicKey * r + m
        Poly temp;
        polyMul(&publicKey->rows[0], &r, &temp);
        for (uint8_t j = 0; j < KYBER_N; j++) {
            ciphertext->rows[i].coeffs[j] = (temp.coeffs[j] + m.coeffs[j]) % KYBER_Q;
        }
    }
}

// Π”Π΅ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅
void kyberDecrypt(PolyMatrix* ciphertext, PolyMatrix* privateKey, uint8_t* message, uint8_t len) {
    for (uint8_t i = 0; i < len; i++) {
        // m = ciphertext - privateKey * r
        Poly temp;
        polyMul(&privateKey->rows[0], &ciphertext->rows[i], &temp);
        
        uint8_t byte = 0;
        for (uint8_t j = 0; j < KYBER_N; j++) {
            int16_t bit = (temp.coeffs[j] - ciphertext->rows[i].coeffs[j]) % KYBER_Q;
            if (abs(bit) > KYBER_Q / 2) {
                byte |= (1 << (j % 8));
            }
        }
        message[i] = byte;
    }
}

void setup() {
    Serial.begin(115200);
    randomSeed(analogRead(A0));
    
    // ГСнСрация ΠΊΠ»ΡŽΡ‡Π΅ΠΉ
    KyberKeyPair keys;
    kyberKeyGen(&keys);
    
    // Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅
    uint8_t message[] = "ARDUINOHACKS QUANTUM SECURE!";
    uint8_t encrypted[32];
    uint8_t decrypted[32];
    
    // Π¨ΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅
    PolyMatrix ciphertext;
    kyberEncrypt(message, sizeof(message), &keys.publicKey, &ciphertext);
    
    // Π”Π΅ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅
    kyberDecrypt(&ciphertext, &keys.privateKey, decrypted, sizeof(message));
    
    Serial.print("ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»: ");
    Serial.println((char*)message);
    Serial.print("Π”Π΅ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΎ: ");
    Serial.println((char*)decrypted);
}

void loop() {}

Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΡ‚ΡŒΡΡ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *