標籤:

用python寫一個加密工具

kingsznhone/Ragnarokgithub.com圖標

大紮好,我系軲天樂,我四渣渣輝,探挽懶月,介四里沒有挽過的船新版本,擠需體驗三番鍾,里造會幹我一樣,愛象節款遊戲

基於加密模塊和多線程socket,通過公網小雞搭橋在兩個終端之間傳輸加密數據流的小工具,詳情和使用方法內見。

被害妄想日常發作的我,聯想到有一根長長的網線一直伸到我家裡,細思恐極。自學60天,成了一隻python速成雞,寫了一個工具以備不時之需。寫個文章吐槽一下本速成雞的心路歷程。

我第一次想寫這個程序的時候,其實我是拒絕的。因為我覺得你不能叫我寫我就馬上去寫,第一我要試一下,我又不想一個程序寫完後加上好多特技,GUI很酷,很炫,很亮,結果大佬出來一定會罵我,根本沒有這種程序,證明上面這個是假的。我說先讓我試一下。後來經過證實也知道它們是可靠的,而且沒有那種化學成分。寫了一個月……這個月下來之後,起碼我用了很舒服,現在我每天還在用,我還給我小夥伴用:「來!來!來!大家試試看!」我跟大佬講:「寫完之後,這個程序就是我的程序,就不要再加特技上去,沒有,就是這樣子。」我要給大佬看到,我寫完之後就是這樣子,你們用的時候也是這樣子!


玩個蛇

呵呵,你也網上衝浪啊,你是gg還是mm?這種尬聊彷彿還在昨天,那些年好像企鵝還能看到對方的IP,那些年好像爸媽和單位的叔叔阿姨都還在用狗狗搜索(爸媽都是這麼叫的,有這個搜索引擎嗎,手動滑稽)

一個月以前學業不是很緊張,想著21世紀有可能Cyberpunk的未來,學學計算機語言以備不時之需。對比了幾個主流語言,決定玩蛇,畢竟我是個沒底子的菜雞,想要把想法最快速度轉化成現實,玩蛇很適合我。

最開始不知道怎麼學,仔細讀了一遍官方文檔,雖然第一遍看的一頭霧水,但是官方文檔是個好東西,讓我對程序的基本寫法有了一個大概的認識,其實初中的時候,稍微學過一點點C語言(For while dowhile的水平)最直觀的就是沒有花括弧的感覺真好。看來看去發現了一個叫checkio的網站,Gamer的靈魂沸騰了,每天都在想怎麼寫一個演算法解決實際的問題,不會的寫法到處搜索,得意洋洋提交了自己一大堆臃腫的代碼以後,看到了best solve里各種炫技的一行流寫法,交出了自己一年的膝蓋給大神們跪了。很不推薦一行流寫法,看起來很炫,讀起來是災難。

混跡checkio的日子裡,我寫出了人生第一個有實際意義的小程序,小學生最喜歡玩的遊戲,課間在地上畫個九宮格XXOO。大概當時的水平就是如此的弱智吧。玩蛇第一步,我告訴自己沒關係。


先定個小目標

既然已經學到了點皮毛,就產生了把所學的姿勢在實踐中熟練,同時學習新姿勢的想法。現在網路環境這麼惡劣,數據包出了網線介面,隨時面臨著被視奸的危險。要是被壞叔叔拿去幹壞事可怎麼辦啊。我能想到的方法是只在本地做加密解密,進入網路的數據誰都不知道是啥。

說干就干,做個加密聊天器。首先得有網,把我搞蒙圈了。我以前只知道網路是網線和路由器組成的,家裡的小網線接到小路由器上,小路由器接到光纖上,光纖接到運營商的大機房裡,大機房裡又伸出一條又黑又粗的光纜通向世界。可網路協議是啥啊,那幾天一直在惡補TCP UDP協議和套接字的姿勢,邊學邊寫了幾個測試程序,在本地的兩個埠之間發包,體會玩蛇人生的美妙,弄出來個UDP協議的基礎架構。寫著寫著菊花一涼,我在本機上試驗,不存在丟包問題,用UDP寫確實很方便很快捷,但是要是丟個包整個程序就卡死了啊。好嘛,換TCP協議,相當於直接重寫了啊。看著自己寫了半個月的代碼突然變成垃圾,心痛的無法呼吸。

