码迷,mamicode.com
首页 > 编程语言 > 详细

密码学与python的那些事

时间:2019-11-05 15:31:27      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:log   解密   ref   uri   mod   lse   lib   color   gcd   

密码学与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的那些事

标签:log   解密   ref   uri   mod   lse   lib   color   gcd   

原文地址:https://www.cnblogs.com/v01cano/p/11798433.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!