Implementation

LUKS 反取證資訊拆分器 (AFsplit) 是否與隨機數據無法區分?

  • August 19, 2017

我想知道輸出是否與隨機數據無法區分。AFsplit(random_data_input, stripes, digestmod=sha)

攻擊者只能訪問AFsplit輸出數據。

**編輯:**這個問題太模糊了,因為答案取決於所採取的隨機假設random_input_data。請注意閱讀建議的答案。

目的是在可拒絕加密實現中使用此功能。

關於 AFsplit:AFsplit 提供針對磁碟壞塊的取證攻擊的安全性。AFsplit 將數據拆分到幾個磁碟塊中,因此如果將一個塊放入保留的“壞塊”區域,則它不包含完整的敏感資訊(特別是撤銷的密鑰槽)。LUKS 使用 AFsplit 來儲存密鑰槽。

注意:我不是在說 LUKS 本身,當然,它是一個簡單的標題。我只想專注於這個特定的功能。

下面是 AFsplit Python 實現:

import sha, string, math, struct
from Crypto.Util.randpool import RandomPool
from Crypto.Cipher import XOR
def _xor(a, b):
   """Internal function to performs XOR on two strings a and b"""

   xor = XOR.new(a)
   return xor.encrypt(b)

def _diffuse(block, size, digest):
   """Internal function to diffuse information inside a buffer"""

   # Compute the number of full blocks, and the size of the leftover block
   full_blocks = int(math.floor(float(len(block)) / float(digest.digest_size)))
   padding = len(block) % digest.digest_size

   # hash the full blocks
   ret = ""
   for i in range(0, full_blocks):

       hash = digest.new()
       hash.update(struct.pack(">I", i))
       hash.update(block[i*digest.digest_size:(i+1)*digest.digest_size])
       ret += hash.digest()

   # Hash the remaining data
   if padding > 0:
       hash = digest.new()
       hash.update(struct.pack(">I", full_blocks))
       hash.update(block[full_blocks * digest.digest_size:])
       ret += hash.digest()[:padding]

   return ret

def AFSplit(data, stripes, digestmod=sha):
   """AF-Split data using digestmod.  Returned data size will be len(data) * stripes"""

   blockSize = len(data)

   rand = RandomPool()

   bufblock = "\x00" * blockSize

   ret = ""
   for i in range(0, stripes-1):

       # Get some random data
       rand.randomize()
       rand.stir()
       r = rand.get_bytes(blockSize)
       if rand.entropy < 0:
           print "Warning: RandomPool entropy dropped below 0"

       ret += r
       bufblock = _xor(r, bufblock)
       bufblock = _diffuse(bufblock, blockSize, digestmod)
       rand.add_event(bufblock)

   ret += _xor(bufblock, data)
   return ret

LUKS 反取證資訊拆分器 (AFsplit) 是否與隨機數據無法區分?

不。

AFSplitting 只是為了提供擴散,而不是加密安全的隨機性。

當您檢查 LUKS On-Disk Format Specification(例如 v1.1.1 的 PDF)時,您會注意到它指出

LUKS 使用反取證資訊拆分,如

$$ Fru05b $$. 對於參考實現,底層擴散函式應為 SHA1,但可以完全按照上述備註中的說明進行更改。

儘管(由於碰撞攻擊而破壞)SHA-1 函式在參考實現中用作擴散函式,但這並不意味著 AFSplitting 函式提供的不僅僅是擴散函式。

雖然它肯定有一個(讓我們稱之為)隨機字元,但您通常不應該依賴它來提供與隨機數據無法區分的加密安全隨機性。這不是 AFSplitting (本身)旨在提供的。雖然擴散肯定會增加隨機性,但“擴散”和“與隨機數據無法區分的加密安全隨機性”之間存在很大差異。兩者都很難互換。


而且我還沒有考慮針對 SHA-1 的實際突破,這也可能會可能不會將答案變成明確的“不”……但這是另一個問題


編輯

為了更深入地澄清這一點,試圖澄清提問者評論中的一些混淆。

讓我們記住問的問題

我想知道AFsplit(random_data_input, stripes, digestmod=sha)輸出是否與隨機數據無法區分,不知道 random_data_input。

…我只想專注於這個特定的功能。

該問題沒有詢問 PBKDF2 是否與隨機數據無法區分,並且該問題也沒有假設 AFSplit 的輸入與隨機數據無法區分。

因此,當僅關注 AFSplit 功能時(如問題所問),人們也可以而且必須在密碼分析上假設可區分的數據輸入。否則,需要將 AFSplit 的輸入定義為“與隨機數據無法區分的唯一數據”,但在詢問 AFSplitting 輸出什麼時,該問題並未將輸入限制為此類無法區分的數據。

在 LUKS 中,使用者密碼由 PBKDF2 輸入和處理(它提供了與隨機數據無法區分的隨機性*。*主密鑰然後由 AFsplitter 拆分為多個條帶……通過擴散(使用 SHA-1 或替代替代品) )。

因此,任何與隨機數據無法區分的數據都需要在 AFSplit 函式之外生成。如果您提供 AFSplit 可區分的數據,AFSplit 不會神奇地將您提供的數據轉換為與隨機數據無法區分的數據;它只是擴散你餵牠的東西。這就是您將注意力集中在這個特定功能上時所得到的一切(以及拒絕作為答案的主要原因)。如何在 LUKS 實現中生成 AFSplit 的輸入是另一回事,並且遠遠超出了 AFSplit 功能(這只是 LUKS 蛋糕中提供擴散的一塊),因此遠遠超出了所要求的 - 即關注關於這個特定的功能。

這種技術允許在整個磁碟扇區中傳播一些小數據。該扇區被分成幾個隨機條帶,您需要所有這些條帶才能獲取數據。所以,是的,這個行業有一個隨機的方面。

引用自:https://crypto.stackexchange.com/questions/34592