本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
Python移位密码、仿射变换解密实例代码
我是陈晓 · 225浏览 · 发布于2021-06-28 +关注

凯撒密码(Caesar 密码)是最早的代换密码,也是古典对称密码体制的典型代表,已经初步体现出近代密码系统的雏形,这篇文章主要给大家介绍了关于Python移位密码、仿射变换解密的相关资料,需要的朋友可以参考下

前言

这个代码是很久之前的,已经忘记具体的思路了,你可以结合此文章来了解两个加密方式的内容。
前两个步骤是对应加密方式的函数,第三个步骤是整合。

一、移位密码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

def yiwei(string,number):

    '''

    将字符串的每个字母,向右移动指定的位数,并返回移动后的字符串

    如:A 向右移动3位,返回值为D

    string为字符串,number为整型

    A的ASCII码为65

    '''

    new_string = ""

    string = string.upper()  #转换为大写

    for i in string:        #移位操作

        #转换为ascii码后,经过移位变为新的ascii,再转换回字母

        new_string += chr((ord(i)-65+number)%26+65)

    return new_string

##print(yiwei('AAA',3)) #测试函数正确性


def yiwei_decode(c):

    '''移位密码解密,并打印解密的结果'''

    for i in range(1,27): #穷尽密钥搜索,遍历范围[1,26]

        print(yiwei(c,i))

    print("解密结束")

##yiwei_decode("A") #测试函数正确性

二、仿射变换

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

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

def fangshe_key(m,c):

    '''

    通过已知的两对明文密文,求解得到两个密钥

    m为明文,c为密文

    [A-Z]转换为数字为[0-25]

    '''

    #大写

    m = m.upper()

    c = c.upper()

    #切片

    m1 = m[:1:]     #明文的第一个字母

    m2 = m[-1::]    #明文的最后一个字母

    c1 = c[:1:]     #密文的第一个字母

    c2 = c[-1::]    #密文的最后一个字母

##    print(m1,m2)

##    print(c1,c2)

    #转换为整数

    m1 = ord(m1)-65

    m2 = ord(m2)-65

    c1 = ord(c1)-65

    c2 = ord(c2)-65

##    print(m1,m2)

##    print(c1,c2)

    #穷举法

    for i in range(0,26):

        for j in range(0,26):

            if (m1*i+j)%26==c1 and (m2*i+j)%26==c2: #同时满足加密算法时

                return i,j

    return False

##print(fangshe_key("IF","ED")) #测试函数正确性


def fangshe_reverse(x,y):

    '''

    计算乘法逆元,求解x^-1(%y)的乘法逆元,并返回对应值

    '''

    i = 0

    while True:

        if x*i%26==1: #符合乘法逆元条件时

            return i

        i += 1

##print(fangshe_reverse(9,26)) #测试函数正确性


def fangshe_decode(c,a,b):

    '''

    仿射变换解密,并打印解密的结果

    c为密文,a和b为密钥

    0<=a,b<=25,且满足gcd(a,26)=1,a^-1表示a的逆元

    加密公式:c = a*m + b%26

    解密公式:m = (a^-1)*(c-b)%26

    '''

    new_string = ''

    c = c.upper() #大写转换

    for i in c: #逐个字母解密

        new_i = ord(i)-65 #转换成数字

        new_i = (fangshe_reverse(a,26)*(new_i - b))%26 #解密

        new_string += chr(new_i + 65) #转换回大写字母

    print(new_string)

    print("解密结束")

##fangshe_decode("ED",9,10) #测试函数正确性

三、全部代码

移位密码

在这里插入图片描述

仿射变换

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

# coding=utf-8

# 作者:小狐狸FM

# 题目:古典密码

def menu():

    '''

    菜单界面

    '''

    print("-----------------------")

    print("|    0. 退出          |")

    print("|    1. 移位密码解密  |")

    print("|    2. 仿射变换解密  |")

    print("-----------------------")

##menu() #测试函数


def yiwei(string,number):

    '''

    将字符串的每个字母,向右移动指定的位数,并返回移动后的字符串

    如:A 向右移动3位,返回值为D

    string为字符串,number为整型

    A的ASCII码为65

    '''

    new_string = ""

    string = string.upper()  #转换为大写

    for i in string:        #移位操作

        #转换为ascii码后,经过移位变为新的ascii,再转换回字母

        new_string += chr((ord(i)-65+number)%26+65)

    return new_string

##print(yiwei('AAA',3)) #测试函数正确性


def yiwei_decode(c):

    '''移位密码解密,并打印解密的结果'''

    for i in range(1,27): #穷尽密钥搜索,遍历范围[1,26]

        print(yiwei(c,i))

    print("解密结束")

##yiwei_decode("A") #测试函数正确性


def fangshe_key(m,c):

    '''

    通过已知的两对明文密文,求解得到两个密钥

    m为明文,c为密文

    [A-Z]转换为数字为[0-25]

    '''

    #大写

    m = m.upper()

    c = c.upper()

    #切片

    m1 = m[:1:]     #明文的第一个字母

    m2 = m[-1::]    #明文的最后一个字母

    c1 = c[:1:]     #密文的第一个字母

    c2 = c[-1::]    #密文的最后一个字母

##    print(m1,m2)

##    print(c1,c2)

    #转换为整数

    m1 = ord(m1)-65

    m2 = ord(m2)-65

    c1 = ord(c1)-65

    c2 = ord(c2)-65

##    print(m1,m2)

##    print(c1,c2)

    #穷举法

    for i in range(0,26):

        for j in range(0,26):

            if (m1*i+j)%26==c1 and (m2*i+j)%26==c2: #同时满足加密算法时

                return i,j

    return False

##print(fangshe_key("IF","ED")) #测试函数正确性


def fangshe_reverse(x,y):

    '''

    计算乘法逆元,求解x^-1(%y)的乘法逆元,并返回对应值

    '''

    i = 0

    while True:

        if x*i%26==1: #符合乘法逆元条件时

            return i

        i += 1

##print(fangshe_reverse(9,26)) #测试函数正确性


def fangshe_decode(c,a,b):

    '''

    仿射变换解密,并打印解密的结果

    c为密文,a和b为密钥

    0<=a,b<=25,且满足gcd(a,26)=1,a^-1表示a的逆元

    加密公式:c = a*m + b%26

    解密公式:m = (a^-1)*(c-b)%26

    '''

    new_string = ''

    c = c.upper() #大写转换

    for i in c: #逐个字母解密

        new_i = ord(i)-65 #转换成数字

        new_i = (fangshe_reverse(a,26)*(new_i - b))%26 #解密

        new_string += chr(new_i + 65) #转换回大写字母

    print(new_string)

    print("解密结束")

##fangshe_decode("ED",9,10) #测试函数正确性

     


if __name__=='__main__':

    while True:

        menu()

        choose = int(input("请选择: "))

        if choose==1:  

            string = input("请输入密文: ")

            yiwei_decode(string)

        elif choose==2:           

            string = input("请输入密文: ")

            m = input("已知明文:")

            c = input("对应密文:")

            a,b = fangshe_key(m,c)

            fangshe_decode(string,a,b)

        else:

            break


相关推荐

PHP实现部分字符隐藏

沙雕mars · 1327浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 910浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 974浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 964浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1090浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
我是一名在上海一家互联网公司上班,专注技术开发工作等。
小鸟云服务器
扫码进入手机网页