密码学与python的那些事
Posted v01cano
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了密码学与python的那些事相关的知识,希望对你有一定的参考价值。
密码学与python的那些事
仿射变换
公式如下:
加密
"""
c代表密文,m代表明文,a, b表示密钥
c = a*m + b (mod 26)
m = a的逆元*(c-b) (mod 26)
"""
m = "security".lower()
c = ""
a = 7
b = 21
for i in range(0, len(m)):
c = c + chr((((ord(m[i])-97)*a+b)%26)+97)
print(c)
解密
求逆元可以使用libnum库,也可以使用gmpy2库,也可以手写代码。
求逆元使用libnum库:
"""
c代表密文,m代表明文,a, b表示密钥
c = a*m + b (mod 26)
m = a的逆元*(c-b) (mod 26)
d表示a的逆元
"""
import libnum
c = "vlxijh".lower()
m = ""
a = 7
b = 21
d = libnum.xgcd(a, 26)[0]
for i in range(0, len(c)):
m = m + chr((((ord(c[i])-97)-b+26)*d)%26 + 97)
print(m)
求逆元使用gmpy2库
"""
c代表密文,m代表明文,a, b表示密钥
c = a*m + b (mod 26)
m = a的逆元*(c-b) (mod 26)
d表示a的逆元
"""
import gmpy2
c = "vlxijh".lower()
m = ""
a = 7
b = 21
d = gmpy2.invert(a, 26)
print(d)
for i in range(0, len(c)):
m = m + chr((((ord(c[i])-97)-b+26)*d)%26 + 97)
print(m)
求逆元使用手写代码:
"""
c代表密文,m代表明文,a, b表示密钥
c = a*m + b (mod 26)
m = a的逆元*(c-b) (mod 26)
d表示a的逆元
"""
def egcd(a, b):
if (b == 0):
return 1, 0, a
else:
x, y, q = egcd(b, a % b) # q = GCD(a, b) = GCD(b, a%b)
x, y = y, (x - (a // b) * y)
return x, y, q
def mod_inv(a, b):
return egcd(a, b)[0] % b # 求a模b得逆元
c = "vlxijh".lower()
m = ""
a = 7
b = 21
d = mod_inv(a, 26)
for i in range(0, len(c)):
m = m + chr((((ord(c[i])-97)-b+26)*d)%26 + 97)
print(m)
推荐一篇文章:
https://xz.aliyun.com/t/2446
以上是关于密码学与python的那些事的主要内容,如果未能解决你的问题,请参考以下文章