第三次作业(密码学)

#include
#include

// 计算最大公约数
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }

    return a;
}

// 计算模幂运算
int mod_pow(int base, int exponent, int modulus) {
    int result = 1;
    base = base % modulus;

    while (exponent > 0) {
        if (exponent % 2 == 1) {
            result = (result * base) % modulus;
        }

        exponent = exponent >> 1;
        base = (base * base) % modulus;
    }

    return result;
}

// 生成密钥
void generate_keys(int p, int q, int *e, int *d, int *n) {
    *n = p * q;
    int phi = (p - 1) * (q - 1);

    // 选择e
    for (*e = 2; *e < phi; (*e)++) {
        if (gcd(*e, phi) == 1) {
            break;
        }
    }

    // 计算d
    for (*d = 2; *d < phi; (*d)++) {
        if ((*e * *d) % phi == 1) {
            break;
        }
    }
}

// 加密
int encrypt(int plaintext, int e, int n) {
    return mod_pow(plaintext, e, n);
}

// 解密
int decrypt(int ciphertext, int d, int n) {
    return mod_pow(ciphertext, d, n);
}

int main() {
    int p = 61;
    int q = 53;
    int e, d, n;

    // 生成密钥
    generate_keys(p, q, &e, &d, &n);

    int plaintext = 65;
    printf("明文: %d\n", plaintext);

    // 加密
    int ciphertext = encrypt(plaintext, e, n);
    printf("密文: %d\n", ciphertext);

    // 解密
    int decrypted = decrypt(ciphertext, d, n);
    printf("解密后的明文: %d\n", decrypted);

    return 0;
}

你可能感兴趣的:(java,算法,数据结构)