Encryption

在消息中交換加密鹽和初始化向量是否安全?

  • September 9, 2015

我有一個執行以下操作的客戶:

salt = randomBytes(16)
iv = randomBytes(16)

// secret is a user-specified passphrase
key = pbkdf2(secret, salt)

message[0] = salt.toHex() + iv.toHex()
message[1..n] = encrypt('message content', key, iv)

// to notify server that message stream is ended
message[n+1] = end_message 

我想知道這樣發送salt和發送iv到伺服器是否安全?

伺服器會:

if(count == 0) {
 salt = message[count][0..15].toBytes()
 iv = message[count][16..31].toBytes()
 count++
 return
}

if(message[count] === end_message) {
 log(output)
 count = 0
 output = ''
 return
}

// for every subsequent message until end_message
key = pbkdf2(secret, salt)
output += decrypt(message[count++], key, iv)

AES-256-CTR是使用的加密。

答案是肯定的。以明文形式發送 IV 沒有問題。所以,這很好。同樣,鹽也不會增加熵,所以這也很好。

話雖如此,我從程式碼中了解到該應用程序沒有使用均勻分佈(並且熵如此之高)的密鑰。這是一個問題而且非常糟糕,因為很容易對密碼空間進行暴力搜尋。在實踐中,這是非常有效的。

鹽有點幫助,因為它使準備時間/空間權衡攻擊(通常稱為彩虹表攻擊,因為這是攻擊的一個實例)成為不可能。但是,除非使用非常高的熵密鑰,否則它仍然不安全。

另一件非常奇怪的事情(而且有點超出範圍,所以無論如何我都會參考它)是伺服器正在為每個塊重新生成密鑰。這確實是低效的(每次執行 AES 的密鑰派生成本和密鑰計劃)。

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