Untitled

 avatar
unknown
plain_text
a year ago
2.0 kB
3
Indexable
#include <openssl/bn.h>
#include <openssl/rand.h>
#include <stdio.h>

void printBN(const char *msg, BIGNUM *a) {
    char *number_str = BN_bn2dec(a);
    printf("%s%s\n", msg, number_str);
    OPENSSL_free(number_str);
}

// Function to generate a random k
void generate_random_k(BIGNUM *k, BIGNUM *p, BN_CTX *ctx) {
    // Generate a random number k where 1 < k < p-1
    do {
        if (!BN_rand_range(k, p)) {
            // Handle error
            printf("Error generating random k.\n");
            exit(1);
        }
    } while (BN_is_zero(k) || BN_is_one(k)); // Ensure k is not 0 or 1
}

void elgamal_encrypt(long pval, long gval, long xval, long Mval) {
    BN_CTX *ctx = BN_CTX_new();
    
    // Initialize variables
    BIGNUM *p = BN_new();
    BIGNUM *g = BN_new();
    BIGNUM *x = BN_new();
    BIGNUM *M = BN_new();
    BIGNUM *k = BN_new();
    BIGNUM *C1 = BN_new();
    BIGNUM *C2 = BN_new();
    BIGNUM *y = BN_new(); // Public key

    // Assign values
    BN_set_word(p, pval);
    BN_set_word(g, gval);
    BN_set_word(x, xval);
    BN_set_word(M, Mval);

    // Generate a random k
    generate_random_k(k, p, ctx);

    // Calculate y = g^x mod p (Public key)
    BN_mod_exp(y, g, x, p, ctx);

    // Calculate C1 = g^k mod p
    BN_mod_exp(C1, g, k, p, ctx);

    // Calculate C2 = M * y^k mod p
    BN_mod_exp(y, y, k, p, ctx); // y^k mod p
    BN_mod_mul(C2, M, y, p, ctx); // M * y^k mod p

    // Output
    printBN("Random k: ", k);
    printBN("C1: ", C1);
    printBN("C2: ", C2);

    // Cleanup
    BN_free(p);
    BN_free(g);
    BN_free(x);
    BN_free(M);
    BN_free(k);
    BN_free(C1);
    BN_free(C2);
    BN_free(y);
    BN_CTX_free(ctx);
}

int main() {
    printf("El-Gamal Encryption with Random k:\n");
    elgamal_encrypt(773, 2, 333, 321); // Task 1
    printf("\n");
    elgamal_encrypt(6469, 5055, 2256, 4312); // Task 2

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