2010-04-02 36 views
0

我只是想知道,如果你應該寫一種真正安全的應用程序,數據通過不安全的網絡傳輸,你會使用什麼樣的加密算法來使它安全?我知道幾個C++庫加密提供不同的算法很好的功能,但我不太確定使用哪種密碼 - AES,DES,RSA,Blowfish或者更多不同的東西?可用於C/C++的最強密碼?

請提供您的想法和建議。

+11

語言(C/C++)與此問題無關。用brainf * ck編寫的RSA與用C編寫的RSA一樣安全。大多數着名的語言都具有高質量的加密庫。 – 2010-04-02 17:42:08

+1

「大多數知名語言都具有高質量的加密庫」,不幸的是,brainf * ck是一個顯着的例外。 – 2010-04-02 18:27:48

回答

0

其實,我們可能不需要知道所有的細節。但是,恕我直言,將這些算法與責任鏈模式或複合+策略級聯。

+0

這是個玩笑嗎? – 2010-04-02 18:03:00

1

您列出的加密需求的要求太少。這取決於具體情況。

例如,如果通信鏈路的兩個端點都是可信的,那麼您可以擔心加密,並且它們都會生成用於另一端的公鑰以加密信息。在這種情況下,RSA將是我個人的選擇。但是,如果您不相信另一個端點,並且正在使用加密來確定它是否「有密鑰」,那麼您將計數預設密鑰,而不是私有/公共加密。在這種情況下,三重DES(DES現在認爲有點弱)可能是一個不錯的選擇。

希望這會有所幫助!

+0

我同意你的第一段 - 使用RSA。你的第二段已過時。現在認爲三重DES有點虛弱。 AES是另一個更好的選擇,或者蛇,或者Blowfish,另外兩個AES入圍者。 – 2010-04-02 17:45:19

+0

@Ninefingers:Blowfish不是AES決賽選手。 Twofish是 - 如果我沒記錯的話。 Blowfish是一種較舊的密碼,旨在成爲一種好的DES替代品。 – sellibitze 2010-04-02 18:42:17

5

儘管一些加密算法比其他加密算法更容易破解,但弱點更多的是關鍵代。如果您的密鑰生成算法是可預測的,則更容易找出您的密鑰並解密數據包。

所以,我不會出汗哪種加密算法(AES很好)。但要確保你有一個很好的來源real隨機性生成你的密鑰。

如果您使用的是任何常見的POSIX操作系統,請使用/dev/random來生成您的密鑰。

+2

和存儲。你可以使用世界上所有的密碼,但是如果我能掌握你的密鑰,這是浪費精力。 – 2010-04-02 17:49:08

4

使用AES數據加密,並使用RSA交換雙方

+0

+1這就是ssl如何以簡單的方式工作。對於所有數據而言,RSA被認爲太「時間昂貴」(而AES更高效),但是公鑰需要用於安全/傳輸AES密鑰。 – 2010-04-02 17:46:48

+0

+1 @op:如果在詢問的時候將AES和RSA包含在相同的密碼列表中,那麼您真的需要去學習更多的 – Patrick 2010-04-02 18:44:03

+0

或使用DH進行密鑰交換(無需創建證書或密鑰對等) ),然後在鏈接模式下進行AES。當然,如果您想要端點驗證,請使用證書 – pm100 2010-04-02 19:02:37

1

任何公知道密碼已經很好地理解安全的水平,使這部分很簡單之間AES密鑰。我會更關心你使用的圖書館的質量和信任水平,以及你使用它的錯誤。你是否考慮過使用像ssh這樣的外部程序來完成關鍵操作並處理連接,並使用API​​庫驅動它?

1

Crypto++,也許是最有名的,最大的,最好的C++加密庫,包含一些可以使用的算法。它還可以爲您提供一個用於這些算法的良好的密碼安全隨機庫。

根據他們的FAQ,這很大程度上取決於你想要做什麼。從他們的recommended list of algorithms

塊密碼:DES-EDE3,AES,蛇(蛇比AES速度較慢,但​​具有較大的安全餘量,並且不容易受到定時攻擊。)
流密碼:上述任何CTR模式中的分組密碼
快速流密碼:Salsa20,Panama,Sosemanuk(可從第5版獲得。5)
散列函數:SHA-256,SHA-512,惠而浦
消息認證碼:HMAC/SHA1或HMAC與
公共密鑰加密的上述散列函數之一:RSA/OAEP/SHA1,ECIES
簽名:RSA/PSS/H,ECDSA/H,其中H的上述散列函數
密鑰協商一個:DH,ECDH
隨機數發生器:RandomPool,AutoSeededRandomPool

我們無法給出一個確切的答案因爲沒有人不知道你想要完成什麼。

1

你所分割對稱塊密碼公鑰密碼首先:

  • 他們有真正的不同表演
  • 其實施是真的不同
  • 他們的長處/弱點基於不同的因素

順便說一句:

  • DES不被認爲是安全的了,你應該總是避免使用它
  • AES仍然被認爲是安全的(你可以使用256位密鑰)
  • RSA的(和其他公鑰算法,如ElGamal,橢圓曲線)安全性基於這些算法所基於的數學問題的硬度。例如:數字分解。如果你用來存儲密鑰的位數足夠大,你可以認爲它們足夠安全。

然而所以你不應該考慮他們永遠安全的事情可以根據CPU的在幾年功率變化..

有一點要考慮的是,公鑰密碼通常比慢分組密碼,這就是爲什麼commong協議通常使用第一個來交換一個simmetric密鑰,然後與AES等算法一起使用。

+1

3DES仍被認爲是安全的。 – 2010-04-02 17:44:34

1

答案是:不。如果它必須是安全的,並且您提出這個問題,這意味着您需要找一位安全專家來做。您不打算通過在SO上尋求幫助來設計安全協議。你可以[也許]使用現有的協議,如ssh或TLS,但如果你自己推出,你將失敗。

1

如果您想通過不安全的網絡傳輸數據,您需要的不僅僅是一個密碼,還需要一個安全的協議,可能包括密鑰分發和身份驗證。

如果你真的對加密實現非常認真,不僅僅是爲了理解密碼學的基礎數學,而是需要做更多的事情,而不是正確地實現數字加密。您還需要擔心旁路攻擊。例如,如果您的實現需要不同的時間(取決於密鑰),那麼攻擊者可以根據您的各種響應時間推斷出密鑰的相關信息。這只是基本的算法,沒關係把它放在一起。

這通常是一個尚未解決的問題和正在進行的研究領域。大多數或所有的實現都是有缺陷的,儘管對於最新版本的常用庫來說,可能並不是任何人都公開宣稱可以利用它們的方式。過去已經演示了基於時間的OpenSSL攻擊,儘管只有在高度可預測的本地網絡AFAIK上。基本上,只要您喜歡就可以度過,直至包括整個職業生涯。

在實踐中,只要使用SSL,無論您的平臺使用哪種實現。