我正在寻找解密的值,以便它将显示所有可能的结果。而且由于密钥是消息长度的一半,因此为什么在那里会显示正确的值。但我也想在结尾处分别显示解密的文本。
Optional<T>
答案 0 :(得分:0)
我将这个问题解释为“即使我在较早的输出中可以看到解密的文本,为什么我的程序总是显示“无法找到解密的文本”?有三个原因。首先,用空格初始化cipher
和dec_test
:
cipher = ' '
#...
dec_text = ' '
当您应该使用空字符串初始化它们时。如果您不这样做,那么所有解密的字符串的开头都会有两个空格,并且它们绝不会与原始消息进行比较。
cipher = ''
#...
dec_text = ''
此外,该条件:
if (dec_text == msg):
word = dec_text
else:
word = 'Couldnt find'
出现在for key in range(len(alphabets))
循环的外部。这意味着,当dec_text
具有在循环的第51次迭代期间给出的任何值时,它将只执行一次。如果您想将msg
与dec_text
具有的不同值进行比较,那么您需要在循环内进行比较。
word = 'Couldnt find'
for key in range(len(alphabets)):
dec_text = ''
for alphas in decrypt:
if alphas in alphabets:
sol_dec = alphabets.find(alphas)
sol_dec = sol_dec - key
if sol_dec < 0:
sol_dec = sol_dec + len(alphabets)
dec_text = dec_text + alphabets[sol_dec]
else:
dec_text = dec_text + alphas
print('key {} {}'.format(key, dec_text))
if (dec_text == msg):
word = dec_text
请注意,我已经完全删除了else
块,而是在开始时无条件地将word
初始化为"Couldnt find"
。简单地将else
与if
一起添加到循环中是行不通的,因为没有任何阻止"Couldnt find"
覆盖word
的功能,即使它已经在更早的时候达到了一个值。迭代。这意味着除非在最后一次迭代中找到解密的文本,否则您始终会得到“无法找到”。只有if
而没有else
可以解决此问题。
最后,您可能希望以不区分大小写的方式将解密后的文本与原始文本进行比较。否则,您只能匹配全部大写的邮件。
if (dec_text == msg.upper()):
总的来说,最终程序如下:
def brute_force():
msg = raw_input('Enter your text here: ')
key = len(msg)/2
alphabets = 'ABC2&0346_+/*~DEFGHIJK(){";.<.>LMNOPQRST:?UVWXYZ!#$%'
cipher = ''
msg = msg.upper()
for chars in msg:
if chars in alphabets:
sol = alphabets.find(chars)
sol = sol + key
if sol >= len(alphabets):
sol = sol - len(alphabets)
elif sol < 0:
sol = sol + len(alphabets)
cipher = cipher + alphabets[sol]
else:
cipher = cipher + chars
print('Encrypted text {}'.format(cipher))
decrypt = cipher
word = 'Couldnt find'
for key in range(len(alphabets)):
dec_text = ''
for alphas in decrypt:
if alphas in alphabets:
sol_dec = alphabets.find(alphas)
sol_dec = sol_dec - key
if sol_dec < 0:
sol_dec = sol_dec + len(alphabets)
dec_text = dec_text + alphabets[sol_dec]
else:
dec_text = dec_text + alphas
print('key {} {}'.format(key, dec_text))
if (dec_text == msg):
word = dec_text
print('Decrypted text is {}'.format(word))
brute_force()
运行时,将产生结果:
Enter your text here: hello world
Encrypted text )JQQT #TUQI
key 0 )JQQT #TUQI
key 1 (IPPS !S?PH
key 2 KHOOR ZR:OG
key 3 JGNNQ YQTNF
key 4 IFMMP XPSME
key 5 HELLO WORLD
key 6 GD>>N VNQ>~
key 7 F~..M UMP.*
key 8 E*<<L ?LO</
key 9 D/..> :>N.+
key 10 ~+;;. T.M;_
key 11 *_""< S<L"6
key 12 /6{{. R.>{4
key 13 +4)); Q;.)3
key 14 _3((" P"<(0
key 15 60KK{ O{.K&
key 16 4&JJ) N);J2
key 17 32II( M("IC
key 18 0CHHK LK{HB
key 19 &BGGJ >J)GA
key 20 2AFFI .I(F%
key 21 C%EEH <HKE$
key 22 B$DDG .GJD#
key 23 A#~~F ;FI~!
key 24 %!**E "EH*Z
key 25 $Z//D {DG/Y
key 26 #Y++~ )~F+X
key 27 !X__* (*E_W
key 28 ZW66/ K/D6V
key 29 YV44+ J+~4U
key 30 XU33_ I_*3?
key 31 W?006 H6/0:
key 32 V:&&4 G4+&T
key 33 UT223 F3_2S
key 34 ?SCC0 E06CR
key 35 :RBB& D&4BQ
key 36 TQAA2 ~23AP
key 37 SP%%C *C0%O
key 38 RO$$B /B&$N
key 39 QN##A +A2#M
key 40 PM!!% _%C!L
key 41 OLZZ$ 6$BZ>
key 42 N>YY# 4#AY.
key 43 M.XX! 3!%X<
key 44 L<WWZ 0Z$W.
key 45 >.VVY &Y#V;
key 46 .;UUX 2X!U"
key 47 <"??W CWZ?{
key 48 .{::V BVY:)
key 49 ;)TTU AUXT(
key 50 "(SS? %?WSK
key 51 {KRR: $:VRJ
Decrypted text is HELLO WORLD
现在,它可以成功检测到解密的文本。