跳转至

Homework 1: Password Cracking

Q1: Caesar

Ciphertext:

FBUQIUUDSHOFJOEKHDQCUMYJXJXUIQCUAUOQDTKFBEQTJEBUQHDYDWYDPZK

Analysis:

Given that we already know it is a Caesar cipher, there can be at most 25 keys, ranging from 1 to 25.

Hence I use codes below to list out all the possible scenarios from which I can recognize the answer:

Code

#list out all the possible scenarios
def encry(t):
    if t>ord('Z'):
        t = t - 26
    return chr(t)

s = input()

for i in range(1, 26):
    print(f"向右偏移{i:2}位: ", end='')
    for char in s:
        print(encry(ord(char)+i), end='')
    print()

The output is as below:

figure
figure 1. The output

Conclusion

Finally we can confirm that the answer: 向右偏移10位: PLEASEENCRYPTYOURNAMEWITHTHESAMEKEYANDUPLOADTOLEARNINGINZJU

  • Content: PLEASE ENCRYPT YOUR NAME WITH THE SAME KEY AND UPLOAD TO LEARNING IN ZJU

  • Key: right:10

Q2: Vigenere

Ciphertext:

ktbueluegvitnthuexmonveggmrcgxptlyhhjaogchoemqchpdnetxupbqntietiabpsmaoncnwvoutiugtagmmqsxtvxaoniiogtagmbpsmtuvvihpstpdvcrxhokvhxotawswquunewcgxptlcrxtevtubvewcnwwsxfsnptswtagakvoyyak

Analysis:

Actually at first I don't know the length of key, hence I decide to guess the key length from 1 to n until I find the answer.

After selecting the key, I can conduct a frequency analysis and use letters that appear most frequently as "e" to verify.

In fact, the analysis is carried out by grouping based on the length of the key and then performing Caesar decryption separately.

Code:

When the length of key is 1.

# 对于vigenere密码,当key长度为1时,相当于caesar加密
# 直接copy过来

def encry(t):
    if t>ord('z'):
        t = t - 26
    return chr(t)

s = input()

for i in range(0, 26):
    print("key:"+chr(ord('a')+i), end='')
    print()
    for char in s:
        print(encry(ord(char)+i), end='')
    print()

the output is as below:

ktbueluegvitnthuexmonveggmrcgxptlyhhjaogchoemqchpdnetxupbqntietiabpsmaoncnwvoutiugtagmmqsxtvxaoniiogtagmbpsmtuvvihpstpdvcrxhokvhxotawswquunewcgxptlcrxtevtubvewcnwwsxfsnptswtagakvoyyak 
key:a
ktbueluegvitnthuexmonveggmrcgxptlyhhjaogchoemqchpdnetxupbqntietiabpsmaoncnwvoutiugtagmmqsxtvxaoniiogtagmbpsmtuvvihpstpdvcrxhokvhxotawswquunewcgxptlcrxtevtubvewcnwwsxfsnptswtagakvoyyak 
key:b
lucvfmvfhwjuouivfynpowfhhnsdhyqumziikbphdipfnrdiqeofuyvqcroujfujbcqtnbpodoxwpvujvhubhnnrtyuwybpojjphubhncqtnuvwwjiqtuqewdsyiplwiypubxtxrvvofxdhyqumdsyufwuvcwfxdoxxtygtoqutxubhblwpzzbl!
key:c
mvdwgnwgixkvpvjwgzoqpxgiioteizrvnajjlcqiejqgosejrfpgvzwrdspvkgvkcdruocqpepyxqwvkwivcioosuzvxzcqpkkqivciodruovwxxkjruvrfxetzjqmxjzqvcyuyswwpgyeizrvnetzvgxvwdxgyepyyuzhuprvuyvcicmxqaacm"
key:d
nwexhoxhjylwqwkxhaprqyhjjpufjaswobkkmdrjfkrhptfksgqhwaxsetqwlhwldesvpdrqfqzyrxwlxjwdjpptvawyadrqllrjwdjpesvpwxyylksvwsgyfuakrnykarwdzvztxxqhzfjaswofuawhywxeyhzfqzzvaivqswvzwdjdnyrbbdn#
key:e
oxfyipyikzmxrxlyibqsrzikkqvgkbtxpcllneskglsiquglthrixbytfurxmixmeftwqesrgrazsyxmykxekqquwbxzbesrmmskxekqftwqxyzzmltwxthzgvblsozlbsxeawauyyriagkbtxpgvbxizxyfziagraawbjwrtxwaxekeozscceo$
key:f
pygzjqzjlanysymzjcrtsajllrwhlcuyqdmmoftlhmtjrvhmuisjyczugvsynjynfguxrftshsbatzynzlyflrrvxcyacftsnntlyflrguxryzaanmuxyuiahwcmtpamctyfbxbvzzsjbhlcuyqhwcyjayzgajbhsbbxckxsuyxbyflfpatddfp%
key:g
qzhakrakmboztznakdsutbkmmsximdvzrennpguminukswinvjtkzdavhwtzokzoghvysgutitcbuazoamzgmsswydzbdgutooumzgmshvyszabbonvyzvjbixdnuqbnduzgcycwaatkcimdvzrixdzkbzahbkcitccydlytvzyczgmgqbueegq&
key:h
raiblsblncpauaobletvuclnntyjnewasfooqhvnjovltxjowkulaebwixuaplaphiwzthvujudcvbapbnahnttxzeacehvuppvnahntiwztabccpowzawkcjyeovrcoevahdzdxbbuldjnewasjyealcabicldjuddzemzuwazdahnhrcvffhr'
key:i
sbjcmtcmodqbvbpcmfuwvdmoouzkofxbtgppriwokpwmuykpxlvmbfcxjyvbqmbqijxauiwvkvedwcbqcobiouuyafbdfiwvqqwobioujxaubcddqpxabxldkzfpwsdpfwbieaeyccvmekofxbtkzfbmdbcjdmekveeafnavxbaebioisdwggis(
key:j
tckdnudnpercwcqdngvxwenppvalpgycuhqqsjxplqxnvzlqymwncgdykzwcrncrjkybvjxwlwfexdcrdpcjpvvzbgcegjxwrrxpcjpvkybvcdeerqybcymelagqxteqgxcjfbfzddwnflpgyculagcnecdkenflwffbgobwycbfcjpjtexhhjt)
key:k
udleoveoqfsdxdreohwyxfoqqwbmqhzdvirrtkyqmryowamrznxodhezlaxdsodsklzcwkyxmxgfyedseqdkqwwachdfhkyxssyqdkqwlzcwdeffsrzcdznfmbhryufrhydkgcgaeexogmqhzdvmbhdofdelfogmxggchpcxzdcgdkqkufyiiku*
key:l
vemfpwfprgteyesfpixzygprrxcnriaewjssulzrnszpxbnsaoypeifambyetpetlmadxlzynyhgzfetfrelrxxbdiegilzyttzrelrxmadxefggtsadeaognciszvgsizelhdhbffyphnriaewnciepgefmgphnyhhdiqdyaedhelrlvgzjjlv+
key:m
wfngqxgqshufzftgqjyazhqssydosjbfxkttvmasotaqycotbpzqfjgbnczfuqfumnbeymazozihagfugsfmsyycejfhjmazuuasfmsynbeyfghhutbefbphodjtawhtjafmieicggzqiosjbfxodjfqhfgnhqioziiejrezbfeifmsmwhakkmw,
key:n
xgohryhrtivgaguhrkzbairttzeptkcgyluuwnbtpubrzdpucqargkhcodagvrgvnocfznbapajibhgvhtgntzzdfkgiknbavvbtgntzocfzghiivucfgcqipekubxiukbgnjfjdhharjptkcgypekgrighoirjpajjfksfacgfjgntnxibllnx-
key:o
yhpiszisujwhbhvislacbjsuuafquldhzmvvxocuqvcsaeqvdrbshlidpebhwshwopdgaocbqbkjcihwiuhouaaeglhjlocbwwcuhouapdgahijjwvdghdrjqflvcyjvlchokgkeiibskquldhzqflhsjhipjskqbkkgltgbdhgkhouoyjcmmoy.
key:p
ziqjtajtvkxiciwjtmbdcktvvbgrvmeianwwypdvrwdtbfrwesctimjeqfcixtixpqehbpdcrclkdjixjvipvbbfhmikmpdcxxdvipvbqehbijkkxwehieskrgmwdzkwmdiplhlfjjctlrvmeiargmitkijqktlrcllhmuhceihlipvpzkdnnpz/
key:q
ajrkubkuwlyjdjxkuncedluwwchswnfjboxxzqewsxeucgsxftdujnkfrgdjyujyqrficqedsdmlekjykwjqwccginjlnqedyyewjqwcrficjkllyxfijftlshnxealxnejqmimgkkdumswnfjbshnjuljkrlumsdmminvidfjimjqwqaleooqa0
key:r
bkslvclvxmzkekylvodfemvxxditxogkcpyyarfxtyfvdhtyguevkolgshekzvkzrsgjdrfetenmflkzlxkrxddhjokmorfezzfxkrxdsgjdklmmzygjkgumtioyfbmyofkrnjnhllevntxogkctiokvmklsmvntennjowjegkjnkrxrbmfpprb1
key:s
cltmwdmwynalflzmwpegfnwyyejuyphldqzzbsgyuzgweiuzhvfwlpmhtiflawlasthkesgfufongmlamylsyeeikplnpsgfaagylsyethkelmnnazhklhvnujpzgcnzpglsokoimmfwouyphldujplwnlmtnwoufookpxkfhlkolsyscngqqsc2
key:t
dmunxenxzobmgmanxqfhgoxzzfkvzqimeraacthzvahxfjvaiwgxmqniujgmbxmbtuilfthgvgpohnmbnzmtzffjlqmoqthgbbhzmtzfuilfmnoobailmiwovkqahdoaqhmtplpjnngxpvzqimevkqmxomnuoxpvgpplqylgimlpmtztdohrrtd3
key:u
envoyfoyapcnhnboyrgihpyaaglwarjnfsbbduiawbiygkwbjxhynrojvkhncyncuvjmguihwhqpioncoanuaggkmrnpruihccianuagvjmgnoppcbjmnjxpwlrbiepbrinuqmqkoohyqwarjnfwlrnypnovpyqwhqqmrzmhjnmqnuauepissue4
key:v
fowpzgpzbqdoiocpzshjiqzbbhmxbskogtccevjbxcjzhlxckyizospkwliodzodvwknhvjixirqjpodpbovbhhlnsoqsvjiddjbovbhwknhopqqdcknokyqxmscjfqcsjovrnrlppizrxbskogxmsozqopwqzrxirrnsanikonrovbvfqjttvf5
key:w
gpxqahqacrepjpdqatikjraccinyctlphuddfwkcydkaimydlzjaptqlxmjpeapewxloiwkjyjsrkqpeqcpwciimotprtwkjeekcpwcixloipqrredloplzryntdkgrdtkpwsosmqqjasyctlphyntparpqxrasyjssotbojlpospwcwgrkuuwg6
key:x
hqyrbirbdsfqkqerbujlksbddjozdumqiveegxldzelbjnzemakbqurmynkqfbqfxympjxlkzktslrqfrdqxdjjnpuqsuxlkffldqxdjympjqrssfempqmaszouelhseulqxtptnrrkbtzdumqizouqbsqrysbtzkttpucpkmqptqxdxhslvvxh7
key:y
irzscjscetgrlrfscvkmltceekpaevnrjwffhymeafmckoafnblcrvsnzolrgcrgyznqkymlalutmsrgseryekkoqvrtvymlggmeryekznqkrsttgfnqrnbtapvfmitfvmryuquosslcuaevnrjapvrctrsztcualuuqvdqlnrquryeyitmwwyi8
key:z
jsatdktdfuhsmsgtdwlnmudfflqbfwoskxggiznfbgndlpbgocmdswtoapmshdshzaorlznmbmvuntshtfszfllprwsuwznmhhnfszflaorlstuuhgorsocubqwgnjugwnszvrvpttmdvbfwoskbqwsdustaudvbmvvrwermosrvszfzjunxxzj9

