題:
編寫自己的加密算法
Confuto
2015-11-22 21:16:00 UTC
view on stackexchange narkive permalink

我目前正在大學(英國大學,也稱為非大學)學習IT,而課程工作使我感到無聊。我現在主要使用OO語言(例如C#和Java)進行編碼已經有一段時間了,但是我經常感到無聊和放棄,因為其中大多數是我討厭做的無聊的UI事情,我提出的項目很少要做代碼設計和實際創建算法。我想開始編寫自己的各種算法,並開始遠離用戶友好性,並開始學習我感興趣的東西,即加密和壓縮。我想編寫自己的加密算法,以加密文件或字符串的字節。我有幾個問題:

  • 我將從何處開始,建議使用什麼書籍/材料進行密碼學入門?
  • 我是否需要廣泛的密碼學知識才能上手一個基本算法?
  • 將C#應用於加密算法是否可行?

任何幫助將不勝感激。我想開始編寫代碼,因此在申請uni時,我的應用中所有大膽的主張都可以展示出來!

“我是否需要廣泛的密碼學知識才能開始使用基本算法”?是。設計和實現密碼算法非常困難,只能由團隊中的專業人員來完成。隨心所欲,學習,享受……。但是,甚至不要想想使用自己的加密算法進行現實世界的加密。
這個問題太廣泛了,無法回答。設計加密算法可以是任何事情,從小學生可以做的事情(例如,凱撒式)到使成長中的數學家絕望的複雜數學問題。
@S.L.Barth感謝您的評論。我明白了,如果那時候我發現還有其他事情需要做的話,也許是最好的。我完全不敢在現實世界中使用我設計的任何東西!
“ C#可以將加密算法付諸實踐嗎?” SOme加密算法應該獨立於任何語言工作。如果您使用無法在例如中執行的操作。 C,您的算法可能會被丟棄。
“在申請uni時,我有一些東西要展示。”不要這樣做。有(太多)種與加密算法適得其反的方法
C#會很好,因為您無論如何只是為了練習而這樣做,因此性能不是優先考慮的(再次,您絕對不應該在生產中使用自製的加密,而垃圾性能實際上是一種好處,因為這樣做會阻止這種行為)。
如果您正在尋找一組與密碼相關的編程挑戰,建議您訪問http://cryptopals.com/上的lookig。
@deviantfan我看不到這個問題-自製加密絕對不是生產中的禁忌,但作為一個業餘項目炫耀它應該很好,並且即使加密本身很差,至少也要展示編程知識。
為什麼要編寫新算法?現有的不足嗎?您希望解決現有算法中的哪些特定問題?還是只想作為學習練習來做?
@R®ryMcCune對於此參考,我感激不盡。我是一名數學家,我的大部分編程經驗都來自於解決難題。這些問題集似乎是探索密碼算法實現方面的一種有趣方式!
@JamesRyan的確如此,但是有時我會把自己當作一種業餘愛好,強迫自己開始一個項目有時會很困難,更不用說做我討厭的事情了。我知道有一天,如果我設法成為一個職業,我將不得不做無聊的事情,但還沒有:D
@Superbest是的,這只是一個學習練習,我不希望創建任何東西供他人使用。老實說,我不希望解決任何問題,只是為了獲得一些有關事情運作方式的知識並給自己帶來挑戰。
@Confuto對於學習練習,為什麼不嘗試使用諸如ProjectEuler(不是特定於加密)的在線問題數據庫,或者嘗試在流行的密碼學教科書的每一章末尾進行練習?
@S.L.Barth需要廣泛的知識來構建* strong *加密算法,但不是* OPS想要的*“基礎”加密算法。我擔心您的評論會基於他的回應而誤導他放棄努力!我認為OP可以輕鬆編寫基本的加密算法,並從練習中學習一些有用的概念。
[“我建立了自己的加密貨幣”](https://twitter.com/old_sound/status/602996592531091456)
當我閱讀標題時,我忍不住說了“呃-哦”​​。
伙計們如何對此進行充分研究?如果您用谷歌搜索與密碼學有關的任何東西,要么是神似的數學家發表的論文,要么是“不要自己做”。我很驚訝,如果您搜索谷歌,谷歌不只是簡單地說“不”。
我只是來這裡發表評論。
如果您可以召集一堆新手程序員,並挑戰他們制定一種加密算法,其他任何人都無法破解(當然這並不意味著它不可破解),然後彼此破壞,您也可以從中獲得樂趣。算法。
九 答案:
fr00tyl00p
2015-11-22 22:59:12 UTC
view on stackexchange narkive permalink

當然,您可以從小處著手並實現自己的算法。但是不要認為它們提供了混淆之外的任何安全性。

密碼學中的困難之處在於,找出實際上 是安全的原因。您將無法在幾個月內做出決定,如果您覺得自己到那時,那很可能是錯誤的。

找到事物不安全的原因比發現事物不安全的原因要容易得多是安全的,因此,如果您想從某個地方開始,請開發自己的算法,直到您認為它們是安全的,然後嘗試找出原因,以找出攻擊它們的方法。

大多數錯誤是在實現算法。因此,如果您想獲得一份高薪的工作,則可以學習如何正確實施這些東西。

我建議您開始實施AES之類的東西,而不是繼續使用CBC或CCM之類的不同操作模式,並找出答案。為什麼隨機性很重要。繼續使用SHA-2和HMAC並進行非對稱加密。始終檢查其他人做了什麼以及他們為什麼這樣做,並特別關注了旁道攻擊及其執行方式。如果您在那時,則將找到繼續的方法。

開頭的參考文獻是“ HAC”,可在線免費獲得: http://cacr.uwaterloo.ca/hac/

[編輯] 來自JRsz的建議,該建議不應包含在註釋中。一本適合初學者的好書: http://crypto-textbook.com/

對於那些認真實施新密碼數學的人來說,HAC是不錯的參考書,但對於初學者來說可能太密集了。
對於+1,當然可以從小做起,並實現自己的算法。但是,不要以為它們提供了混淆之外的任何安全保護。`許多人一直在說:“不要這樣做!”但這是一個學習更多信息的好機會。這個小的免責聲明非常好。
我不僅僅知道我所做的任何事情在現實世界中都不可用,這僅僅是給我一些學習和努力的方向。
並不是說我不同意您的總體觀點,而是……*”談到密碼術時,困難的是找出某些事物確實是安全的原因。您將無法在幾個月內決定,如果您覺得自己是那時,您很可能錯了。” *人們是否知道*為什麼*像RSA這樣的算法是安全的?據我所知,這是因為沒人能找到打破它的方法。那麼,為什麼學生應該相信自己的算法會更糟?
@Mehrdad我認為這僅僅是因為他/她的算法已經存在了35年,而且至今仍未中斷。
-1
@Mehrdad RSA之所以安全是因為RSA問題很難解決。你是對的。這很困難,因為沒有人找到打破它的方法。學生應該相信自己的算法很弱,因為這是一種防禦態度。 IMHO比假設他們的算法是安全的,除非有人破解了它更合理,因為嘗試的人可能比已經嘗試破壞RSA的人少得多。
-1
@Confuto在以下意義上也可以在現實世界中使用:如果您執行標準加密+非標準加密,那麼任何機器人都無法在沒有監督的情況下將您作為目標(即,只有在有真人的情況下,您的密碼才會被破壞在您之後;僅使用趨於像DES這樣陳舊的庫內容時,情況並非總是如此。這可能很重要,也可能不重要。
-1
hac對於初學者來說非常複雜。我推薦這本書作為一個好的開始:http://crypto-textbook.com/
我喜歡這樣做,可以鼓勵用戶以“受管理的期望”進行嘗試。讓同伴嘗試破壞加密將是一個很好的練習(我認為是必要的)。
選擇作為答案,謝謝。來自這裡的可怕回應不知所措,非常感謝大家!
@Mehrdad-密碼學家確實有理由相信RSA是安全的,而不僅僅是“它還沒有被破壞”。通過研究基礎數學,他們可以證明突破RSA非常困難。有一些假設(例如素數分解很慢),但是這些假設可以被闡明和量化,並且比“沒有人發現駭客”強得多。一本好的入門數學加密書應該對此進行詳細解釋,或者嘗試搜索例如“為什麼RSA是安全的”。
@Rich沒有RSA安全性的數學或計算證明。假設是分解需要花費指數時間。但這只是一個假設,而不是證明。再次,這實際上意味著RSA“還沒有被破壞”,僅此而已。
@mbrt:不,我的意思是,RSA的優勢在於尚未分解因數分解,這比任何新密碼X都強於“ X尚未破裂”,因為分解因數比X更好理解。我的評論涉及一些假設,但是這些假設可以被闡明和量化,並且比“沒有人打破mbrt的7號密碼”強得多。
@Rich: *“他們可以證明破解RSA非常困難。” * ...您能將我與上述證明聯繫起來嗎?它所依賴的只是分解困難;沒有背後的證據。不確定您是否要關注新聞,但是關於圖同構的擬多項式時間算法有一個最新的發展,在聽說了它之後,一些人開始懷疑是否可以在擬多項式中求解因式分解。時間也一樣。另外,您能對ECC說同樣的話嗎?人們認為ECC很難,因為也沒有人能破解它。有證據嗎?沒有。
@Mehrdad:是的,維基百科引用以下文獻:“米勒(Miller)表明-假設有擴展的黎曼假設-從n和e中找到d與分解一樣困難”(通過https://en.wikipedia.org/wiki/RSA_(cryptosystem)#) Integer_factorization_and_RSA_problem。如我之前所述,密碼學家已經陳述了他們的假設:即擴展的黎曼假設和困難的素因數分解,然後在這些假設下證明RSA是安全的。我的觀點是,與任何舊的“但X尚未打破”主張相比,這些假設要容易理解,而且更有可能是正確的。
@Rich:那麼ECC呢?另外,如果您陳述的假設並不能使您的算法更安全。我可以提出一種算法並陳述我的假設。這是否意味著現在安全了?我覺得你想念我的意思...
@Mehrdad:我認為您在誤解我。我並不是說有證據表明RSA是“安全的”。我說過,鑑於某些眾所周知的假設,有證據表明RSA是安全的。我正在嘗試回答您的第一個問題“為什麼學生應該相信他/她的算法比[RSA]更糟糕”,這是因為這些證明中使用的假設非常強大,而且比僅含糊的“聲稱”強得多。還沒有人破壞學生X的加密貨幣”。
“如果您陳述的假設並不能使您的算法更安全” –如果您的假設很強並且您*證明*您的假設與算法的安全性之間的聯繫,它就會
@Rich:(1)保理困難的假設只是“強大”,因為沒有人能夠打破它。為什麼這意味著沒有人在做一個新的假設呢? (2)掩蓋ECC實力的假設是什麼?您一直在避免回答這個問題。
讓我們[繼續聊天中的討論](http://chat.stackexchange.com/rooms/32069/discussion-between-rich-and-mehrdad)。
在沒有足夠的數學/ cs /密碼知識的情況下構建自己的加密算法的過程稱為“加密”,而不是“加密”。比嘗試通過實現算法學習更好的方法是,您應該學習更多的數學知識(深度和硬數學主題)和CS,並重新實現已經存在的算法並研究它們的弱點。
StackzOfZtuff
2015-11-22 22:56:30 UTC
view on stackexchange narkive permalink

Coursera

這是我的2美分:

參加Coursera密碼學在線課程:

這堂課需要六個星期。每週都有幾節講座視頻,一個分級測驗和一個可選的編程作業。 (這些任務涉及實現加密部分。)

在六個星期結束時進行了測試。

如果您想受到挑戰,那麼這是正確的方法走。這是很多工作。我建議您每週計劃10個小時以上。

編輯:這是該類先前運行的目錄)。

說明:編程任務正好可以使您對該主題有更深入的了解。顯然,它們不是要釋放到野外的東西。
相反:“您永遠不要自己實現!” 信息會一遍又一遍地重複。 (並且沒有付出太多的代價:只要“只要自己實現!” 處於多項選擇測試之一,那是錯誤的。)

我忘記了Coursera,謝謝!我訂閱了Lynda.com,但他們沒有太多加密貨幣。
在課程上+1。這是非常具有挑戰性的。請注意,編程分配在C中。
實際上,任何語言都可以。僅提交結果。沒有執行。在論壇上,有使用不同語言的實現。示例在Python2中。
Adam Shostack
2015-11-22 23:17:53 UTC
view on stackexchange narkive permalink

從破壞開始,而不是建立自己的。編寫自己的算法的人有大量令人擔憂的stackexchange帖子。環顧四周,找出問題所在。 (不要看發布的答案。)[好的搜索包括“這是否安全”和“此算法有什麼問題”。]

僅當您發現其他人的工作中存在問題時,才應該嘗試實現其他人的算法。 (@stackzofztuff對Coursera的評論還不錯,據我回憶,Dan Boneh就是從這種方式開始的,其結構比在這裡戳戳還要多。)

*看看*您能解釋一下如何找到這些帖子嗎?我們是否必須按標籤,網站等過濾問題?
@A.L,我認為通過多個標籤進行搜索將是最有效的。類似於[cryptography + algorithm](http://security.stackexchange.com/questions/tagged/cryptography+algorithm)或[encryption + algorithm](http://security.stackexchange.com/questions/tagged/encryption+algorithm )。您需要進行一些挖掘,但是乍一看,我確實看到了一些問題。儘管它們很大程度上埋在較小的事物之下,例如混合算法或添加到現有算法中的小型混淆。許多無法提高或削弱安全性的東西。我不同意Adam Shostack的說法,這很有效。
我搜索了“這是否安全”,並認為前5個問題是一個很好的起點。我已將我的回复編輯得更加清晰。
dr_
2015-11-23 15:56:01 UTC
view on stackexchange narkive permalink
如果想開始研究此領域,必須閱讀

Bruce Schneier的應用密碼學。我很驚訝以前沒有人建議過。

是的,即使在嘗試使用自己的算法進行娛樂之前,您需要也了解很多有關加密的知識。但是,甚至不要考慮將它們用於現實世界中的問題-周圍已經有很多壞密碼

關於編程,請避免使用諸如瘟疫之類的專有語言。我建議使用C,甚至C ++。

為什麼說*“關於編程,避免使用瘟疫之類的專有語言” *?我的經驗是,如果您使用C#編寫優化的代碼(雖然並不是很多人這樣做的話),那麼代碼可以很容易地轉換為C / C ++(通常幾乎是一行一行)。而且,C#編譯器現在是開源的(在Apache 2.0下發布)。
如果我沒記錯的話,C#也一直通過ECMA公開記錄為標準(這是Microsoft編譯器應該遵守的標準)。
布魯斯·施耐爾(Bruce Schneier)的書+1。
-1
@dr01當然,如果您正在編寫一種認真的加密算法,則一定要用C編寫它,以便可以對其進行正式審查。但是,如果您只是敲一些代碼來了解什麼加密,那麼為什麼不使用您最熟悉的語言呢?如果唯一能看到它的人是他和他的貓,那麼用AutoLisp編寫它會有什麼不同!也許Applescript會重新流行並成為新的加密標準...;)
-1
並始終牢記Schneier的法則...任何人都可以創建他們無法破解的真正令人驚嘆的加密算法。即...同行評審是必要的,以證明它確實有效。
Scott C Wilson
2015-11-22 21:36:27 UTC
view on stackexchange narkive permalink

一個好的開始是實施現有算法並深入了解它們的工作方式。例如,一次性填充算法易於學習和實施,研究其優缺點將幫助您入門。它還使您對密碼學中很重要的那種比特糾結感到滿意。搜索“一次性記事本”將使您入門。

但是請注意,ontimepad是一個“奇數”(算法以及可能的用法),它對理解AES等無濟於事,它在實踐中使用更多,並且具有許多其他算法中也可以找到的概念。 (等)
與OP有關的加密算法相關的問題通常不是實現的邏輯,而是其背後的數學原理。 AES就是一個很好的例子。在代碼中,所有看到的都是一些簡單的移位和低級數學指令。至少可以說,算法本身的設計方式是使加密數據看起來完全是隨機的,這要求設計人員具備一定的技能。
不過,一個時間間隔是一個有趣的情況-這是一個非常簡單的算法,並且在最佳條件下-堅不可摧。它的弱點來自於可伸縮性和密鑰交換,這對於“現實世界”應用程序而言並非微不足道。但是我不知道它真的可以幫助理解其他加密選項,由於需要處理信任,密鑰交換等,這些加密選項會變得更加複雜。
Michael B
2015-11-24 03:47:41 UTC
view on stackexchange narkive permalink

只需以不同的角度來總結這裡給出的好答案。

如果您假設v1算法將變得不安全和糟糕,那麼v100只會稍微好一點,但同樣會不安全。 (以及您的v1000一樣)

牢記這一假設,通過解決密碼學成為當今的科學所需要解決的問題,您可以學到很多東西。即重新發明輪子。

我個人認為重新發明輪子是學習複雜任務的絕佳方法。它給您解決的問題。如果那是您的事,那麼與密碼術相比,解決難題的事情就更少了。

這樣一來,您可以上大學,然後說,我一直在設計自己的密碼算法,作為學習如何解決難題的工具。在v50上,算法很爛,但是這些都是我學到的東西,是找到的解決方案,這就是在現實世界中如何解決的。

說我寫了一個“好的”加密協議和說我寫了一個幾乎可以肯定很弱的協議,但是目的不是要創建一個安全的協議,這有很大的不同。就個人而言,我會對那些說後者的人表示敬意。 (我可能會向前者致意-並迅速向他展示門)

這個。 OP正在尋找一個有趣的挑戰-一個學習的機會,而不是成為Next Big Thing的發明者。
JRsz
2015-11-23 02:42:30 UTC
view on stackexchange narkive permalink

您可以實現已經存在的加密算法,但是設計自己的加密算法是您可以處理的最複雜的事情之一。對於一般介紹,我強烈建議您使用以下頻道: https://www.youtube。 com / channel / UC1usFRN4LCMcfIV7UjHNuQg / videos或Christoph Paar和Jan Pelzl( http://crypto-textbook.com/)所著的“了解密碼學”一書。我假設您的目標是對稱算法,我建議您開始閱讀大量有關它們的理論,哪些是安全的,什麼是不安全的(歷史),並且明確地指出當前的最新算法是如何發展的(AES是如何開發的,

在處理不同的攻擊者模型時,即使在對稱部分,您也會遇到許多數學問題。非對稱密碼學是基於數學問題的男子氣概,並且存在一些非常棘手的攻擊,它們對非對稱密碼學非常有力。非常熟悉該主題(該主題的所有部分)。不過,實現其中的一些方法不是一個好主意,但是,如果您正在尋找某種項目,為什麼不編寫使用已存在的算法並為您解密一些數據的程序。您將有足夠的問題要解決,因為安全算法根本不能保證安全加密。在此問題以及其他一些問題上,不同的操作模式也很重要。

Count Iblis
2015-11-23 12:25:57 UTC
view on stackexchange narkive permalink

您可以遵循斯科特·威爾遜(Scott Wilson)關於一次性墊的建議,但要使用真正的隨機數據。您可以例如考慮計算機網絡攝像頭髮出的噪音。讓網絡攝像頭拍攝靜態場景的幾張圖片,將圖像轉換為32位浮點圖像,將圖片標準化為相同的亮度,取平均值,然後從平均值中減去其中一張。如果將負像素值映射為0,將正像素值映射為1,則幾乎具有完全隨機的位,當像素不太靠近時,它們將不相關。將馮·諾依曼算法應用到從遠處像素中獲取的成對比特中:

(0,1)---> 0

(1,0)---> 1

(0,0)和(1,1)被丟棄

將產生具有0和1的完全隨機位,概率為50%。

我不確定這是否能回答問題
來自計算機的簡單隨機性來源。謝謝!
Hanky Panky
2015-11-23 13:15:40 UTC
view on stackexchange narkive permalink

繼續,編寫算法,但最後將任務交給定期處理密碼學的朋友/研究員之一;告訴他們,如果可以的話,請破壞您的加密。

您會注意到他們可以在幾分鐘之內破解它,並且您會驚訝地發現存在多少漏洞。將游戲帶給擁有廣泛密碼學知識的人(以說出你的話)

這正是我很久以前學習編程並想挑戰一些人時發生的事情他們很聰明,我慘敗了。如此之多,他們甚至可以僅憑其思維和技能就可以解密打印在紙上的消息。

您當然可以隨時間寫一個並完善它,但絕不能保證它很快就可以抵禦有知識的人。

這將是您編寫自己的算法的一個很好的起點(甚至可能是一個停止點):)



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...