密码刷题记录(1)

1、[SWPUCTF 2021 新生赛]crypto2

题目

from gmpy2 import *
from Crypto.Util.number import *



flag  = '***************'

p = getPrime(512)
q = getPrime(512)
m1 = bytes_to_long(bytes(flag.encode()))


n = p*q
e1 = getPrime(32)
e2 = getPrime(32)
print()

flag1 = pow(m1,e1,n)
flag2 = pow(m1,e2,n)
print('flag1= '+str(flag1))
print('flag2= '+str(flag2))
print('e1= ' +str(e1))
print('e2= '+str(e2))
print('n= '+str(n))


#flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
#flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
#e1= 3247473589
#e2= 3698409173
#n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313

 已知flag1,flag2,e1,e2,n; 满足flag1=m1^e1%n ; flag2=m1^e2%n  ; 求m1

import gmpy2
e1=3247473589
e2=3698409173
print(gmpy2.gcd(e1,e2))

运行结果为1,说明e1和e2互素

由扩展欧几里得定理,存在x,y;使得xe1+ye2=gcd(e1,e2)=1

import gmpy2
from Crypto.Util.number import *
e1=3247473589
e2=3698409173
flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313
d,x,y=gmpy2.gcdext(e1,e2)
m=pow(flag1,x,n)*pow(flag2,y,n)%n
print(long_to_bytes(m).decode())

 解析代码

1.d,x,y=gmpy2.gcdext(e1,e2):gmpy2.gcdext()函数计算了e1e2的最大公约数,并返回了扩展欧几里得算法的结果,其中d是最大公约数(d=1),xy是满足贝祖等式的系数。

2.m=pow(flag1,x,n)*pow(flag2,y,n)%n:使用了中国剩余定理(CRT),pow()函数的第一个参数是底数,第二个参数是指数,第三个参数是模数,

 得到flag:NSSCTF{xxxxx******xxxxx}

2.[鹤城杯 2021]A_CRYPTO

题目:4O595954494Q32515046324757595N534R52415653334357474R4N575955544R4O5N4Q46434S4O59474253464Q5N444R4Q51334557524O5N4S424944473542554O595N44534O324R49565746515532464O49345649564O464R4R494543504N35

由提示可知是ROT编码,解码后为

4B595954494D32515046324757595A534E52415653334357474E4A575955544E4B5A4D46434F4B59474253464D5A444E4D51334557524B5A4F424944473542554B595A44534B324E49565746515532464B49345649564B464E4E494543504A35

Base16 解码

KYYTIM2QPF2GWYZSNRAVS3CWGNJWYUTNKZMFCOKYGBSFMZDNMQ3EWRKZOBIDG5BUKYZDSK2NIVWFQU2FKI4VIVKFNNIECPJ5

Base32 解码

V143Pytkc2lAYlV3SlRmVXQ9X0dVdmd6KEYpP3t4V29+MElXSER9TUEkPA==

Base64 解码

W^7?+dsi@bUwJTfUt=_GUvgz(F)?{xWo~0IWHD}MA$<

Base85 解码

flag{W0w_y0u_c4n_rea11y_enc0d1ng!}

3.[SWPUCTF 2021 新生赛]crypto6

题目

源码经过了3 层加密,顺序分别为base64,base32,base16,然后逐层解密就好

import base64
var="************************************"
result="4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D"
var=base64.b64decode(base64.b32decode(base64.b16decode(result)))
print(var)

 运行得到结果

 4.[SWPUCTF 2021 新生赛]crypto10

 题目:AFFPGS{pbatenghyngvbaf!!!},建议直接秒了

根据题目提示可知,直接用ROT13解密

5.[SWPUCTF 2021 新生赛]pigpig

题目:

 这是猪圈密码

猪圈密码解密在线网站:http://www.metools.info/code/c90.html

 

 6.[SWPUCTF 2021 新生赛]crypto9

本题直接将脚本给出,所以我们直接运行即可

#AKKPLX{qv5x0021-7n8w-wr05-x25w-7882ntu5q984}
#脚本给你了,去解吧

letter_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'  # 字母表


