2011-02-10 98 views
1

我正在處理人工編寫的文本文檔,並且我執行基於字典的字符串匹配以在文檔中查找特定的字符串。加密:字符串的散列與字符串的子字符串的散列相關聯

出於安全原因,我無法以未加密的文本格式輸入文檔,而是以強烈的加密格式輸入文檔。我不能讓在本機上工作的開發人員訪問未加密的輸入字符串,但他們可以訪問匹配的字符串。

這樣可以很清楚:

Dictionary = {"Apple", "Apple pie", "World War II"} 

Document1 = "apple is my favorite fruit." -> Should match "apple" 

Document2 = "apple pie was invented during world war II" -> Should match "apple pie" and "world war II" 

所以匹配的字符串是不區分大小寫的,只有匹配最長的發生(我使用的阿霍Corasick)。

我看到的選項是:

  1. 查找的加密函數F,其中F( 「ABCD」)= F( 「A」)+ F( 「B」)+ F( 「C」) + F(「D」)= F(「AB」)+ F(「CD」)。

  2. 將文檔按空格分塊,散列塊和字典,然後查找相似性。 (複雜)

  3. 建立一個獨立的單元負責加密和字符串匹配與混淆代碼。 (最明顯的方式)

由於我不擅長密碼學,我可能會錯過這裏的東西。任何人都可以看到實現這一目標的更好方法?

+0

文件加密時,我有點不清楚。它們在到達您的代碼之前是否已加密,或者您是否對它們進行加密?如果他們已經加密,你有鑰匙給他們嗎? – 2011-02-10 15:41:47

+0

該文件來自客戶端,也在我們的控制之下。我們的目標是不讓任何未加密的信息離開客戶端機器,但在我們的服務器中執行此過程。 – parsa 2011-02-10 16:01:53

回答

2

如果我理解正確,我們的目標是防止對本機有實際訪問權限並訪問其上運行的進程的人能夠確定文檔的內容。如果這個「壞人」非常專注,我認爲這是不可能的。他將能夠從進程空間中提取解密文檔所需的關鍵信息。作爲一般規則,如果攻擊者具有物理訪問權限,那麼可以做的事情並不多。

如果程序可以將文檔的部分文本與已知文本進行匹配,那麼攻擊者將能夠觀察並提取信息。混淆代碼可能會讓代碼變得更加困難,但是如果信息足夠有價值,那麼攻擊者將會更加努力。

看起來,如果服務器可以以安全的方式運行並儘可能限制物理訪問,那將會更好。當然,還存在很多問題(例如,由於開發人員顯然不被信任,因此需要對代碼進行惡意代碼審計),但至少可以讓您找到有可能被捍衛的職位。

編輯有關您正在嘗試執行的加密的一些想法。例如,如果使用CBC(密碼塊鏈接)模式下的AES加密,則不可能從文檔中解密單個單詞(假定文檔是作爲整體進行加密的)。每個密文塊都依賴於前面的塊。因此,有必要將整個文檔解密到感興趣的地方。換句話說,你將不得不解密整個文檔來搜索它。

另一種加密可能性是在CTR模式下使用AES。 CTR模式會生成密碼流(基於密鑰和某些初始化向量)以及與純文本相對的XOR以生成密文。在這種模式下,可以解密文檔中間的一部分而不需要解密上一節。但是這有點誤導和一些語義學爭論。即使您不必解密前面的部分,但仍然有必要爲整個文檔生成密碼流,直至感興趣的地方。從攻擊者的角度來看,這與解密文檔相同,因爲攻擊者可以訪問加密文本(大概是在你描述的情況下)和生成的XOR流,這將產生純文本。

3

首先,滿足您的條件任何加密功能:

F("ABCD") = F("A")+F("B")+F("C")+F("D") 

本質上是不強的加密(假設+這裏意味着串聯)。問題是這個條件意味着F("A")是不變的,這意味着它的加密相當於一個簡單的替代密碼,易受頻率分析影響。

然而,一個更大的問題是,任何解決方案將容易受到字典攻擊。如果您可以確定未知文檔中的單詞是有限字典中的特定單詞,那麼您還可以在完整的字典中搜索該單詞 - 這樣,您可以快速發現整個明文。

2

您提出的解決方案#1是一個非常非常困難的問題 - 已知可以解決,但幾乎肯定不值得您一邊解決。

你想要的技術是Homomorphic Encryption。它在2009年首次由IBM的Craig Gentry演示,可以在不暴露明文的情況下執行任意計算。

對於幾乎所有的應用來說,最先進的方法可能效率太低 - 而指數安全性可以通過「多項式」計算獲得(這是所有理論家真正關心的),多項式足夠大沒有價值。這可能會在不久的將來發生變化。

雖這麼說,我看不出有任何理由,你爲什麼不能:

hash each entry in the dictionary 
    (split each entry on whitespace, multiword entries are tuples of hashes) 
split document on whitespace, hash each word 
do the matching with the hashes 

從本質上講,你匹配的任意項目,不是天生的話。客戶可以生成單詞項目地圖,並將項目傳遞給服務器。服務器不需要知道任何關於這些項目的信息,只是字典中的一個項目出現在文本中。