一、密码学
RSA体系的密钥由两个数字组成,大概共三个步骤:
1)创建两个非常大的随机质数:q和p,相乘后得到n
2)创建一个随机质数e,它与(q-1)*(p-1)互质
3)计算e的逆模得到d
以下给出程序和详细注释:
import random,sys,os,cryptomath
import rabinMiller
def main():
print('生成密钥对.....')
#把字符串al_sweigart'和整数1024传给makeKeyFiles()调用
#公钥私钥保存在al_sweigart-pubkey.txt和al_sweigart-privkey.txt
makeKeyFiles('al_sweigart',1024)
print('密钥对制作完成')
def generateKey(keysize):
print('生成随机大质数p......')
p=rabinMiller.generateLargePrime(keysize)
print('生成随机大质数q......')
q=rabinMiller.generateLargePrime(keysize)
#生成公钥和私钥的公有部分n
n=q*p
#创建随机数e,它与q-1和p-1的积互质
print('创建随机数e......')
while True:
# 创建随机数e
e=random.randrange(2**(keysize-1),2**(keysize))
#检测e与q - 1和p - 1的积是否互质
#不互质则继续循环,反之则跳出
if cryptomath.gcd(e,(p-1)*(q-1))==1:break
print('计算e的逆模d......')
d=cryptomath.findModInverse(e,(p-1)*(q-1))
#以元组形式进行保存公钥和私钥对
publicKey=(n,e)
privateKey=(n,d)
#打印操作
print('PublicKey:',publicKey)
print('PrivateKey',privateKey)
return (publicKey,privateKey)
#将公钥私钥保存到txt文件
def makeKeyFiles(name,keySize):
#如有同名的密钥文件存在,则发出更改名称的警告
if os.path.exists('%s_pubkey.txt'%name) or os.path.exists('%s_privkey.txt'%name):
sys.exit('WARNING')
#返回一个元组,他包含两个元组,都一样保存在publicKey和privateKey中
publicKey,privateKey=generateKey(keySize)
#密钥文件格式:密钥大小整数,n整数,e/d整数
#公钥信息
print()
print('The public key is a %s and a %s digit number.' % (len(str(publicKey[0])), len(str(publicKey[1]))))
print('Writing public key to file %s_pubkey.txt...' % (name))
fo = open('%s_pubkey.txt' % (name), 'w')
fo.write('%s,%s,%s' % (keySize, publicKey[0], publicKey[1]))
fo.close()
#私钥信息
print()
print('The private key is a %s and a %s digit number.' % (len(str(publicKey[0])), len(str(publicKey[1]))))
print('Writing private key to file %s_privkey.txt...' % (name))
fo = open('%s_privkey.txt' % (name), 'w')
fo.write('%s,%s,%s' % (keySize, privateKey[0], privateKey[1]))
fo.close()
if __name__ == '__main__':
main()
二、Python拉宾米勒(判断素数)
这里引用了另一位博主对拉宾米勒算法的字面介绍:
米勒-拉宾算法:快速判断一个数是不是素数
需要用到的定理:
最小费马定理:如果n是素数,则(a ^ (n - 1)) % n恒等于1。
快速模取幂
米勒-拉宾算法就是结合上面两种,通过不断判断fmod(a, n - 1, n)的值是否为1来判断。这是一个概率算法,如果为1,不一定为素数,不为1,则必定是合数。循环判断多次就会让概率变得极为的小。
以下给出拉宾米勒算法的python代码和注释:
import random
def rabinMiller(num):
#快速幂
s=num-1
t=0
while s%2==0:
s=s//2
t+=1
#最小费马定理
for trials in range(5):
a=random.randrange(2,num-1)
v=pow(a,s,num)
if v!=1:
i=0
while v!=(num-1):
if i==t-1:
return False
else:
i=i+1
v=(v**2)%num
return True
def isPrime(num):
if num<2:
return False
#prime.txt是存放素数表的文件
lowPrimes=open('prime.txt','r')
if num in lowPrimes:
return True
for prime in lowPrimes:
if num%prime==0:
return False
return rabinMiller(num)
#generateLargePrime函数返回素数。它选出一个大的随机数保存到num
#再将num传到isPrime和rabinMiller进行判断是不是素数
#先isPrime后rabinMiller是因为复杂度先简后繁
def generateLargePrime(keysize=1024):
while True:
num=random.randrange(2**(keysize-1),2**keysize)
if isPrime(num):
return num
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
base64.encodebytes`在这里插入代码片`
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。