摘要:嘛,既然開(kāi)始學(xué)密碼了,就還是記錄一下自己的學(xué)習(xí)歷程,這樣也會(huì)有意思一些,希望自己能夠做到一周寫(xiě)兩次自己的學(xué)習(xí)進(jìn)度吧,今天先來(lái)第一步什么叫密碼學(xué)哦。
嘛,既然開(kāi)始學(xué)密碼了,就還是記錄一下自己的學(xué)習(xí)歷程,這樣也會(huì)有意思一些,希望自己能夠做到一周寫(xiě)兩次自己的學(xué)習(xí)進(jìn)度吧,今天先來(lái)第一步:什么叫密碼學(xué)哦。
最近和教授討論研究的方向,很煩,因?yàn)槲也艅倓側(cè)雽W(xué),信息安全方面的論文要說(shuō)完整讀下來(lái)的基本還沒(méi)有,所以慢慢積累吧,最近在讀的[1]基本也是卡在了經(jīng)典的homomorphic Encrytion--Paillier加密上。沒(méi)辦法,數(shù)學(xué)基礎(chǔ)比較堪憂,老師和我商量后也是基本定在做同態(tài)密碼了,所以,慢慢啃吧。
啊,扯遠(yuǎn)了,首先開(kāi)始寫(xiě)寫(xiě)什么叫密碼學(xué)吧,然后在舉個(gè)栗子。
Cryptography or cryptology (from Greek κρυπτ?? kryptós, "hidden, secret"; and γρ?φειν graphein, "writing", or -λογ?α -logia, "study", respectively[1]) is the practice and study of techniques for secure communication in the presence of third parties called adversaries.[2] More generally, cryptography is about constructing and analyzing protocols that prevent third parties or the public from reading private messages;[3] various aspects in information security such as data confidentiality, data integrity, authentication, and non-repudiation[4] are central to modern cryptography. Modern cryptography exists at the intersection of the disciplines of mathematics, computer science, and electrical engineering. Applications of cryptography include ATM cards, computer passwords, and electronic commerce.[2]
意思基本就是兩層:1,密碼學(xué)的基本目標(biāo)就是:保護(hù)兩個(gè)人的通訊不會(huì)被第三方所攻擊,即使被第三方截獲通訊消息(密文)他也無(wú)法獲取原始消息(明文)。2.現(xiàn)代密碼學(xué)用處很大什么地方都在用。
上面說(shuō)的現(xiàn)代密碼學(xué),既然有現(xiàn)代密碼學(xué)自然有古典密碼學(xué)咯~ 事實(shí)上古典密碼學(xué)基本是不需要數(shù)學(xué)基礎(chǔ)的是一些很簡(jiǎn)單很純粹的想法,但是可以非常直觀的展現(xiàn)什么是密碼,作為啟發(fā)。
那么要說(shuō)最經(jīng)典的當(dāng)然是凱撒密碼啦,具體名字咋來(lái)的我懶得去找了,大概就是這么個(gè)意思,見(jiàn)下圖:
出處:http://invpy.com/cipherwheel
選定一個(gè)秘鑰k∈[0,25]且為Z,然后去轉(zhuǎn)動(dòng)這個(gè)羅盤(pán),將外層的A轉(zhuǎn)到你選定的K值上,將原文(M)的每一個(gè)字母由外層字母映射到內(nèi)層字母。
栗子如下:
if key = 8:
[3]
上面是原文M,下面是譯文(E),于是我們把密文發(fā)送出去:BPM AMKZMB XIAAEWZL QA ZWAMJCL 并附上Key = 8。 收到的人只要再拿出這個(gè)羅盤(pán),對(duì)準(zhǔn)A,將內(nèi)存字母映射到外層字母即可解密了。
當(dāng)然,非常簡(jiǎn)單,當(dāng)然,也很愚蠢。 因?yàn)槊罔€只有26個(gè),窮舉也能破解,更不用說(shuō)更高端的手段了。
嘛,順手附上一個(gè)python讀文件加解密的代碼:
# -*- coding: utf-8 -*- # __author__ = "summer" dictionary = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] def ceaserCipher(i_str, key, mode="encrypt"): o_str = "" if mode == "decrypt": key = 0 - key for i in xrange(len(i_str)): if i_str[i] in dictionary: index = (dictionary.index(i_str[i]) + key) % 26 o_str += dictionary[index] else: if i_str[i].isupper(): index = (dictionary.index(i_str[i].lower()) + key) % 26 o_str += dictionary[index].upper() else: o_str += i_str[i] return o_str def encryptFromText(filepath, filename, key=0): bufferstr = b"" with open(filepath + filename, "rb") as f: for line in f.readlines(): bufferstr += line o_str = ceaserCipher(bufferstr, key) with open(filepath + "encrypted " + filename, "w") as f_out: f_out.writelines(o_str) def decryptFromText(filepath, filename, key=0): bufferstr = b"" with open(filepath + filename, "rb") as f: for line in f.readlines(): bufferstr += line o_str = ceaserCipher(bufferstr, key, "decrypt") with open(filepath + "decrypted " + filename, "w") as f_out: f_out.writelines(o_str)
所以呢,通過(guò)這個(gè)例子,我們可以數(shù)學(xué)上的來(lái)定義一個(gè)cipher system:
Def:a cipher defined over(K,M,C)(all sets of Keys/Messages/Ciphertext) is a pair of "efficient" algorithm (E,D) where:E => Encrypt algo. :K M -> C ,D => Decrypt algo. :K C -> M
s.t. for all m∈M,k∈K:D(k,E(k,m)) = m
且一般情況下E是一個(gè)隨機(jī)算法(Randomized algo.),D是一個(gè)確定算法(Deterministic algo.)
當(dāng)然,密碼體系是否安全,這些概念以及具體的數(shù)學(xué)定義以后再寫(xiě)。原諒我懶得去弄TeX寫(xiě)數(shù)學(xué)符號(hào)了,很累的!
上面說(shuō)了,凱撒加密有個(gè)大問(wèn)題在于秘鑰數(shù)量太少即|K|=26... 專(zhuān)業(yè)的說(shuō)就是秘鑰空間太小,那么古典密碼學(xué)上有一種叫做transposition Encrypt,他擴(kuò)大了秘鑰空間。
具體的方案:
我們選定一個(gè)信息比如:“Common sense is not so common.”
選定一個(gè)任意整數(shù)的秘鑰k,比如k = 8
然后我們確定出k個(gè)格子
這個(gè)樣子,然后往里面依照信息的字母往格子里填字母:
依次往后推如圖的感覺(jué)。注:(s)表示空格space
然后,我們豎著來(lái)輸出密文C:
“Cenoonommstmme oo snnio. s s c”
就這樣,加密成功了!那么解密呢,一樣是建立這樣的格子,然后豎著往里面填密文,橫向輸出就OK了唄。實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單,無(wú)非就是個(gè)數(shù)組的嵌套罷了數(shù)組里面扔數(shù)組。
代碼湊合看吧沒(méi)仔細(xì)斟酌:
# -*- coding: utf-8 -*- # __author__ = "summer" def main(): myMessage = "We shade in the two boxes in the last row to remind us to ignore them." myKey = 8 ciphertext = encryptMessage(myKey, myMessage) print ciphertext print decryptMessage(myKey, ciphertext) def encryptMessage(key, message): o_arr = [] for i in xrange(key): index = 0 + i while index < len(message): o_arr.append(message[index]) index += key return "".join(o_arr) def decryptMessage(key, message): o_arr = [] row = len(message) / key + 1 last_row = len(message) % key if last_row == 0: last_row = key for i in xrange(row): index = 0 + i flag = 0 isLastRow = False if index == row - 1: isLastRow = True while index < len(message): flag += 1 if isLastRow and flag > last_row: break o_arr.append(message[index]) if flag <= last_row: index += row else: index += (row - 1) return "".join(o_arr) if __name__ == "__main__": main()
明顯解密比較麻煩主要就是難在最后的空格的問(wèn)題,怎么去豎著填格子。有興趣的可以去leetcode看看zigzag的那道題,意思差不多。
嘛,這種加密方法看上去把秘鑰空間擴(kuò)充為了無(wú)窮!乍一看好厲害,但是你計(jì)算能力有極限,我當(dāng)然窮舉也能破解啦。當(dāng)然這個(gè)算法有很多改良比如打亂密碼輸出順序之類(lèi)的,不過(guò)攻擊方法大同小異,經(jīng)不起窮解攻擊。
當(dāng)然還有一些比較有意思的比如字母頻率攻擊Monoalphabetic Encryption啊之類(lèi)的有興趣的可以去查查(雖然基本也就是科普作用可以當(dāng)故事來(lái)看啦嗯哼)
OK今天就寫(xiě)到這里,有遺漏錯(cuò)誤之處也希望有大牛能夠一擊斃命點(diǎn)醒我啊我也還是個(gè)剛?cè)腴T(mén)的孩子hohoho,下次準(zhǔn)備寫(xiě)一寫(xiě)信息論與密碼安全。
[1]Atallah M J, Frikken K B, Blanton M, et al. Private combinatorial group testing[C]//Proceedings of the 2008 ACM symposium on Information, computer and communications security. ACM, 2008: 312-320.
[2]Wikipedia,keyword:Cryptography
[3]Al Sweigart, Hacking Secret Ciphers with Python
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44203.html
摘要:打開(kāi)中文網(wǎng)文檔打開(kāi)微信開(kāi)發(fā)者文檔三接入微信公眾平臺(tái)創(chuàng)建項(xiàng)目首先我們?cè)陔娔X的任意磁盤(pán)上創(chuàng)建文件夾,命名隨意,我這命名為隨后在文件夾中創(chuàng)建兩個(gè)文件一個(gè)是,另一個(gè)為。接入驗(yàn)證再次進(jìn)入微信公眾平臺(tái)在左側(cè)菜單點(diǎn)擊基本配置,如圖點(diǎn)擊修改配置。 一、寫(xiě)在前面的話 ??Node.js是一個(gè)開(kāi)放源代碼、跨平臺(tái)的JavaScript語(yǔ)言運(yùn)行環(huán)境,采用Google開(kāi)發(fā)的V8運(yùn)行代碼,使用事件驅(qū)動(dòng)、非阻塞和異...
摘要:新版本主進(jìn)程退出的同時(shí),舊版本主進(jìn)程將會(huì)自動(dòng)啟動(dòng)它的工作進(jìn)程。下面我們來(lái)看一下如何給運(yùn)行中的添加模塊。 原文鏈接:http://xueliang.org/article/detail/20160615172540639 系統(tǒng)基于ubuntu server 14.04.4 amd64 安裝 第一步 下載并解壓Nginx壓縮包 從Nginx官網(wǎng)下載Nginx,或者在Linux上執(zhí)行wget...
摘要:自動(dòng)調(diào)整圖片在此過(guò)程中,我開(kāi)始思考一個(gè)問(wèn)題既然和七牛云都提供基于地址的圖片變換,那么它們是怎么做到的呢根據(jù)我對(duì)的粗淺了解,最笨的方法可以直接以讀文件的方式從硬盤(pán)先讀取圖片的源文件,然后經(jīng)轉(zhuǎn)換后再以流的方式輸出給頁(yè)面,但這樣效率肯定極低。 無(wú)圖,純干貨,信息量較大,慎入! 最近幾天的成果,濃縮下來(lái)就是這么一行代碼: document.getElementById(img1).src = ...
摘要:接口信息配置前言做外包遇到最多的就是基于微信的頁(yè)面。當(dāng)我們填好之后點(diǎn)擊提交的話,微信會(huì)向你的服務(wù)器發(fā)送信息,你要解析一遍之后返回正確的信息,這一步的配置才能成功。 分享給每一個(gè)想統(tǒng)治宇宙的Jser。 接口信息配置 前言:做外包遇到最多的就是基于微信的H5頁(yè)面。做這種頁(yè)面js-sdk引入是必須的。萬(wàn)惡的TX把這個(gè)東西做到了綁定域名,要計(jì)算驗(yàn)證才能使用。我苦逼的小小jser又如何去慢慢一步...
閱讀 994·2023-04-25 15:42
閱讀 3584·2021-11-02 14:38
閱讀 2886·2021-09-30 09:48
閱讀 1419·2021-09-23 11:22
閱讀 3379·2021-09-06 15:02
閱讀 3186·2021-09-04 16:41
閱讀 607·2021-09-02 15:41
閱讀 2012·2021-08-26 14:13