首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Encrypter - Python中的双Vigenere密码

Encrypter - Python中的双Vigenere密码
EN

Code Review用户
提问于 2015-08-29 15:54:19
回答 1查看 667关注 0票数 7

我根据Vigenere密码的思想编写了这个加密器,但是它不是只使用一个密钥,而是从现有密钥中“生成”另一个密钥。第二个键的长度也取决于第一个键中的不同字符。因此,它在转换字母时使用了这两个键。

代码语言:javascript
复制
def scram(key):
    key2 = []
    #make the length of the second key varying from key to key for harder cracking
    length = (key[0]-32)+(key[int(len(key)/2)]-32)+(key[len(key)-1]-32)
    #make the max length = 256
    length = length % 256
    #if the length is less than 64, multiply by two to make it longer
    while(length < 64):
        length*=2

    #scrambles the letters around
    for x in range(length):
        #basically shifts the key according to the current character,
        #how many times it has looped the key, where it is in the key,
        #and the modulo of x and a few prime numbers to make sure that 
        #an overlap/repeat doesn't happen.
        toapp = (x%(len(key)-1)) + (x/(len(key)-1)) + (key[x%(len(key)-1)]) + (x%3) +(x%5)+(x%53)+(x%7)                   
        toapp = int(toapp % 94)
        key2.append(toapp)

    return key2

def cipher(mes,key,ac):
    #makes the second key
    key2 = scram(key)
    res=[]

    #do proper shifting in the keys
    for x in range(len(mes)):
        temp=mes[x]

        if(action == "2"):
            temp = temp - key[x%(len(key)-1)] - key2[x%(len(key2)-1)]
        else:
            temp = temp + key[x%(len(key)-1)] + key2[x%(len(key2)-1)]                

        temp = int(temp % 94)

        res.append(chr(temp+32))

    return res

#encrypt or decrypt
action = input("type 1 to encypt. type 2 to decrypt:")
#input
m= input("Text:")
k= input("key - 4 or more char:")

#changes the letters to ascii value
mes= []
for x in m:
    mes.append(ord(x)-32)

key= []
for x in k:
    key.append(ord(x)-32)

#encrypts it    
result = cipher(mes,key,action)

for x in result:
    print(x,end="")

print("")

y = input("Press enter to continue...")

有没有更有效的方法来做到这一点?这是加密文本的安全方法吗?你能破解这个程序加密的文本吗?

EN

回答 1

Code Review用户

发布于 2015-08-29 21:36:03

列表理解

代码语言:javascript
复制
m= input("Text:")
k= input("key - 4 or more char:")

#changes the letters to ascii value
mes= []
for x in m:
    mes.append(ord(x)-32)

key= []
for x in k:
    key.append(ord(x)-32)

这一切都可以缩短为两个清单的理解:

代码语言:javascript
复制
mes = [ord(x) - 32 for x in input("Text: ")]
key = # Exercise for the reader

避免函数

中的全局

代码语言:javascript
复制
    if(action == "2"):

动作应该是函数的一个参数。

temp永存

代码语言:javascript
复制
 temp=mes[x]

您命名一个变量temp并使用它8行..。请给这个重要的变量起一个合理的名字。

超长公式

代码语言:javascript
复制
toapp = (x%(len(key)-1)) + (x/(len(key)-1)) + (key[x%(len(key)-1)]) + (x%3) +(x%5)+(x%53)+(x%7)                   

请评论一下这个巨大的公式。

避免了这么多作业,

代码语言:javascript
复制
result = cipher(mes,key)

for x in result:
    print(x,end="")

print("")

在python中,避免外部变量赋值是惯用的,而显式循环很少是真正必要的,这一切都可以缩短为:

代码语言:javascript
复制
print(''.join(cipher(mes,key)))

不分配垃圾输入

最后一行应该是:

代码语言:javascript
复制
input("Enter to continue...")
票数 7
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/102246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档