Key-Size
您可以為 KMAC 使用動態密鑰和數據大小嗎?
我之前問過是否應該在 SHA-3 的輸入參數上使用某種規範編碼,然後才能將其用作 HMAC 的替代品。
但是,如果我正確閱讀了NIST SP 800-185 中的目前 NIST 規範,則沒有
Keypack
定義函式。該Keypack
函式為密鑰添加了密鑰大小的前綴,以便將密鑰和消息數據分開。bytepad(encode_string(K), 168)
目前,使用KMAC128 和KMAC256的功能,密鑰似乎只是零填充到下一個塊邊界bytepad(encode_string(K), 136)
。這是否意味著密鑰和數據沒有規範編碼?在 KMAC 中使用動態大小的密鑰和數據是否
bytepad(encode_string(K), 136) || X != bytepad(encode_string(K'), 136) || X'
安全K != K
?
是的,但是它確實需要對標准進行更深入的研究。
KMAC128 定義為:
newX = bytepad(encode_string(K), 168) || X || right_encode(L)
.return cSHAKE128(newX, L, “KMAC”, S)
.所以似乎沒有對密鑰大小的編碼,可能有多個 K,M 密鑰消息對會產生相同的值
bytepad(encode_string(K), 168) || X
(因為A || BC = AB || C
)。但是,如果我們看一下
encode_string(S)
函式:
Return left_encode(len(S)) || S
.這意味著(位)字元串編碼規範地對密鑰進行編碼,包括密鑰的大小(
len(S)
)。這意味著任何大小不同的密鑰都將被編碼,使得密鑰 K 和消息 X 之間的劃分清晰。儘管
encode_string
與早期的 KMAC 草案相比,規範編碼具有更通用的名稱,但規範編碼仍然存在,其中它被呼叫Keypack(K, l)
並將長度作為顯式參數。