流量分析
一、有流量数据文件123.pcapng记录了本地机器访问10.3.40.20的web服务的相关报文和访问期间浏览器SSLKEY日志文件key.log。
1. 所访问的https web服务的,服务器域名是什么?
2.通信双方使用什么TLS套件进行通信?解释套件中使用了哪些密码学算法及算法的作用?
3.通信双方传递了某一秘密信息,对该信息进行破解?
注册码破解
二、某软件公司发布了其研发团队开发的程序clock.exe,该程序需要合法的注册码激活后方可使用。张三通过对clock.exe的数据包逆向分析,发现该程序校验注册码的大致逻辑如下:
1.将注册码分为两部分,前四个字符为第一部分message,剩下的字符为第二部分signature;
2.利用打包于clock.exe中的公钥文件public_key.pem(已解析得到)对signature和message的MD5值作签名验证,如若验证成功则激活软件。
张三通过分析编写出了正确的注册码校验python函数:
import rsa
import base64
def verify_registration_code(registration_code):
message = registration_code[:4]
signature = base64.b64decode(registration_code[4:])
public_key = rsa.PublicKey.load_pkcs1(open(PUBLIC_KEY_FILE, 'rb').read())
try:
rsa.verify(message.encode(), signature, public_key)
return True
except rsa.pkcs1.VerificationError:
return False
请根据如上逻辑和public_key.pem公钥文件,利用python编写一段生成clock.exe合法验证码的代码。请写明答题思路并记录过程(截图)。
获取n和e
import rsa
# 加载公钥
public_key = rsa.PublicKey.load_pkcs1(open('public_key.pem').read().encode())
# 获取n和e的值
n = public_key.n
e = public_key.e
# 输出n和e的值
print("n:", n)
print("e:", e)
网站用解出n解出和p和q
使用p,q,e算出d
import rsa
def calculate_d(p, q, e):
# 计算phi(n)
phi_n = (p - 1) * (q - 1)
# 使用欧几里得扩展算法计算d
d = rsa.common.inverse(e, phi_n)
return d
# 知道的参数
p = 436923383565743374298000250129973346427945296845627
q = 3024355106840859446030848187743574466020673260691623060399
e = 65537
# 计算d
d = calculate_d(p, q, e)
print("d:", d)
用n,e,d,p,q制作私钥
import rsa
# 创建一个新的密钥对
n=1321411466385243615006840994926043033176613177565376352971033317350340707411782228724443787775751066800025173
e=65537
d=1210213452482949971160422512434974975011469492711427711524160610900836126583272862911922490758294996204655561
p=436923383565743374298000250129973346427945296845627
q=3024355106840859446030848187743574466020673260691623060399
private_key = rsa.PrivateKey(n,e,d,p,q)
# 将私钥保存到文件
with open('private_key.pem', 'wb') as file:
file.write(private_key.save_pkcs1())
观察校验代码知道是注册码格式是4个字符进行MD5hash之后签名,用私钥构造注册码
import rsa
import base64
message = "abcd"
privkey = rsa.PrivateKey.load_pkcs1(open("private_key.pem").read())
signature = rsa.sign(message.encode(), privkey, "MD5")
print(message+base64.b64encode(signature).decode())