Untitled

 avatar
unknown
plain_text
a month ago
1.8 kB
2
Indexable
#include <stdio.h>

// Function to calculate gcd
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

// Function to calculate (base^exp) % mod
int modular_exponentiation(int base, int exp, int mod) {
    int result = 1;
    base = base % mod;
    while (exp > 0) {
        if (exp % 2 == 1) { // If exp is odd
            result = (result * base) % mod;
        }
        exp = exp / 2; // Divide exp by 2
        base = (base * base) % mod;
    }
    return result;
}

int main() {
    // Step 1: Choose two prime numbers p and q
    int p = 11, q = 13; // Prime numbers
    int n = p * q; // Compute n
    int phi = (p - 1) * (q - 1); // Compute Euler's totient function
    printf("Phi(n) = %d \n", phi);

    // Step 2: Choose public key exponent e such that gcd(e, phi) = 1
    int e = 7; // A simple choice for e
    while (gcd(e, phi) != 1) {
        e++; // Increment e until gcd(e, phi) = 1
    }

    // Step 3: Find private key d such that (e * d) % phi = 1
    int d = 1;
    while ((e * d) % phi != 1) {
        d++; // Increment d until the condition is met
    }

    // Display keys
    printf("Public Key: (e = %d, n = %d)\n", e, n);
    printf("Private Key: (d = %d, n = %d)\n", d, n);

    // Step 4: Encrypt a message (plaintext)
    int plaintext = 9; // Changed plaintext value
    if (plaintext < 0 || plaintext >= n) {
        printf("Error: Plaintext must be in the range 0 <= plaintext < n.\n");
        return 1;
    }

    int ciphertext = modular_exponentiation(plaintext, e, n);
    printf("Plaintext: %d\n", plaintext);
    printf("Encrypted Ciphertext: %d\n", ciphertext);

    // Step 5: Decrypt the message
    int decrypted = modular_exponentiation(ciphertext, d, n);
    printf("Decrypted Plaintext: %d\n", decrypted);

    return 0;
}
Editor is loading...
Leave a Comment