Deniable-Encryption

可否認加密的缺點

  • March 13, 2022

加密方案作為可否認加密方案的缺點是什麼?是否有一種通用的方法來轉換加密方案 $ \pi $ 至 $ \pi’ $ 這將是一個可否認的加密方案?

我將假設“可拒絕加密方案”是一種加密方案,至少有兩個秘密/解密密鑰(或密碼):使用者真正用來保護機密數據的一個,以及至少一個使用者的誘餌密鑰可以在被迫這樣做時給予,並且可以作為正確的關鍵。這可能是因為誘餌密鑰解密了一些明文,這些明文可能會作為使用者試圖隱藏的內容傳遞(色情是理想的:即使合法,也有合理的理由隱藏它)。

可否認加密的缺點之一

  • 因為密文中必須為真實明文和誘餌明文留有空間,所以密文比標準加密中的要大。
  • 對於可拒絕的磁碟加密,隱藏使用的磁碟部分有一些重要的考慮。最安全的是在使用前將隨機數據寫入整個磁碟,但會減慢首次使用;並進行隨機的邏輯到物理映射,但這會減慢機械驅動器上的速度,並在 SSD 上引起更溫和的問題。
  • 即使有上述預防措施,在實際有效載荷數據更改前後對磁碟進行成像也可以定位它,如果沒有更改誘餌數據,則確定使用密碼獲得的數據是誘餌還是真實的。
  • 很難隱藏已部署的系統能夠使用可拒絕加密。在能夠拒絕加密的系統被只使用非誘餌加密的人們普遍使用之前(儘管有上述缺點),僅僅使用能夠拒絕加密的加密系統必然會引起懷疑。
  • 如果可否認的加密是多級的,審訊者無法知道有多少,橡膠軟管密碼分析(酷刑的標準委婉說法;XKCD 538)可能會繼續超過密鑰持有者透露最終密碼的點.
  • 可否認加密與任何其他加密系統一樣容易受到其他一些非常真實的威脅,例如輸入密碼時的擷取。

在一次性密文 (OTP) 的情況下,最簡單的可否認加密方案可以使用誘餌消息誘餌密鑰創建通用密文,該通用密文將與將與真實消息異或的通用密文相同,產生確定性的真實密鑰(前提是真實消息的長度至少與誘餌消息和產生的密鑰和密文一樣長,以避免需要填充)。

  • 缺點是將明文位視為私鑰,在生成安全密鑰(Real Key)的意義上,因為它完全確定性地從此處稱為Real Message的“純文字”派生。

因此,以比特為單位的真實密鑰的安全性將取決於以比特為單位的真實消息的隨機性和長度(以及任何結果或繼承的安全性)(因此,就安全而言,需要將消息從字面上和形像上視為私鑰真實消息的整個系統是安全的,因為它沒有被私鑰“保護”(而是從消息中創建私鑰)。下面是一個例子:

pl= decoy key
k1= decoy message
c1 = universal ciphertext
p2= real key
k2= real message

p1⊕k1 =c1

c1⊕k2 = k1

*誘餌消息(長度n)⊕誘餌密鑰(長度n)=通用密文(長度n)

*通用密文(長度n)⊕真實消息(長度n)=真實密鑰(長度n)

意見:如果消息本身俱有足夠的隨機性,並且其比特長度不能被暴力猜測或碰撞(即真實的消息可能是例如,由 CSPRNG 生成的私鑰本身)和 128 位長。否則,簡短或可預測的真實消息將產生不安全的真實密鑰。

**重要的安全假設:**對於足夠安全的真實消息(明文),例如 CSPRNG 生成的 256 位整數,在與通用密文進行異或運算後計算得到的真實密鑰,其中的平方根

$$ message space * key space $$= 密文空間(包括重複是 2^512,因為 XOR 的交換性),其中至少有很多次(2^256)其他消息和密鑰,將產生相同的通用密文。因此,如果消息(被視為密鑰生成器)足夠安全,則無法知道哪個消息或密鑰是有問題的,因為它們似乎都是有效的,而無需事先了解真正的密鑰。該限制/範圍由對於序列A028401之後的任意實整數範圍(即 n=256)存在(無置換)的不同 XOR 方程的數量來控制。 用於計算不同 XOR 的範例 Python 程式碼:

Initial_bits= int(input("enter number of bits"))
Initial_number_range= 2**Initial_bits
Unique_XOR_triplets=((Initial_number_range+1)*(Initial_number_range+2))//6
Total_triplet_input_terms =((Initial_number_range//2)+1)*(Initial_number_range)+(Initial_number_range//2)+1
Repeat_Groups=(Total_triplet_input_terms)-((Initial_number_range**2)//2)-Initial_number_range
Checksum_repeat_group=(Initial_number_range//2)+1

print('1: Initial_bits, this will become the exponent for 2 raised to this power:',Initial_bits)
print('2: Initial_number_range, two raised to the number of the initial bits equals this:',Initial_number_range)
print('3: Unique_XOR_triplets, three input terms counts as one:',Unique_XOR_triplets)
print('4: Total_triplet_input_terms (i.e. A XOR B = C would be three input terms):',Total_triplet_input_terms)
print('5: Repeat_Groups, each number in group repeats this many times, and an extra this many times of zero:',Repeat_Groups)

使用不安全的 56 位字元串的具有合理可否認性加密方案的 Python 程式碼作為範例:

p1= 0b01101000011001010110110001101100011011110000000000000000 #plaintext1 DUMMY MESSAGE 56-bit example ASCII for "hello" padded to length of real message: 0b01101000011001010110110001101100011011110000000000000000
p1=bin(p1)
k1= 0b10011001100110011001100110011001100110011001100110011000 #key1 DUMMY KEY 56-bit example:  0b10011001100110011001100110011001100110011001100110011000
k1=bin(k1)
c1= int(p1,2)^int(k1,2) #ciphertext (computed DETERMINISTIC 56-bit derived from XOR'ing dummy message with dummy key): "0b11110001111111001111010111110101111101101001100110011000"
c1=bin(c1)
p2= 0b01101100011001010110000101110110011010010110111001100111 #plaintext2 REAL MESSAGE 8-bit example ASCII for "leaving" : 0b01101100011001010110000101110110011010010110111001100111
p2=bin(p2)
k2= int(c1,2)^int(p2,2) #key2 REAL KEY ((computed DETERMINISTIC) 56-bit derived from XOR'ing Ciphertext with Real message: 0b10011101100110011001010010000011100111111111011111111111
k2=bin(k2)

print('p1 DUMMY MESSAGE is:',p1)
print('k1 DUMMY KEY is:',k1)
print('c1 UNIVERSAL CIPHERTEXT is:',c1)
print('p2 REAL MESSAGE is:',p2)
print('k2 REAL KEY is:',k2) ## this "Key" is deterministic thus only as strong as the randomness of the message 
print('real message p2: ', (p2),
     'is truely',(int(p2,2))== int(k2,2)^int(c1,2))
print('as c1 ',c1,'xor p2', p2, 'equals',bin(int(k2,2)), 'is truely')

print((int(k2,2)==(int(c1,2)^(int(p2,2)))))
print('and equals = ',bin(int(c1,2)^(int(p2,2))))

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