仿射密码(Affine)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 仿射密码(Affine)

仿射密码(Affine)

  • 加密对象: 英文字母
  • 原理:
  • 该密码运用了乘法
  • 逆元和模运算
  • a~z对应于0~25, 将明文的每个字符转为对应的数字
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  • 加密函数:D(x) = (a*x+b) (mod 26),这里a,b变量就是密钥,注意 a必须和26互质
  • 通过加密函数得到密文的数字,在查表,组合在一起就构成了密文。
  • 解密过程与加密
  • 类似
  • 解密函数: E(x) = a-1(x-b) (mod 26), 这里a-1是a关于26的乘法逆元。
  • 代码:
# write by 2021/6/28
DIC = "abcdefghijklmnopqrstuvwxyz"
# 辗转相除法
def gcd(a, b):
    a, b = b, a % b
    # print(a, b)
    if b == 0:
        return a
    else:
        return gcd(a, b)
# 扩展欧几里得算法
def exgcd(a, b):
    if b == 0:
        return 1, 0
    x, y = exgcd(b, a % b)
    return y, x-(a//b)*y
def encrypt_affine(string, a, b):
    ciphertext = ""
    if gcd(a, 26) != 1 and gcd(a, 26) != -1:
        return -1
    for i in string.lower():
        if i not in DIC:
            ciphertext += i
        else:
            ciphertext += DIC[(a*DIC.index(i)+b) % 26]
    return ciphertext
# 直接遍历所有26可能,找到为止
def decrypt2_affine(string, a, b):
    plaintext = ""
    if gcd(a, 26) != 1 and gcd(a, 26) != -1:
        return -1
    for i in string.lower():
        if i not in DIC:
            plaintext += i
        # (x*7+3)%26 = 4
        else:
            for x in range(26):
                if (x*a + b) % 26 == DIC.index(i):
                    # print("x=", x)
                    plaintext += DIC[x]
                    break
    return plaintext
# 根据扩展欧几里得算法找到乘法逆元,在求解
def decrypt_affine(string, a, b):
    plaintext = ""
    if gcd(a, 26) != 1 and gcd(a, 26) != -1:
        return -1
    a_26_inv = exgcd(a, 26)[0]
    for i in string:
        if i not in DIC:
            return -1
        plaintext += DIC[a_26_inv*(DIC.index(i)-b) % 26]
    return plaintext
if __name__ == '__main__':
    # print(exgcd(3, 26))
    a, b = 2, 21
    ciphertext_ = encrypt_affine("AFFINECIPHER", a, b)
    plaintext_ = decrypt_affine(ciphertext_, a, b)
    plaintext_2 = decrypt2_affine(ciphertext_, a, b)
    print(f"{plaintext_}: {ciphertext_}")
    print(f"{plaintext_2}: {ciphertext_}")
目录
相关文章
|
7月前
|
编解码 监控 算法
3D-Genome | Hi-C互作矩阵归一化指南
3D-Genome | Hi-C互作矩阵归一化指南
169 2
|
机器学习/深度学习 搜索推荐
高斯-马尔科夫定理(Gauss-Markov theorem)
高斯-马尔科夫定理(Gauss-Markov theorem),也称为高斯-马尔科夫定理(Gauss-Markov theorem)或线性最小二乘定理(linear least squares theorem),是统计学中一个重要的定理,它描述了在一些假设条件下,普通最小二乘估计(Ordinary Least Squares, OLS)是线性回归模型中最优的无偏估计。
388 0
|
7月前
Gamma校正
下面是自己所整理的一些gamma校正的东西如有侵权请联系删除。
59 0
|
机器学习/深度学习 搜索推荐 Python
L1范数(L1 norm)
L1范数(L1 norm),也称为曼哈顿距离(Manhattan distance)或绝对值范数(Absolute value norm),是向量中各个元素绝对值之和。它在数学和机器学习中经常被用作一种正则化项或稀疏性度量。
1501 2
|
计算机视觉
OpenCV-矩阵变形reshape
OpenCV-矩阵变形reshape
165 0
|
机器学习/深度学习 搜索推荐 Python
L2范数(L2 norm)
L2范数(L2 norm),也称为欧几里德范数(Euclidean norm)或2-范数,是向量元素的平方和的平方根。它在数学和机器学习中经常被用作一种正则化项、距离度量或误差度量。
7806 1
|
机器学习/深度学习 算法 搜索推荐
L0范数(L0 norm)
L0范数(L0 norm)是指向量中非零元素的个数。与L1范数和L2范数不同,L0范数并不是一种常见的范数形式,它更多地被用作一种表示稀疏性的度量。
578 1
|
机器学习/深度学习 传感器 算法
【图像重建】基于离散余弦变换DCT图像重建含MSE、PSNR、压缩比附matlab代码
【图像重建】基于离散余弦变换DCT图像重建含MSE、PSNR、压缩比附matlab代码
|
算法
【图像锐化】非锐化掩模 USM(Unsharpen Mask)与锐化掩模 SM(Sharpen Mask)
> 掩膜操作可以提高图像对比度,对比度提高可以增加图像感官度、锐化,让看起来有点模糊的图像更清晰。 > 原理:提取图像的高频分量,再用一个参数放大之后与原图叠加,这样就产生了一个增强了边缘的图像。 > 提取图像的高频分量的做法有两种: > 1.直接使用高通滤波器,得到高频分量。2.通过低通滤波器,再用原图减去低频就得到了高频信息。
558 0
【图像锐化】非锐化掩模 USM(Unsharpen Mask)与锐化掩模 SM(Sharpen Mask)