flag = True while(flag): key = {} row_permutations = [itertools.permutations(row) for row in mp] matrix_permutations = itertools.product(*row_permutations) for permutation in matrix_permutations: for i in range(len(mp)): for j in range(len(mp[i])): key[most_common_letters_m[i][permutation[i][j]]] = mf[i][j] decrypted_text = decrypt(cipher_text, key) if is_plaintext(decrypted_text, words): flag=False return key我最后修改flag跳出循环了吗
时间: 2024-02-14 22:12:30 浏览: 61
根据你提供的代码,`flag`在循环开始时被设置为`True`,并且在一些条件满足时被设置为`False`。如果在循环结束后,`flag`的值仍然是`True`,那么说明循环没有被`break`中止,也就是说没有满足设置`flag`为`False`的条件。
因此,如果你的代码在循环结束后没有显式地设置`flag`为`False`,那么这个循环将永远不会结束。如果你想要在循环结束时跳出循环,你可以在循环外部设置`flag`为`False`,或者在循环结束时使用`break`语句,让循环提前结束。
在你提供的代码中,如果满足了`is_plaintext(decrypted_text, words)`的条件,`flag`会被设置为`False`,但是在循环结束后并没有显式地设置`flag`为`False`。因此,如果循环没有被`break`语句中止,那么`flag`的值仍然是`True`,循环会一直进行下去。如果你想要在循环结束时跳出循环,可以在循环结束后添加一行代码:
```
flag = False
```
这样,如果循环没有被`break`语句中止,那么`flag`的值会被设置为`False`,循环会结束。
相关问题
row_permutations = [itertools.permutations(row) for row in mp] matrix_permutations = itertools.product(*row_permutations)那这里的matrix_permutations呢,给我一些示例
`matrix_permutations = itertools.product(*row_permutations)` 会对 `row_permutations` 中的每个迭代器进行排列,然后将它们的笛卡尔积作为最终结果。因为 `row_permutations` 中的每个迭代器都是对应矩阵 `mp` 中的一行进行排列的,所以 `matrix_permutations` 中的每个元素都是一个排列好的矩阵。
以下是一个示例:
假设有一个矩阵 `mp`:
```
mp = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
```
使用 `row_permutations = [itertools.permutations(row) for row in mp]` 对每一行进行排列操作,并使用 `matrix_permutations = itertools.product(*row_permutations)` 对整个矩阵进行排列操作后,将得到以下 `matrix_permutations`:
```
[
((1, 2, 3), (4, 5, 6), (7, 8, 9)),
((1, 2, 3), (4, 5, 6), (7, 9, 8)),
((1, 2, 3), (4, 6, 5), (7, 8, 9)),
((1, 2, 3), (4, 6, 5), (7, 9, 8)),
((1, 3, 2), (4, 5, 6), (7, 8, 9)),
((1, 3, 2), (4, 5, 6), (7, 9, 8)),
((1, 3, 2), (4, 6, 5), (7, 8, 9)),
((1, 3, 2), (4, 6, 5), (7, 9, 8)),
((2, 1, 3), (4, 5, 6), (7, 8, 9)),
((2, 1, 3), (4, 5, 6), (7, 9, 8)),
((2, 1, 3), (4, 6, 5), (7, 8, 9)),
((2, 1, 3), (4, 6, 5), (7, 9, 8)),
((2, 3, 1), (4, 5, 6), (7, 8, 9)),
((2, 3, 1), (4, 5, 6), (7, 9, 8)),
((2, 3, 1), (4, 6, 5), (7, 8, 9)),
((2, 3, 1), (4, 6, 5), (7, 9, 8)),
((3, 1, 2), (4, 5, 6), (7, 8, 9)),
((3, 1, 2), (4, 5, 6), (7, 9, 8)),
((3, 1, 2), (4, 6, 5), (7, 8, 9)),
((3, 1, 2), (4, 6, 5), (7, 9, 8)),
((3, 2, 1), (4, 5, 6), (7, 8, 9)),
((3, 2, 1), (4, 5, 6), (7, 9, 8)),
((3, 2, 1), (4, 6, 5), (7, 8, 9)),
((3, 2, 1), (4, 6, 5), (7, 9, 8))
]
```
可以看到,这里的每个元素都是一个排列好的矩阵,其中第一个元素 `((1, 2, 3), (4, 5, 6), (7, 8, 9))` 就是原始矩阵 `mp`,而其他元素则是对 `mp` 进行不同排列得到的。
def guess_key2(cipher_text, word1, word2 ,word3): letter_frequency = get_letter_frequency(cipher_text.lower()) excluded_letters = [letter for letter in letter_frequency.keys() if letter_frequency[letter] == 0] sorted_letters = sorted([letter for letter in letter_frequency.keys() if letter_frequency[letter] > 0], key=lambda x: letter_frequency[x], reverse=True) print("Excluded letters:", excluded_letters) print() most_common_letters_m = [sorted_letters[:1], sorted_letters[1:7], sorted_letters[7:10], sorted_letters[10:15], sorted_letters[15:20], sorted_letters[20:26]] # high 8 middle 8 low 10 f1 = ['e'] f2 = ['a', 'i', 'r', 't', 'o', 'n'] f3 = ['s', 'l', 'c'] f4 = ['u', 'p', 'm', 'd', 'h'] f5 = ['g', 'b', 'y', 'f', 'v'] mf = [f1, f2, f3, f4, f5] mp = [[j for j in range(len(mf[i]))] for i in range(len(mf))] flag = True while(flag): key = {} row_permutations = [itertools.permutations(row) for row in mp] matrix_permutations = itertools.product(*row_permutations) for permutation in matrix_permutations: for i in range(len(mp)): for j in range(len(mp[i])): key[most_common_letters_m[i][permutation[i][j]]] = mf[i][j] decrypted_text = decrypt(cipher_text, key) if is_plaintext(decrypted_text, word1, word2 ,word3): flag=False return key 这里每个key不包含全部的26组对应关系,请修改以将他们补齐
可以将代码修改为:
```
import itertools
import random
def guess_key2(cipher_text, word1, word2, word3):
letter_frequency = get_letter_frequency(cipher_text.lower())
excluded_letters = [letter for letter in letter_frequency.keys() if letter_frequency[letter] == 0]
sorted_letters = sorted([letter for letter in letter_frequency.keys() if letter_frequency[letter] > 0], key=lambda x: letter_frequency[x], reverse=True)
print("Excluded letters:", excluded_letters)
print()
most_common_letters_m = [sorted_letters[:1], sorted_letters[1:7], sorted_letters[7:10], sorted_letters[10:15], sorted_letters[15:20], sorted_letters[20:26]]
# high 8 middle 8 low 10
f1 = ['e']
f2 = ['a', 'i', 'r', 't', 'o', 'n']
f3 = ['s', 'l', 'c']
f4 = ['u', 'p', 'm', 'd', 'h']
f5 = ['g', 'b', 'y', 'f', 'v']
mf = [f1, f2, f3, f4, f5]
mp = [[j for j in range(len(mf[i]))] for i in range(len(mf))]
flag = True
while flag:
key = {}
row_permutations = [itertools.permutations(row) if len(row) > 1 else row for row in mp]
matrix_permutations = itertools.product(*row_permutations)
for permutation in matrix_permutations:
for i in range(len(permutation)):
if len(permutation[i]) == 1:
key[most_common_letters_m[i][0]] = mf[i][permutation[i][0]]
else:
for j in range(len(permutation[i])):
key[most_common_letters_m[i][permutation[i][j]]] = mf[i][j]
# 补齐未配对的字母
remaining_letters = set('abcdefghijklmnopqrstuvwxyz') - set(key.keys())
while len(remaining_letters) > 0:
letter = random.sample(remaining_letters, 1)[0]
value = random.sample(set('abcdefghijklmnopqrstuvwxyz') - set(key.values()), 1)[0]
key[letter] = value
remaining_letters = set('abcdefghijklmnopqrstuvwxyz') - set(key.keys())
decrypted_text = decrypt(cipher_text, key)
if is_plaintext(decrypted_text, word1, word2, word3):
flag = False
break
return key
```
这样,我们在生成 key 的过程中,对于每个位置,如果对应的单词只包含一个字母,则直接将该字母和对应的字母配对,否则使用 permutations() 函数生成所有可能的排列,然后将排列中的字母按照顺序与 mf 中的字母配对。然后,我们使用随机字母补齐未配对的字母,直到 key 包含 26 对对应关系。最后,我们检查解密后的明文是否满足给定的单词列表,如果满足,则返回 key。
需要注意的是,这里的随机字母选择算法并不完美,如果 mf 中的字母和已配对的字母集合中的字母的交集不为空,可能会导致算法产生死循环。如果需要更安全和更合理的随机字母选择算法,可以参考 Python 标准库中的 secrets 模块。
阅读全文