鱼C论坛

 找回密码
 立即注册
查看: 3042|回复: 0

[技术交流] 【Cryptography】Playfair

[复制链接]
发表于 2014-4-11 14:09:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ~风介~ 于 2015-1-12 21:57 编辑
def create_letter_list(miyao):#补全25个字母
    l = []
    l += miyao.upper()#把输入的密钥变为大写
    for i in range(97,122):
        if chr(i).upper() not in miyao.upper():#把A到Y中不在密钥中的字母补全进去
            l.append(chr(i).upper())
            
    l.reverse()#逆置生成的字母表
    l1 = []    #以下把字母表分割成二维数组
    l2 = []
    i = 0
    while i < 25 :
        l1 += l.pop()
        i = i + 1
        if i % 5 == 0:
            l2.extend([l1])   
            l1 = []
            
    print('生成的矩阵是:')
    for i in range(len(l2)):#输出矩阵
        print(l2[i])

    return l2


def creat_plaintext():#生成明文
    l1 = list(input('请输入明文<位数必须是偶数>:'))#接受输入
    l2 = []
    for i in range(len(l1)):#把明文中的小写变为大写
        if ord(l1[i]) >= 97:
            l1[i] = l1[i].upper()
            
        l2.append(l1[i])
        
    return l2

    
def dingwei(x):#定位明文在矩阵中的坐标
    l1 = []
    for i in range(len(x)):  
        for j in range(5):
            for k in range(5):
                if letter_list[j][k] == x[i]:
                    l1.append([j,k])                    
    return l1

        
def jiami():#加密函数
    l2 = []
    y = dingwei(plaintext)
    i = 0
    while i < (len(y)-1):
        j = i + 1
        if y[i][0] == y[j][0]:#如果在同一行
           y[i][1] = (y[i][1] + 1)%5
           y[j][1] = (y[j][1] + 1)%5
        elif y[i][1] == y[j][1]:#如果在同一列
           y[i][0] = (y[i][0] + 1)%5
           y[j][0] = (y[j][0] + 1)%5
        else: 
            temp = y[i][1]
            y[i][1] = y[j][1]
            y[j][1] = temp
  
        l2.append(y[i])
        l2.append(y[j])

        i += 2
        
    print('加密后的密文是: ',end='')
    printout(l2)#输出函数
    return l2

           
def jiemi(x):#解密函数
    l3 = []
    l5 = []
    
    for i in range(len(x)):#接收加密后的密文
        l5.append(letter_list[x[i][0]][x[i][1]])
        
    y = dingwei(l5)
    i = 0
    while i < (len(y)-1):
        j = i + 1
        if y[i][0] == y[j][0]:#如果在同一行
           y[i][1] = (y[i][1] - 1 + 5 )%5
           y[j][1] = (y[j][1] - 1 + 5 )%5
        elif y[i][1] == y[j][1]:#如果在同一列
           y[i][0] = (y[i][0] - 1 + 5)%5
           y[j][0] = (y[j][0] - 1 + 5)%5
        else:
            temp = y[i][1]
            y[i][1] = y[j][1]
            y[j][1] = temp
  
        l3.append(y[i])
        l3.append(y[j])

        i += 2
        
    print('解密后的明文是: ',end='')
    printout(l3)#输出
    
def printout(z):#输出函数
    l4 = []
    for i in range(len(z)):
        l4.append(letter_list[z[i][0]][z[i][1]])
        
    print(l4)
#主函数      
letter_list = create_letter_list(input('请输密钥:'))
plaintext = creat_plaintext()
print('处理前的明文是:',plaintext)
jiemi(jiami())
截图如下:
QQ截图20140411140352.png
P.S.完整版后继补充~先去睡觉了~




评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
小甲鱼 + 5 + 5 + 3 替换密码哈,不错~

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 07:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表