尝试实现加密算法,这是到目前为止的源代码:
import random
import itertools
msg = input(" Enter the KEY : ")
ascivalue = sum(ord(ch) for ch in msg)
a = []
i=0
b = [None] * 16
c = [None] * 26
d = [None] * 26
print("ASCII VALUE=", ascivalue)
print('')
# print('The Shuffeled values are : \n')
for x in range(ascivalue):
a.append(x)
random.Random(4).shuffle(a)
#a.append(random.randint(1, ascivalue))
# print('\t\t',a)
for x in range(16):
b[x] = a[x]
print( "\n16 randomly generated numbers are : \n ")
print('\t\t',b)
for i in range(16):
d = b[i] % 26
# m = d
if (c[d] == None):
c[d] = d
else:
while (c[d] != None):
d = d + 1
if d == 26:
d = 0
c[d] = d
print("\n After normalization numbers are :\n")
random.Random(4).shuffle(c)
# print('\t\t',c)
print('')
while None in c:
c.remove(None)
print('\t\t',c)
e = [None] * 16
f = [None] * 16
g = [None] * 16
i = 0
for i in range(16):
e[i] = c[i] + 64
if(e[i] == 64):
f[i] = chr(90) # corresponding character of each values
else:
f[i] = chr(e[i])
i = i + 1
print("\nRandomly generated English letters – playfair cipher grid is : ")
print('')
for row in range(4):
for col in range(4):
print(f.pop(), end=' ')
print()
# print('\nascii value of characters in the keygrid is: ')
# for i in range(16):
# g[i] = ord(f[i])
# i = i + 1
# print('')
# print('\t\t',g)
print('')
lst = list(itertools.product([1, 0], repeat=4))
print('The 4*4 Binary grid is : ')
print('')
for row in range(4):
for col in range(4):
print(lst.pop(), end=' ')
print()
bn = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
minpos = []
bngrid = [None] * 16
for x in range(16):
minpos = c.index(min(c))
if c[minpos] == 100:
break
bngrid[minpos] = bn[x]
c[minpos] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid)
print()
for row in range(4):
for col in range(4):
print(bngrid.pop(), end=' ')
print()
bn1 = ['AA', 'AT', 'AG', 'AC', 'TA', 'TT', 'TG', 'TC', 'GA', 'GT', 'GG', 'GC', 'CA', 'CT', 'CG', 'CC']
minpos1 = []
bngrid1 = [None] * 16
for x in range(16):
minpos1 = c.index(min(c))
if c[minpos1] == 100:
break
bngrid1[minpos1] = bn1[x]
c[minpos1] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid1)
print()
# for row in range(4):
# for col in range(4):
# print(dnagrid.pop(), end=' ')
# print()
问题是,我能够将:中的值改组
bn = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
但是,不在:
bn1 = ['AA', 'AT', 'AG', 'AC', 'TA', 'TT', 'TG', 'TC', 'GA', 'GT', 'GG', 'GC', 'CA', 'CT', 'CG', 'CC']
要注意的事实是,相同的代码用于这两个目的:
这是第一个街区:
bn = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
minpos = []
bngrid = [None] * 16
for x in range(16):
minpos = c.index(min(c))
if c[minpos] == 100:
break
bngrid[minpos] = bn[x]
c[minpos] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid)
print()
这是第二个方块:
bn1 = ['AA', 'AT', 'AG', 'AC', 'TA', 'TT', 'TG', 'TC', 'GA', 'GT', 'GG', 'GC', 'CA', 'CT', 'CG', 'CC']
minpos1 = []
bngrid1 = [None] * 16
for x in range(16):
minpos1 = c.index(min(c))
if c[minpos1] == 100:
break
bngrid1[minpos1] = bn1[x]
c[minpos1] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid1)
print()
第二个块生成输出:
[无,无,无,无,无,无,无,无,无,无,无,无,无,无,无,无,无]
但是,如果我在第一个块中将数组bn1[]
内的值传递给bn[]
,它将生成所需的输出。但是,不会在第二个块中产生输出。是什么原因造成的?
在这里停留了很长一段时间后,对于解决该问题的任何帮助将深表感谢。
答案 0 :(得分:3)
错误是在第一块,您重写了变量c的值而没有建立或使用临时数组。当第二个块使用它时,c的所有值都已设置为100,因此,它立即中断,将bngrid1的值保留为None数组。
编辑:
说,您可以先使用修订,将c的值传递给新的变量:
bn = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
c_temp = [ item for item in c] #don't use c_temp=c, that's wrong
minpos = []
bngrid = [None] * 16
for x in range(16):
minpos = c_temp.index(min(c_temp))
if c_temp[minpos] == 100:
break
bngrid[minpos] = bn[x]
c_temp[minpos] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid)
print()
第二个也一样。
或者您可以为其创建函数:
def func(c):
bn = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
minpos = []
bngrid = [None] * 16
for x in range(16):
minpos = c.index(min(c))
if c[minpos] == 100:
break
bngrid[minpos] = bn[x]
c[minpos] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid)
print()
我没有测试代码,所以我不建议复制粘贴它。
答案 1 :(得分:1)
由于许多变量和数组称为a,b,c等,因此您的代码很难阅读和调试。下次尝试仅发布问题的要点并命名变量,以使其他人容易理解你:)
关于您的问题-如果代码在第一部分中起作用而在第二部分中不起作用,则问题可能出在数组c中(很难说出什么数字而没有深入到代码中,因为再次说出名字但我可以看到,在第一部分中,您将循环中的c值设置为100。在第二部分中,您再次遍历了c(使用许多100个值修改了c),如果找到100,则会破坏环。也许它只是在开始时找到100,并在第一次迭代中打破了循环?尝试在每个循环中打印一些内容,以便至少知道它是否进入循环以及循环多少次,它将帮助您调试它。祝好运! :)
答案 2 :(得分:0)
问题似乎是您正在使用c数组中所有将bn数组随机化的块中的值,然后将值设置为100。
因此,在bn1块运行时,所有对c.index(min(c))的调用都返回零。
您可以在进入bn块之前尝试创建c的副本,并使用该副本随机化bn1块。