As above I didn't find the proper outcome.

When the length of key is larger than 1.

First I conduct a frequency analysis:

# 对于key长度大于1的情况进行分析

print("please enter the string to be encry")
s = input()

print("please enter the width of the key")
key_len = input()
key_len = int(key_len)

# 对于key = len的情况,将其分为len组,每组进行频率分析,得到每组的频率最高的字母,认为其对应的明文字母为e,计算出每组的key字母
for i in range(key_len):
    # 统计每组的频率
    freq = {}
    for j in range(i, len(s), key_len):
        if s[j] in freq:
            freq[s[j]] += 1
        else:
            freq[s[j]] = 1
    # 找到频率前三的字母,打印出来(格式:字母+频率),并存在新数组中
    freq = sorted(freq.items(), key=lambda x: x[1], reverse=True)
    print("the frequency of the group " + str(i) + " is:")
    for j in range(min(3, len(freq))):
        print(freq[j][0] + ": " + str(freq[j][1]))

After I select a key, I can verify whether its true:

# 输入字符串,不断尝试各种key,直到找到想要的结果,输入quit退出
print("please enter the string to be encry")
s = input()

while True:
# 这里输入的不是key,而是几组中对应的e的字母组成的字符串
    print("please enter the key to be processed")
    pre_key = input()
    if pre_key == "quit":
        break
    key = ""
    for c in pre_key:
        idx = (ord(c)-ord('e'))%26
        key += chr(idx+ord('a')) #此时key就是我们想要验证的key