網路協議和套接字搞明白了以後,第二個問題來了,要麼樣才能加密。本人熟練掌握凱撒加密技術,二戰德國用的enigma密碼機的原理我看都看不懂,還不是被盟軍破解了,那就開始惡補現代密碼學,AES RSA ECC 都是些啥玩意啊,這一堆公式我怎麼看不懂啊,我大概上了個假大學。經過一段時間的惡補,對現代密碼學有了一定的了解,接下來咋辦啊。別人做好的庫我拿來用吧,畢竟看到過一句話,不要試圖自己去寫加密演算法,去調用成熟可靠的庫。可是調用模塊之間的傳參好複雜啊。什麼?!參數類型錯誤。什麼?!調用錯誤。那幾天是我人生中最陰暗的時光,彷彿玩蛇人生失去了未來。在這個時候,我想到了官方文檔,沒錯就是最開始看了一遍一頭霧水的官方文檔。拿起來重新讀了讀,有了一定的實踐經歷,再回去讀官方文檔真是醍醐灌頂,把各種調用和參數類型捋了一遍,繼續寫代碼做試驗。可是做著做著,怎麼經常出現一些奇奇怪怪的問題,解密錯誤,收不到正確的響應,用祖傳的print大法一看,怎麼我發了三個包只接到一個包,這三個包怎麼首尾相連了。搜了一下才知道TCP的粘包問題,真是可怕啊,我們說好定個小目標一起玩蛇呢,怎麼越搞越複雜了。

為了解決粘包問題,十八般武藝都用上了,什麼確認包啊,等一段時間啊,可是等一秒就等於cpu體感等待了幾十年啊。最後反過來思考,在本地把數據粘包,再做個報頭,就可以一次發出去了,到了目標端在分包不就好了嗎,說干就干。可我為什麼把代碼重新寫了一遍啊。本該是雙份的快樂,為什麼會重構代碼啊,你為什麼重寫的這麼熟練啊。

搞明白了網路協議和密碼學以後,怎麼做到像企鵝vx一樣收到的消息隨時可以顯示在屏幕上,還要能隨時發消息出去,這可咋辦啊,先試試循環……什麼?!不發消息就屆不到消息,這可不行啊,難道要做兩個程序一個發送一個接收嗎,怎麼這麼複雜了。在看不到一點希望的時候,有大佬提醒我可以做多線程。多線程就是那種相當於在一個程序里運行兩個小程序的東西嘛,好說好說,看看多線程模塊。

這class是啥啊。這self又是啥啊,線程鎖又是啥啊,協程非同步io又是啥啊。為了搞明白class,感覺自己少了十年的生命。self的傳參是我有史以來見過最可怕的東西。看著試過不知道幾百遍的代碼成功運行起多線程的那一刻,我癱瘓在椅子上彷彿py被掏空。

一套大寶劍下來,運行起來越來越完善,優化了交互信息以後,終於發布了0.1 BETA。第二天趁熱打鐵,在聊天端的架構上,寫了一個流式加密模塊,成功實現了大文件傳送的功能,發布了0.2beta。一個小目標竟然變成了60天玩蛇速成班。涉及到了網路協議,現代密碼學,多線程式控制制各方面的姿勢學習。可是還有滿腦子騷操作不知道如何轉化成實際功能。就請各位大佬提拔一下本速成雞。不說了,本速成雞要打開久違的steam放縱一下了。


推薦閱讀:

有趣的演算法謎題之2016
機器學習之非均衡數據處理
R語言中不能進行深度學習?

TAG:Python |