CTF 密码数学入门|欧几里得算法求解最大公约数 GCD
2026/7/10 21:02:39 网站建设 项目流程

前言

在密码学、RSA 加密、数论类 CTF 题目里,最大公约数 GCD是最基础、最高频的前置知识点,几乎所有公钥密码题型都会依赖 GCD 与互质的概念。 这道入门题完整讲解了 GCD 定义、互质概念、欧几里得辗转相除法,同时提供可直接运行的 Python 代码,非常适合新手入门数论类密码题。本文整理成完整可发布的技术博客,包含原理、代码、拓展知识点。

一、题目完整信息

基础信息

  • 题目名称:Greatest Common Divisor(最大公约数)
  • 题型:密码学 - 基础数论
  • 分值:15 分
  • 难度:入门级

题目原文描述

最大公约数(GCD,也叫最高公因数),指能够同时整除两个正整数(a,b)的最大正整数。

  1. 示例 1:a=12,b=812 的因数:{1,2,3,4,6,12}8 的因数:{1,2,4,8}公共因数最大值为 4,即gcd(12,8)=4
  2. 示例 2:a=11,b=17,二者均为质数 质数的因数只有 1 和自身,因此公共因数只有 1,gcd(11,17)=1

核心概念:互质(Coprime)

若两个整数a,b的最大公约数gcd(a,b)=1,则称ab互质。 推论:

  1. 两个不同质数一定互质;
  2. a是质数,且b < a,则ab一定互质;
  3. 思考题:如果质数ab > a,二者不一定互质(例:a=3,b=6,gcd=3,不互质)。

解题要求

推荐使用欧几里得算法(辗转相除法)编写代码,先用a=12,b=8测试代码正确性,最后计算:

gcd(a=66528, b=52920) 计算结果即为 flag。

二、前置核心知识点

1. GCD 基础定义

给定两个正整数,能同时整除两者的最大自然数,记作 gcd(a,b)。

  • 若 gcd(a,b)=1:两数互质;
  • 质数p与小于它的所有自然数互质;
  • 若另一个数包含该质数作为因子,则不互质。

2. 欧几里得辗转相除法核心原理

核心公式:

gcd(a,b)=gcd(b, amodb) 循环取模,直到余数为 0,此时的b就是最大公约数。 逻辑演示(测试样例 a=12,b=8):

  1. gcd(12,8)=gcd(8, 12mod8=4)
  2. gcd(8,4)=gcd(4, 8mod4=0)
  3. 余数为 0,终止,结果 = 4,和题目示例一致。

3. Python 两种实现方式

  1. 手动实现欧几里得算法(理解底层原理,CTF 数论题必考手写);
  2. 标准库math.gcd快速调用(适合快速出结果,注意库函数限制)。

三、完整解题代码 & 分步讲解

方案 1:手动实现欧几里得辗转相除法(推荐学习)

python

运行

# 自定义欧几里得算法求GCD def gcd(a, b): while b != 0: # 取模,更新a、b a, b = b, a % b return a # 题目测试用例 test_a = 12 test_b = 8 print(f"测试用例 gcd({test_a},{test_b}) = {gcd(test_a, test_b)}") # 题目要求计算的数值 num_a = 66528 num_b = 52920 result = gcd(num_a, num_b) print(f"目标 gcd({num_a},{num_b}) = {result}")
代码拆解
  1. 循环条件while b != 0:只要余数不为 0,持续迭代;
  2. a, b = b, a % b:同步更新变量,把除数变成新被除数,余数变成新除数;
  3. b=0时循环结束,此时a就是最大公约数;
  4. 先用题目给的12,8测试,验证代码逻辑无错误,再代入题目大数计算。

方案 2:Python 标准库快速求解

python

运行

import math # math.gcd仅接收非负数,且返回绝对值GCD a = 66528 b = 52920 res = math.gcd(a, b) print(res)

注意:math.gcd存在限制,只能处理正数、大数模运算手写算法兼容性更强,CTF 复杂数论场景推荐手写。

四、运行结果与验证

控制台输出

plaintext

测试用例 gcd(12,8) = 4 目标 gcd(66528,52920) = 1512

最终计算结果:1512,与题目给出的 flag 完全匹配。

手动推演简略过程(辅助理解)

  1. gcd(66528, 52920) = gcd(52920, 13608)
  2. gcd(52920, 13608) = gcd(13608, 12096)
  3. gcd(13608, 12096) = gcd(12096, 1512)
  4. gcd (12096, 1512) = gcd (1512, 0) 余数为 0,终止,GCD=1512。

五、核心概念拓展(密码学高频考点)

1. 互质在密码学中的作用

RSA 加密算法的核心前提:选取两个大质数p,q,计算 φ(n)=(p−1)(q−1),加密公钥e必须满足 gcd(e,φ(n))=1(互质),否则无法求出解密私钥d。

2. 欧几里得算法拓展:扩展欧几里得

普通 GCD 只能求最大公约数,扩展欧几里得算法可以同时求出满足 ax+by=gcd(a,b) 的整数解x,y,是求解模逆元的核心工具,几乎所有 RSA 解密题都会用到。

3. 常见题型变形

  1. 给出两个大数求 GCD(本题原型);
  2. 多数字 GCD:gcd(a,b,c) = gcd(gcd(a,b),c)
  3. 结合模逆元、RSA 分解模数、同余方程。

六、新手学习避坑总结

  1. 不要暴力枚举因数:大数分解因数效率极低,欧几里得算法迭代次数极少,百万级数字也能瞬间算出;
  2. 区分「质数」和「互质」:两个数互质不代表都是质数(例:gcd (8,9)=1,二者都不是质数);
  3. 库函数math.gcd坑点:只返回正数、无法处理 0、负数会自动取绝对值,复杂数论场景建议手写辗转相除;
  4. 思考题答案:质数a=3,b=6,b>a,b是a的倍数,此时 gcd=3≠1,不互质。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询