誰能幫忙解密下面一段密碼,某個朋友的exGF寫給他的,對他很重要?
000001011001101011
10000001010000100011011
00010011100010010100011011 00 000000100010010100011 0110000110001000100
分三行,她給的提示只是說,跟摩斯密碼有關。
答案終於解出,請大家鼓掌撒花!答案為:
Line 1: Happy
Line 2: Birthday
Line 3: I Love EnDa Tan, I Have EnDa Tan, I Will
如果對應摩斯碼和字母的話,如下:
Line 1:
0000 01 0110 0110 1011
H a p p y
Line 2:
1000 00 010 1 0000 100 01 1011
B i r t h d a y
Line 3:
00 0100 111 0001 0 0 10 100 01 1 01 10
I L o v e E n D a T a n
00 0000 01 0001 0 0 10 100 01 1 01 10
I H a v e E n D a T a n
00 011 00 0100 0100
I W i l l
===============================
-1 readme
今天,也就是2015年7月1日(黨的生日嗎…),無意中翻關注,又看到了這個題目,而且看到知乎er @白河hotaru 進一步解出了第三行的部分密文。參考他的結論,再進行思考、比較、以及程序的運行,終於是解出來了!這個叫EnDa Tan的人,你是把我們害苦了!
2015.01.05 看到題目,嘗試人工解密,失敗
2015.01.06 修改方法,嘗試程序解密,失敗
2015.01.07 撰寫答案,以便提供思路
2015.07.01 參考 @白河hotaru 的答案,拆分了第三行的摩斯碼,終於成功解密。
為了解個密,我也是蠻拼的......
================================
0 論被知乎問題玩了的一天:記一次失敗的解密過程
幾天前成功為一個知乎er解密了一個明信片上面的密文,3天400+贊的感覺真是特別過癮!於是,自己手賤又在知乎上面搜索類似的,沒有被解密成功的問題,嘗試進行解密。選題呢,不能盲目的選,知乎上面很多類似的提問,就給了個密文,沒有任何提示,這種題目能解出來的概率實在是太低了… 上次那個題能夠成功解密,主要的原因是那個女孩兒在題目中已經給了足夠的提示。於是就找到了這個題,於是就用各種方法解密了一把,於是整個人都斯巴達了…
雖然沒有成功解密出來,不過為了不讓2天的努力白費,我還是準備稍微回答一下,給出思路,看看有沒有其他的高人能夠解出來,我覺得我是儘力了…
================================
1 Question
誰能幫忙解密下面一段密碼,某個朋友的exGF寫給他的,對他很重要?
000001011001101011
10000001010000100011011
00010011100010010100011011 00 000000100010010100011 0110000110001000100
分三行,她給的提示只是說,跟摩斯密碼有關。
================================
2 題目分析
這題滿足了可能解密成功的全部要求好嗎!密文相對比較簡單(只有0和1,且並不是特別長);有提示(跟摩斯密碼有關);有人成功破解出了一部分(見 @詹博奕 的答案)。那麼,我也嘗試來解一解。
首先,既然和摩斯密碼有關,我們就來看看摩斯密碼到底是個什麼東西。這類知名度比較高的名詞,百度百科就可以了:摩爾斯電碼(又譯為摩斯密碼,Morse code)是一種時通時斷的信號代碼,通過不同的排列順序來表達不同的英文字母、數字和標點符號。它的代碼包括五種: 點(.) 劃(-) 點和劃之間的停頓 每個字元間短的停頓(在點和劃之間) 每個詞之間中等的停頓 以及句子之間長的停頓。
摩斯碼的對應表如下(圖片來自百度百科,摩斯密碼:摩爾斯電碼_百度百科):
但是,這道題的問題是,每個詞之間沒有停頓。因此,這樣的編碼解密過程會出現歧義的。舉例來說,第一個詞000001011001101011,如果我們把所有的0翻譯成E,所有的1翻譯成T,那麼就可以得到一個結果EEEEETETTEETTETETT。雖然這個詞是沒有意義的,但僅從摩斯密碼來說,它確實是一個正確的結果。因此,想解決這個問題,我們需要完成兩部分內容:
- 確定0是點,1是劃;還是反過來,1是劃,0是點。
- 嘗試翻譯每一個詞,然後找出有意義的詞出來,作為結果。
@詹博奕的答案已經給出了一個很棒的提示:
第三行中間的「00」是單獨存在的,根據摩爾斯電碼字母表,「00」可能代表「ee」、「m」、「i」、「tt」。這段密碼是英文或者拼音,那麼「00」最有可能代表的是「i」。所以0=點,1=劃。
關鍵是, @詹博奕還解出了前兩個詞的意思好嗎!分別是Happy Birthday。這更是讓我覺得這個題有解。那麼,為什麼 @詹博奕沒有繼續解密呢… 暫且不表,我們先繼續往下。
既然知道了思路,我們就嘗試先人工解密一下。但是,解密過程超級痛苦… 因為要一個一個猜,跟拼字遊戲似的。能不能寫一個程序,把所有可能的結果全列舉出來,然後人工挑呢?這就是我答案的第一部分了。說動手就動手!這種程序還是挺好寫的,畢竟碼錶在上面列著呢,開動開動!寫完以後,跑跑試試唄~ 把所有的可能列在文件裡面。那麼,大家猜猜,這6個詞,所有可能的結果寫在文件裡面,大概有多少種情況?需要佔用多大的硬碟空間呢?
~
~
~
~
~
~
~
~
~
~
~
~
~
我跑完以後,私下問了一下 @之幽同學,他的猜測結果是1KB左右
~
~
~
~
~
~
~
~
~
~
~
~
~
我只能說,Too Simple Too Naive!!!
~
~
~
~
~
~
~
~
~
~
~
~
~
你知道有多大嗎?
~
~
~
~
~
~
~
~
~
~
~
~
~
6個文件加起來的大小是:
坑爹啊!看來人工搜索是沒戲了,失敗......
================================
3 程序解密+Naive字典
其實上述方法本身是正確的,不過如何篩選有意義的字元呢?這就引入了下面的方法:找一個英文字典,通過這個字典來自動查找產生字元中有意義的子串,這就有可能是解密結果了。網上搜索了一下,一個有價值的工程來自awnuxkjy/recommend-system · GitHub中的SpellCorrect。顧名思義,這是一個拼寫檢查程序。我們引用這個程序,把拼寫檢查引入其中,只要拼寫檢查正確,就認為這個字元是有意義的。那麼,這個程序用的字典是哪裡來的呢?查了查源代碼,字典來自於工程中的big.txt文件,打開一看… 這竟然是一個大小為接近3M的大文檔… 程序把文檔中的所有符號刪除,然後每一個空格作為一個分隔符,把文檔拆成一個個單詞,存在HashMap中。最後,把這個HashMap作為字典。
這確實是一個很好的思路啊有木有!我把這個程序改了改,用在了我自己的程序裡面。修改後的程序大概是這樣(因為是引用程序,代碼可以貼出來,哈哈)
package cn.edu.buaa.liuweiran.morsecode;
import java.util.HashMap;
import java.util.Map;
import cn.edu.buaa.liuweiran.util.In;
public class Dictionary {
private Map&
public Dictionary(String fileName) {
In in = new In(fileName);
this.dictionaryMap = new HashMap&
String s = "";
while ((s = in.readLine()) != null) {
// Delete all non-alphabet symbols
s = s.replaceAll("\pP|\pS|\pM|\pN|\pC", "");
// Change the word to lower-case, save to the map
s = s.toLowerCase();
String[] splits = s.split(" ");
for (int j = 0; j &< splits.length; j++) {
if (!" ".equals(splits[j]) !"".equals(splits[j])
!splits[j].equals(null)) {
if (this.dictionaryMap.containsKey(splits[j])) {
Integer count = this.dictionaryMap.get(splits[j]);
this.dictionaryMap.put(splits[j], count + 1);
} else {
this.dictionaryMap.put(splits[j], 1);
}
}
}
}
}
public boolean hasWord(String word) {
return this.dictionaryMap.containsKey(word);
}
}
運行以後,前面兩個詞能解出來!第一個詞只有一個對應,就是happy。第二個詞有兩種可能的對應,birthday,或者是thursday。有興趣的知乎er們可以人工測試一下,這兩個解都是原始密文對應的正確結果哦!
不過,第三個,第五個,第六個程序並沒有找到正確的結果。所以,還是解密失敗......
================================
4 成功解密
2015年7月1日,看到了 @白河hotaru 的答案。他的答案給了我非常大的提示。主要的提示有如下兩點:
- 第三行給出的空格根本是沒有意義的!需要合起來看,那兩個空格是誤導!
- 部分解密結果。
最大的提示在於,第三行的前面一部分和後面一部分都解密出來了。第三行開始的一部分為:
00 0100 111 0001 0
I L o v e
第三行結尾的一部分為:
00 011 00 0100 0100
I W i l l
由於是開始和結尾,而且解密結果是有意義的,我認為這兩個地方肯定是正確的,沒問題。於是就剩下中間這坑爹的一串:
010100011011000000001000100101000110110
@白河hotaru 中間還解出了一個Yes,即中間的這個部分:
01010001 1011 0 000 00001000100101000110110
???????? Y e s ???????????????????????
但這裡有個很尷尬的問題,Yes前面的部分沒有什麼意義啊?就是
01010001
這一串。幸虧我當時用於解這個題寫的程序還在,跑跑看唄。這個子串非常短,解出的結果也很少,所有可能的答案用程序跑出來一共有99個,可以人工搜索一下,截圖如下:
但是,這99個結果裡面沒有一個是有意義的子串。所以我懷疑可能中間的10110000並不代表Yes,而是代表其他的意思。繼續觀察唄,突然發現一個很嚴重的問題。這段字串裡面有非常長的一段是重複的!我們來看一下星號標註的子串:
0101000110110 0000000100010 0101000110110
************* ????????????? *************
我勒個去,這兩串不會是人名吧?即:
...... 0101000110110, 0000000100010, 0101000110110, ......
I Love 人 名, ?????????????, 人 名, I will
這可就有意思了!這個人名是什麼呢?繼續用程序跑一下,這回答案有點多,一共有2551個。
我們人工搜索一下,突然發現有非常有意義的一串啊!
難道姓譚,叫恩達?靠譜靠譜!中間那串呢?直接用0000000100010搜索的話,答案特別多,一共有2871個。不過既然可以這麼斷句的話,一般開頭的00代表I,去掉開頭00的話,答案會減少到772個。唯一有意義的就是這個答案啦:
那麼,I Love EnDa Tan, I Have EnDa Tan, I Will。非常通順嘛!當然了,EnDa Tan那一段可能是別的人名了,這個我就真不知道了… 希望題主能夠給一個認識人,或者非常熟悉人的人名列表,我們可以對比一下!================================
以上。
- 2017年5月更新
- 先說第三句結論:I love U,always have,always will.
- 合起來就是Happy Birthday. I love U,always have ,always will.
- 我在兩年前逆向思維法,試出了love和will,是因為對這種告白或是分手或是挽留或是生日祝賀,我只能往這些方向試,最開始以為是「Yes,I will」但是轉念一想,既然已經是前女友,前男友又沒說「我重新告白了」做鋪墊,上來就是I love (名字)Yes,I will也不符合常理。
- @劉巍然-學酥在15年黨的生日又作了一次新總結,最終結論是I love(譚恩達)I have(譚恩達)I will.這個嘛,一般情侶哪怕是前情侶之間的稱呼、很少直呼大名,而且haveXXX不符合ex的題意,明明沒有在一起,除非譚恩達是她現在的男友。
- Happy birthday,(I will love you no more)I love (現任男友)譚恩達I have譚恩達I will (get laid with him(誤)).是唯一通情達理的解法。
- 和上次不同的是,在黨的生日這天,@劉巍然-學酥又找到一個新詞:have.
- have這個詞不一般,我兩年前是無論如何也不會想到,have這個詞可以出現在這個語境,所以我逆向試不出來這個詞,只有作為博士程序員的@劉巍然-學酥可能窮舉法試出這個詞。
- 但是我看到love、have、will三個詞的時候,我想到一個詞:always
- 上一個圖:
想起來什麼了么?
Gossip Girl 里的 Blair 和 Nate 講過:I love you,always have ,always will.(我愛你,勿失勿忘)這部劇一般男生不會看,女生喜歡看,答主也沒看過,只是知道這句話。
- 現在如果用always來試驗的話:情況是這樣的:01 0100 011 01 1011 000
- 原密碼是:01 0100 011 01 1 000也就是說原密碼直譯是: I love alwats have alwats will.
- 我覺得即使是這麼半吊子的一句話,也比Happy birthday,I love 譚恩達I have,譚恩達I will .要好,至少是句話( )。
- 最後一個問題了:為什麼是alwats……搞了這麼複雜的密碼,T是1,Y是1011,沒可能混淆,而且重複兩遍也沒可能抄錯,其他片語也搭配到位,除非,有深意?
- 這時我注意到:I love也不是無懈可擊,整句話沒有賓語。you去哪兒了?
- 英語中you常簡寫作U,U為001,原密碼中後面跟著alwats的A,除非……E(0)+A(01)=U(001)……豁然開朗……原來是個藏頭詩!
- 可能用藏頭詩來比喻不太恰當,但是既然密碼能分解成多種意思,也就是非單射,那麼每種映射意思我都用來表意也可以啊……
- 所以alwats也迎刃而解w(011)的最後一位摩斯電碼(1)與a(01)t(1)可以合成一個Y(1011)----alwats中隱含著always
- 在此也提醒一下信息學密碼學的兄弟,如何做到密碼不被計算機暴力破解?除了因式分解大素數乘積之外,這種藏頭藏密碼的方法也可以讓對方必須人工處理……(要是寫論文出書帶我和題主ex一個作者吧)
- 最後分析一下題主ex的心理吧,「都告訴你是摩斯電碼了,再不加點難度,你去百度和我直接寫給你沒有區別。不如,首先不給空格反而添幾個假空格,然後分段讓你看不出兩個重複出現的always,最後,一碼多義,藏起來心意」
- 如果ex夠聰明了解到本題難度(數位答主、甚至包括信息安全博士、思考交流三年)那麼這位ex一定不是故意為難,而是曾經和題主海誓山盟,當題主說:I love you forever時,ex說「不,只要我們always have always will.」如果題主忘記了這誓言,也不怪她成了ex。
- 從這個題目就能看出,這位exgirlfriend,是一位知性的、博學的、歐美風的、古靈精怪的、狡黠的女生,在此為題主所失感到惋惜
- 最後上圖,順便可恥的@vczh求贊
- 最後引用一位評論者的話「這才像是知乎嘛」
- ---------兩年前的分割線---------------
- 我已經基本解出第三行,在情人節前解出來,會不會很及時呢~(雖然已經過去一年了)來吧:
- 其中:01010001101101也可能是一個always的藏頭…… 總之,前面一個I love。 中間一個 yes,最後一個I will 是一定的。怎麼看都是告白的回復。恭喜了。前面兩行happy birthday 也是確定的,中間一堆零後面可能是英語人名,漢語拼音(某人狼)或是昵稱。
- 破解過程:早上爬起來隨手找了本書演草,字丑趴著寫的。
- 後來首先製作對應表,排除0101、0011、1110這樣不存在的組合,猜測密文,當然,4、5個英文字元的片語最容易判斷,也沒有that which 之類的就不是長難句,把常用主系詞對應一下,很快就有收穫。
- 然後定基調,最開始試了一些sorry but yet can"t not just friend 這樣的拒絕辭彙,哎~可惜都不是。
- 然後試出love:010011100010就呵呵了,(單身狗看不下去,呼叫大FFF)而且字母「O」111被排除了。基調確定後,就很快完成了
- 附贈順序的對應表,方便大家破解其他摩爾斯密碼(當然也可以用來為難你的exBF去)
摩爾斯電碼的每個數字都是用五個符號表示的,這組數字不是5的倍數,所以不是數字應該是字母。第三行中間的「00」是單獨存在的,根據摩爾斯電碼字母表,「00」可能代表「ee」、「m」、「i」、「tt」。這段密碼是英文或者拼音,那麼「00」最有可能代表的是「i」。所以0=點,1=劃。
然後胡亂猜出前兩行貌似是
happy
birthday。
後面的還沒猜出來。
以上2014.2.10
-----------------------------------------------------------------------------------------
過了快一年了吧,這個題又被翻出來了,首先不得不贊一下大神 @劉巍然-學酥 ,技術手段就是不一樣。既然用技術手段排除了太多的可能,我在重新思考會不會是我在一開始的假設過於簡單,解出的答案只是一個巧合呢,或許給後續各位的解密帶來了誤導。各位不妨再發散一下思維,或許這裡有兩層或三層的加密呢。
與解謎無關的一些話
鑒於這個問題的描述,覺得這個問題肯定是有很強的時效性的。當時把自己能想到的寫了上去,之後沒能再有進一步的推理,鑒於這個問題的時效性,也就沒有再關注這個問題。
不知題主看到這問題時隔許久就被翻了出來又是作何感想啊,是否又被翻出了塵封已久的記憶啊。若真是如此,望題主見諒。
個人覺得有些事如果當時沒有解開,就讓它一直成為一個秘密吧。
就這樣吧,我個人不再參與這個問題的討論。
我也來湊湊熱鬧。看了前面諸位的答案,也自己寫了個程序,測試了一下,結果跟 @劉巍然-學酥的一樣。前兩行能夠跑出來。
最後一行除了 「I」一個都沒跑出來,這似乎不太正常。
按照這三行的格式,單詞內的字母沒有空格,單詞之間是有空格的。原因,可能是問題本身有錯誤,我猜測有下面幾種可能
1.題主漏掉了或者標錯了部分空格
2.題主漏掉了或者標抄錯了部分數字
3.題目中可能有數字、英文、和符號混合的情況,而前面諸位只考慮了英文的情況(字典的問題)
4.有些特殊的字元只有當事人才知道其意義 如名字縮寫,特殊的情侶之間特定的一句話、一個詞
000001011001101011
10000001010000100011011
00010011100010010100011011 00 000000100010010100011 0110000110001000100
分三行,她給的提示只是說,跟摩斯密碼有關
第三行 倒數第二個字元串
000000100010010100011
假定其由幾個單詞和別的東西組成的,
1.寫個程序將該字元串所有的情況枚舉出來
2.使用字典匹配前面、後面、和中間任意位置。
3.從中找出有意義的單詞,看看能否組合起來,或者將字元串中剩下的字元串繼續按照 @劉巍然-學酥 類似的方法,窮舉嘗試。
最後一個單詞,只匹配(依賴字典)三個字母以上單詞的情況有:
前半部分可以是
fuzz@thinkpad:/media/jenny/jenny/morse_code$ cat head.txt |cut -d" " -f3|sort -u
ABATE
ABE
ATE
EMS
PEE
PEEP
PEU
PIA
PIE
PIEZ
PIPE
PIPER
WEE
WEI
WES
WEST
WIE
後半部分可以是
fuzz@thinkpad:/media/jenny/jenny/morse_code$ cat tail.txt |cut -d" " -f3|sort -u
ADLAI
DAI
EEL
ELL
ENID
ERE
FEED
FINE
ILL
IRE
LED
MILL
NEED
NEEDED
NINE
PITIED
REED
RID
RUI
SMILED
SPELL
STEEL
SWILL
TIED
TIL
TILED
TILL
TIRE
VEE
VEEL
VIED
WILL
如果僅僅是漏掉了空格或者錯分了空格,或者只有一個很少的錯誤,肯定能夠解出第三行的明文來。
@白河hotaru 同學找到了 love 。但是還是沒有完全解密這個答案。我是非常非常懷疑這個問題本身有問題。
考慮到沒人確認第三行的正確性,繼續搞的動力也就沒了。不過還挺好玩的,通過這道題目,了解了下morse code.
這樣解碼,不如問她閨蜜
看了各位大神的答案,我也仔細觀察了一下
發現第二行的結尾和第三行第一組的結尾是一樣的(如果第二個是birthday的話,我猜想第三行第一個詞結尾也應該是day吧)
上面想多了,沒那麼複雜,應該是對方沒有斷句,題主朋友名字是什麼?第一句應該是TO 名字。
如果你這個沒打錯的話~~根據空格隔開了~每段應該是一個字或者字母組合~如果是摩斯密碼~~我看了下漢字的對照表~是4位數~四位數想用二進位表示需要16位~故排除~~所以應該是字母組合~至於拼音還是英語單詞就不得而知了~~可以嘗試用0代表短音1代表長音自己去試~~~
推薦閱讀:
※怎麼跟前任表白?
※同桌在旁邊表白,是種什麼樣的體驗?我該怎麼做?
※我給喜歡的女孩子表白,她跟我說一閃一閃亮晶晶,滿天都是小星星。有什麼含義嗎。?