Python随机维格纳密码

2024-04-25 12:01:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在开始之前先澄清一下:我知道有类似的话题,但没有什么能真正提供任何直接帮助。另外:这是一个类项目;所以我不想找任何人为我编写项目代码。提示和建议是我要找的。(我会找我的教授做这种事,但他却懒得去查看他的电子邮件。)

此程序的目的是获取用户提供的种子,根据整数生成密钥,然后生成一个95 x 95矩阵,其中所有可打印的ascii字符都可用于加密/解密。(Key为alpha,大写)

关键:所有的细胞都必须随机。见下图: Randomized Vigenere Matrix

我将在下面发布我的代码(Python当然不是我的强项,尽管我肯定会接受建设性的批评):

import random

class Vigenere(object):

    def __init__(self, seed):
        random.seed(seed)
        #string containing all valid characters
        self.symbols= """!"#$%&'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] ^_`abcdefghijklmnopqrstuvwxyz{|}~"""
        self.eTable = [[0 for i in range(len(self.symbols))] for i in range(len(self.symbols))]
        self.dTable = [[0 for i in range(len(self.symbols))] for i in range(len(self.symbols))]
        self.keyWord = ""
        self.message = ""
        self.ciphertext = ""
        self.keywordFromSeed(seed)

    def setMessage(self,message):
        self.message = message

    #Generate psuedorandom keyword from seed
    def keywordFromSeed(self,seed):
        Letters = []

        while seed > 0:
            Letters.insert(0,chr((seed % 100) % 26 + 65))
            seed = seed // 100
        self.keyWord = "".join(Letters)
        self.buildVigenere()

    #Contructs a 95 x 95 matrix filled randomly
    def buildVigenere(self):
        n = len(self.symbols)

        #Build the vigenere matrix
        for i in range(n):
            temp = self.symbols

            for j in range(n):
                r = random.randrange(len(temp))
                self.eTable[i][j] = temp[r]

                #This line below does not fill entire matrix. Why?
                self.dTable[j][(ord(temp[r])-32)] = chr(i+32)

                temp = temp.replace(temp[r],'')

    def encrypt(self):
        for i in range(len(self.message)):
            mi = i
            ki = i % len(self.keyWord)
            self.ciphertext = self.ciphertext + self.eRetrieve(ki,mi)

    def decrypt(self):
        for i in range(len(self.message)):
            emi = i
            ki = i % len(self.keyWord)
            char = self.dRetrieve(ki,emi)
            self.ciphertext = self.ciphertext + char
        print(self.ciphertext)

    def eRetrieve(self,ki,mi):       
        row = ord(self.message[mi]) - 32
        col = ord(self.keyWord[ki]) - 32
        print(row, col)
        return self.eTable[row][col]

    def dRetrieve(self,ki,emi):
        n = len(self.symbols)
        whichRow = ord(self.keyWord[ki]) - 32
        whichCol = ord(self.message[emi]) - 32
        return(self.dTable[whichRow][whichCol])

为了以防万一,这是我的主.py公司名称:

^{pr2}$

我刚刚使用了默认种子:7487383487438734

我的明文:ABCdefXYZ


Tags: inselfmessageforlendefrangetemp
2条回答

我要回答这个问题:

#This line below does not fill entire matrix. Why?

我想这是你目前的问题。如果我没搞错,这应该是你问题的第一行,而不是简单的功能评论:

^{pr2}$

我做的第一件事就是建立一个独立的小例子:

import random

def buildVigenere():
    symbols= """!"#$%&'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] ^_`abcdefghijklmnopqrstuvwxyz{|}~"""

    n = len(symbols)
    eTable = [[0 for i in range(len(symbols))] for i in range(len(symbols))]
    dTable = [[0 for i in range(len(symbols))] for i in range(len(symbols))]

    #Build the vigenere matrix
    for i in range(n):
        temp = symbols

        for j in range(n):
            r = random.randrange(len(temp))
            eTable[i][j] = temp[r]
            print (r,  len(temp),  j,  len(symbols),  temp[r])
            #This line below does not fill entire matrix. Why?
            print (ord(temp[r])-32)
            dTable[j][(ord(temp[r])-32)] = chr(i+32)

            temp = temp.replace(temp[r],'')
    print dTable

buildVigenere()

如果你想在这里找到答案,你真的应该学会这样做,更一般来说,你应该成为一个成功的程序员。找到问题所在并能够在一个简单的案例中重现问题往往是关键。在

这里我得到一个错误:

Exception "unhandled IndexError"
list assignment index out of range

我添加了一些print语句(见上文),发现错误源于symbols字符串中缺少< > =。在

为什么不使用chr来构建字符串symbols?在

对于buildVigenere,可以使用 random.shuffle(x)

我能让它工作。我将在下面发布我的实现:

在主.py在

import argparse
import randomized_vigenere as rv

def main():

    #Parse parameters
    parser = argparse.ArgumentParser()
    parser.add_argument("-m", " mode", dest="mode", default = "encrypt", help="Encrypt or Decrypt")
    parser.add_argument("-i", " inputfile", dest="inputFile", default = "inputFile.txt", help="Input Name")
    parser.add_argument("-o", " outputfile", dest="outputFile", default = "outputFile.txt", help="Output Name")
    parser.add_argument("-s", " seed", dest="seed", default =7487383487438734, help="Integer seed")
    args = parser.parse_args()

    #Set seed and generate keyword
    seed = args.seed

    #Construct Matrix
    f = open(args.inputFile,'r')
    message = f.read()
    Matrix = rv.Vigenere(seed)
    Matrix.setMessage(message)

    if(args.mode == 'encrypt'):
        Matrix.encrypt()
    else:
        Matrix.decrypt()

    o = open(args.outputFile,'w')
    o.write(str(Matrix.ciphertext))

    print("Seed used:",Matrix.seed)
    print("Key Generated:",Matrix.keyWord)
    print("Original Message:",Matrix.message)
    print("Decoded Message:",Matrix.ciphertext)

if __name__ == '__main__':
    main()

随机化_维格纳.py在

(请确保将“<;”、“=”和“>;”添加到符号列表中。由于某些原因,他们一直被从这篇文章中删除。)

^{pr2}$

感谢@Eric Levieil的帮助

相关问题 更多 >

    热门问题