# 根据输入的key生成key列表
def Get_KeyList(key):
    key_list = []
    for ch in key:
        key_list.append(ord(ch.upper()) - 65)
    return key_list


# 加密函数
def Encrypt(plaintext, key_list):
    ciphertext = ""

    i = 0
    for ch in plaintext:  # 遍历明文
        if 0 == i % len(key_list):
            i = 0
        if ch.isalpha():  # 明文是否为字母,如果是,则判断大小写,分别进行加密
            if ch.isupper():
                ciphertext += letter_list[(ord(ch) - 65 + key_list[i]) % 26]
                i += 1
            else:
                ciphertext += letter_list[(ord(ch) - 97 + key_list[i]) % 26].lower()
                i += 1
        else:  # 如果密文不为字母,直接添加到密文字符串里
            ciphertext += ch
    return ciphertext


# 解密函数
def Decrypt(ciphertext, key):
    plaintext = ""

    i = 0
    for ch in ciphertext:  # 遍历密文
        if 0 == i % len(key_list):
            i = 0
        if ch.isalpha():  # 密文为否为字母,如果是,则判断大小写,分别进行解密
            if ch.isupper():
                plaintext += letter_list[(ord(ch) - 65 - key_list[i]) % 26]
                i += 1
            else:
                plaintext += letter_list[(ord(ch) - 97 - key_list[i]) % 26].lower()
                i += 1
        else:  # 如果密文不为字母,直接添加到明文字符串里
            plaintext += ch
    return plaintext


if __name__ == '__main__':
    print("加密请按D,解密请按E:")
    user_input = input();
    while (user_input != 'D' and user_input != 'E'):  # 输入合法性判断
        print("输入有误!请重新输入:")
        user_input = input()

    print("请输入密钥:")
    key = input()
    while (False == key.isalpha()):  # 输入合法性判断
        print("输入有误!密钥为字母,请重新输入:")
        key = input()

    key_list = Get_KeyList(key)

    if user_input == 'D':
        # 加密
        print("请输入明文:")
        plaintext = input()
        ciphertext = Encrypt(plaintext, key_list)
        print("密文为:\n%s" % ciphertext)
    else:
        # 解密
        print("请输入密文:")
        ciphertext = input()
        plaintext = Decrypt(ciphertext, key_list)
        print("明文为:\n%s" % plaintext)

运行结果为

至于这里密钥为什么是NSS,这里是直接看的佬的博客,我们试着解析一下给出的脚本 

代码是一个基于凯撒密码的加密和解密程序。

  1. Get_KeyList(key) 函数:根据输入的密钥 key 生成密钥列表。将密钥中的每个字符转换为对应的 ASCII 值减去 65(对应字母 'A' 的 ASCII 值),得到的结果作为偏移量存储在密钥列表中。

  2. Encrypt(plaintext, key_list) 函数:接收明文 plaintext 和密钥列表 key_list,返回加密后的密文。函数遍历明文的每个字符,如果是字母,则根据字符的大小写分别进行加密。大写字母使用 (ord(ch) - 65 + key_list[i]) % 26 计算加密后的索引,小写字母使用 (ord(ch) - 97 + key_list[i]) % 26 计算加密后的索引。将加密后的字符添加到密文字符串中。

  3. Decrypt(ciphertext, key_list) 函数:接收密文 ciphertext 和密钥列表 key_list,返回解密后的明文。函数遍历密文的每个字符,如果是字母,则根据字符的大小写分别进行解密。大写字母使用 (ord(ch) - 65 - key_list[i]) % 26 计算解密后的索引,小写字母使用 (ord(ch) - 97 - key_list[i]) % 26 计算解密后的索引。将解密后的字符添加到明文字符串中。

  4. if __name__ == '__main__'::程序的入口点。

 注意:ord() 是一个内置函数,它用于返回字符的 ASCII 值,减去 97 的目的是将字符的 ASCII 值转换为相对于小写字母 'a' 的偏移量,+ key_list[i]是将密钥列表中的第 i 个元素添加到偏移量上。这样可以根据密钥确定每个字符的具体偏移量。

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值