密码学与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的那些事的主要内容,如果未能解决你的问题,请参考以下文章

关于虚拟机kali的那些事

聊聊视频播放那些事1

到目前为止,机器学习与自然语言处理相遇的那些事

python 内存那些事

前后端分离 | 关于登录状态那些事

了解Python可以做的那些事