期中考crypto复现

第一题 1z_rsa

期中考crypto复现_第1张图片

 期中考crypto复现_第2张图片

代码如下

from gmpy2 import invert
from Crypto.Util.number import getPrime, bytes_to_long

def flag():
    flag = "xxxxxxxxxxxxxx"
    return flag

a = 65537
b = getPrime(140)
c = getPrime(140)
m = b * c
aaa = (b - 1) * (c - 1)
d = invert(a, aaa)
n = bytes_to_long(flag().encode())
z = pow(n, a, m)
print("m=" + str(m))
print("z=" + str(z))
# m=1851012829537540993346897265450988006921329733937556249710137670254755668838970157221
# z=1165608868963663237838494928147497339359377331987999335624507621030816298293537918937
  • a 是公钥指数(加密时使用的),通常设置为65537。
  • bc 是两个大素数,用于生成RSA的模数 m
  • aaa 是欧拉函数 (Φ) 值,计算方式为 (b - 1) * (c - 1)
  • d 是私钥指数(解密时使用的),通过调用 invert(a, aaa) 计算得到。
  • n 是要加密的消息(在这里是flag的字节数转化的整数)。
  • z 是加密后的消息,通过 pow(n, a, m) 计算得到。

这段代码用于演示RSA加密的过程。请注意,RSA加密通常包括以下步骤:

  1. 选择两个大素数 bc
  2. 计算 m = b * c,这将成为模数。
  3. 计算欧拉函数Φ,通常为 (b - 1) * (c - 1)
  4. 选择一个公钥指数 a,通常是65537。
  5. 使用公钥 (a, m) 加密消息 n,得到 z
  6. 计算私钥指数 d,以便解密。
  7. 使用私钥 (d, m) 解密 z,得到原始消息 n
  8. 代码中,已经生成了 m,并且加密了消息 n 得到 z

yafu用于自动整数因式分解,在RSA中,当p、q的取值差异过大或过于相近的时候,使用yafu可以快速的把n值分解出p、q值,原理是使用Fermat方法与Pollard rho方法等

用yafu分解m

期中考crypto复现_第3张图片

期中考crypto复现_第4张图片

分解得到

p= 1358730637766188714476624560503309609820513
q= 1362310363870711901033415700690289289304517

import libnum
from Crypto.Util.number import long_to_bytes

m = 1851012829537540993346897265450988006921329733937556249710137670254755668838970157221
z = 1165608868963663237838494928147497339359377331987999335624507621030816298293537918937

# n = int("",16)
e = 65537
# e = int("",16)

p = 1358730637766188714476624560503309609820513
q = 1362310363870711901033415700690289289304517

d = libnum.invmod(e, (p - 1) * (q - 1))
n = pow(z, d, m)
string = long_to_bytes(n)
print(string)

运行一下得到AFFPGS{snzv1l_ov9_gur_g0_Jr1p0zr}

md5加密一下即可得到flag

第二题 师兄新学的Decode姿势

期中考crypto复现_第5张图片

期中考crypto复现_第6张图片

 

const SM4 = require("gm-crypt").sm4;
var payload =
"inu7s0XGslLFsPe0xok/nxqwtceG0cuMoh7hBbpwyNBrn3g/lMdcFYobv/K++eRgWwI/TIA4qMtjqpNKOet
E3TD0gWoSknGF6OhkRJ3LxrNUZ/Mi8ISz3xrDLawIY8NwbalYcQUGWtVjdC3nJLmAAA67FmSCAn2EOcI1mAt
9yMQ=";
let sm4Config = {
key: "B6*40.2_C9#e4$E3",
mode: "ecb",
cipherType: "base64"
};
let sm4 = new SM4(sm4Config);
var result = sm4.decrypt(payload);
console.log("解密:" + result)

需要node.js环境,就转换为python语言

    from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
    from cryptography.hazmat.primitives.padding import PKCS7
    from cryptography.hazmat.backends import default_backend
    import base64
     
    payload = "inu7s0XGslLFsPe0xok/nxqwtceG0cuMoh7hBbpwyNBrn3g/lMdcFYobv/K++eRgWwI/TIA4qMtjqpNKOetE3TD0gWoSknGF6OhkRJ3LxrNUZ/Mi8ISz3xrDLawIY8NwbalYcQUGWtVjdC3nJLmAAA67FmSCAn2EOcI1mAt9yMQ="
    key = b'B6*40.2_C9#e4$E3'
     
    backend = default_backend()
    cipher = Cipher(algorithms.SM4(key), modes.ECB(), backend=backend)
    decryptor = cipher.decryptor()
     
    decoded_payload = base64.b64decode(payload)
    decrypted_data = decryptor.update(decoded_payload) + decryptor.finalize()
     
    unpadder = PKCS7(algorithms.SM4.block_size).unpadder()
    unpadded_data = unpadder.update(decrypted_data) + unpadder.finalize()
     
    print("解密:", unpadded_data.decode())

运行一下即可得到flag

第三题 1z_AES

期中考crypto复现_第7张图片

代码如下

import base64
from Crypto.Cipher import AES
from flag import getflag()

iv = '1229002675654321'
key = 'yunxiexamcrypto3'
data = getflag()

def pad(data):
    pad_data = data
    for i in range(0, 16 - len(data)):
        pad_data = pad_data + ' '
    return pad_data

def AES_en(key, data):
    if len(data) < 16:
        data = pad(data)
    AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
    AES_en_str = AES_obj.encrypt(data.encode("utf-8"))
    AES_en_str = base64.b64encode(AES_en_str)
    AES_en_str = AES_en_str.decode("utf-8")
    return AES_en_str

data = AES_en(key, data)
print(data)
#data=5UXnsxhmLldM4GAcU//vsqf6xICtgtM12fFPrYikBrU=

直接解密得到flag

期中考crypto复现_第8张图片

你可能感兴趣的:(安全)