# 对于key长度大于等于2的情况,开始解密,输出解密得到的字符串
    res = ""
    for i in range(len(s)):
        idx = (ord(s[i])-ord(key[i%len(key)]))%26
        res += chr(idx+ord('a'))

    print("the result is:")
    print(res)
    print("the key is:")
    print(key)

Verification process and conclusion

First I assume that the length of key is 2.

figure
figure 2. The highest frequency

Hence there are a total of nine possibilities: ta, tt, te, oa, ot, oe, ga, gt, ge

After verifying all of them, I find that none of them can meet the requirement.

Then I assume the length of the key is 3.

figure
figure 3. The highest frequency

There are 27 possibilities, so I try these options one by one. Eventually, "g", "e", "x" correspond respectively to the "e" in the combined group as the figure below.

figure
figure 4. The proper answer
  • Content: It is essential to seek out enemy agents who have come to conduct espionage against you and to bribe them to serve you give them instructions and care for them thus doubled agents are recruited and used Sun Tzu The Art of War

  • Key: cat

Q3: Unknown

Ciphertext:

MAL TIRRUEZF CR MAL RKZYIOL EX MAL OIY UAE RICF “MAL ACWALRM DYEUPLFWL CR ME DYEU MAIM UL IZL RKZZEKYFLF GH OHRMLZH”

Analysis:

Actually I have no ideas how to do this when I see the ciphertext. However, I noticed that there are 5 "MAL" occurring in the text, which implies that it can't be vigerene. After confirming it's not caesar, I decided to find a one-to-one correspondence.

"MAL" appears the most frequently. I guess it's "THE"

Then, "MAIM" refers to "TH_T", I guess it's "THAT", A->I

"A_E"->"IZL", R->Z or G->Z or W->Z or X->Z or Y->Z

"_E"->"UL", W->U or H->U or M->U

combine the two words, I can make a guess that "UL IZL" is "WE ARE", R->Z, W->U

"xxx" is a sentence someone says, "WH_"->"UAE", "_A__"->"RICF", I just guess it's "WHO SAID"

"O_"->"EX", guess it's "OF"

Then, "_ASSWORD"->"TIRRUEZF", I guess it's "PASSWORD"

"HI_HEST"->"ACWALRM", it's "HIGHEST"

"__OW_EDGE"->"DYEUPLFWL", it's "KNOWLEDGE"

"S_RRO_NDED"->"RKZZEKYFLF", it's "SURROUNDED"

"_AN"->"OIY", "WHO SAID" is after it, I guess it's "MAN"

"be sorrounded by", so "BY"->"GH"

Conclusion

  • key: After a series of guess, I can form an one-to-one correspondence table, which is the key of the cipher:
Original Text Encrypted Text
A I
B G
D F
E L
F X
G W
H A
I C
K D
L P
M O
N Y
O E
P T
R Z
S R
T M
U K
W U
Y H
  • text: THE PASSWORD IS THE SURNAME OF THE MAN WHO SAID "THE HIGHEST KNOWLEDGE IS TO KNOW THAT WE ARE SURROUNDED BY MYSTERY"