2024 Cryptography Summer Camp

Jun 1, 2024 · 2 min read
Date
Jun 1, 2024 12:00 AM

本项目为面向上海大学网络空间安全专业 2022 级本科生的暑期实训课程.

主要内容包括:

  1. 密码学介绍
  2. 近世代数和数论基础
  3. textbook RSA 相关攻击方法
  4. Challenges

本期课程相较于往年课程内容差异不大, 重点增加了学习方法和现代密码学技术概要, 旨在让同学们基本了解密码学相关的技术现状, 以及 CTF 中密码学基础的知识.

网络空间安全是一个非常注重实践的学科, 请一定独立完成课后的实验部分. 请在课程结束后仔细阅读《提问的智慧》《别像弱智一样提问》这两篇文章, 理解 STFW, RTFM, RTFSC 的内涵.

👉 为什么要强调提问?

对于经常寻求帮助的同学.

你是否考虑过, 当你进入公司或学校课题组时, 可能会遇到需要独自解决技术问题的情况? 你的同事或师兄师姐也有自己的任务, 不一定有时间帮助你. 若缺乏独立解决问题的能力, 你可能会陷入困境.

好消息是, 这种能力是可以培养的. 那些被称为"大佬"的人, 比你更早开始锻炼这项能力. 他们在你提问时, 已经解决了无数问题. 你的能力与独立解决问题的努力成正比, 大佬的答案展示的是他们的能力, 而不是你的. 所以, 端正心态, 尽最大努力独立解决遇到的问题, 这对你非常重要.

对于经常帮助他人的同学.

你或许在帮助同学时获得成就感, 但这也可能剥夺了他们受训练的机会. 网络空间安全任何方向的精进学习都需要长期的专业训练. 因此, 在帮助同学时, 尽量引导他们自己查资料、看手册、看代码, 并提出自己的思考和解决方案. 这不仅有助于他们的专业成长, 也能让你们共同进步. 学习本身需要付出, 如果问题的答案太容易获得, 他们就无法从中得到应有的训练.

Tools

实验过程中需要你进行信息检索, 推荐使用 Bing 进行. 同时, 你会使用到 Python 的 Crypto 库和 gmpy2 库, 请完成安装.

Challenges

Chal1. 套娃

  • 本题共 3 个 flag
  • flag 形式均为:'flag{[0-9A-Za-z=_]*}'

新佛曰:諸隸僧降冥吽諸陀摩隸僧缽冥薩願耨咤陀願羅咤喃迦祗蜜耨阿嚤僧喼所聞薩闍嚩聞念須亦心耨冥心阿冥聞慧蜜咤冥心念訶冥嚩冥聞冥念降咤冥劫耨降寂願慧般祗闍隸冥修阿闍莊陀冥莊冥劫莊嚴冥宣隸阿摩嚩蜜心咒冥闍我須咒慧冥闍諦羅迦聞慧婆劫嘚慧咒迦慧慧我慧冥闍念劫嘇隸蜜祗伏嚤慧咒修缽聞色祗冥闍僧嘚迦降阿莊冥慧聞蜜降咤寂波嘇塞薩如囑

Chal2. ezRSA

  • 本题共 1 个 flag
  • flag 形式为:'flag{[0-9A-Za-z=_]*}'
from Crypto.Util.number import getPrime, bytes_to_long
from gmpy2 import is_prime, invert
from typing import Tuple
from secert import flag

def gen_rsa_param() -> Tuple[int, int, int, int, int]:
    """Generate usable RSA parameters.
    
    params:
        None
    
    return:
        a tuple, including `p, q, n, e, d`
    """
    p = getPrime(256)
    q = p + 2
    while True:
        q += 2
        if is_prime(q):
            break
        
    assert p < q
    
    n = p * q
    phi_n = (p-1) * (q-1)
    e = 0x10001
    d = invert(e, phi_n)
    
    return p, q, n, e, d

def rsa_encrypt(m: str, *args) -> str:
    """Generate usable RSA parameters.
    
    params:
        m: message to be encrypted
        args: RSA parameters
    
    return:
        a string, which is the encrypted message
    """
    assert len(args) == 5
    p, q, n, e, d = args
    m = bytes_to_long(m)
    c = pow(m, e, n)
    return c

params = gen_rsa_param()
print(rsa_encrypt(flag, *params))
print(params[2])
# 5796768148637887491255587039409951397511832995737366433505141785703232675749200657380232851343254281355390391562734825283953711907092653161783752372166386
# 7948512242985881433771203281939490726039994357587772712416312873824297606161653053722572268861029945737411249803561023517431875922105282741637330609169129