python 密码学库_密码学与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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值