前言
最近在学习RSA加解密过程中遇到一个这样的难题:假设已知publickey公钥文件和加密后的密文flag,如何对其密文进行解密,转换成明文~~
分析
对于rsa算法的公钥与私钥的产生,我们可以了解到以下产生原理:
公钥与私钥的产生
随机选择两个不同大质数 $p$ 和 $q$,计算 $N = p \times q$
根据欧拉函数,求得 $r=\varphi (N)=\varphi (p)\varphi (q)=(p-1)(q-1)$
选择一个小于 $r$ 的整数 $e$,使 $e$ 和 $r$ 互质。并求得 $e$ 关于 $r$ 的模反元素,命名为 $d$,有 $ed\equiv 1 \pmod r$
将 $p$ 和 $q$ 的记录销毁
此时,$(N,e)$ 是公钥,$(N,d)$ 是私钥。
消息加密
首先需要将消息 $m$ 以一个双方约定好的格式转化为一个小于 $N$,且与 $N$ 互质的整数 $n$。如果消息太长,可以将消息分为几段,这也就是我们所说的块加密,后对于每一部分利用如下公式加密:
$$ n^{e}\equiv c\pmod N $$
消息解密
利用密钥 $d$ 进行解密。
$$ c^{d}\equiv n\pmod N $$
我们可以知道,RSA公钥主要有两个信息:模数(modulus)和指数(exponent),也就是我们所说的N和e。只要有了这两个信息,我们便可以生成公钥,然后使用rsa库对数据进行加密~
脚本实现如下:
#!/usr/bin/env python#-*- coding: utf-8 -*-
importrsa
key=rsa.PublicKey(modulus, exponent)print key
这时候我们有如下的publickey.pem文件:
-----BEGIN PUBLIC KEY-----MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMJjauXD2OQ/+5erCQKPGqxsC/bNPXDr
yigb/+l/vjDdAgMBAAE=
-----END PUBLIC KEY-----
现在我们需要做的就是从这段字符串中提出模数和指数。
首先我们得知道pem文