2014-05-05 104 views
1

我正在使用名爲UMac32的GNU加密類創建消息認證代碼。您可以在這裏閱讀文檔:
http://www.gnu.org/software/gnu-crypto/manual/api/gnu/crypto/mac/UMac32.html截斷GNU Umac32輸出長度

它現在正在工作,但我希望能夠獲得較短的輸出。有一個從接口繼承的字段,稱爲TRUNCATED_SIZE,我認爲我可以用它來做,但不能按預期工作。

這裏是我的代碼:

String message = "Hello World!"; 
String MAC_KEY_MATERIAL = "gnu.crypto.mac.key.material"; 
String TRUNCATED_SIZE = "gnu.crypto.mac.truncated.size"; 
String NONCE_MATERIAL = "gnu.crypto.umac.nonce.material"; 

Map attributes = new HashMap(); 
attributes.put(MAC_KEY_MATERIAL, PRIVATE_KEY.getBytes()); 
attributes.put(TRUNCATED_SIZE, 4); 
attributes.put(NONCE_MATERIAL, PRIVATE_NONCE.getBytes()); 

uMac32.init(attributes); 

byte[] data = message.getBytes("ASCII"); 
uMac32.update(data, 0, message.length()); 
uMac32.digest(); 

digest()功能我得到一個字節數組的8

的長度是有可能得到使用此類較短的結果呢?預先

由於

+3

它*可能*可以只是截斷值(我不知道這個mac如何工作,所以我不完全確定)。但我會懷疑是否明智的做法甚至比8bytes更短。假設MAC是理想的,那麼在64位的情況下,對於消息標籤僞造,平均可以接受2^63次嘗試的安全性。如果將其減少到比如說4個字節,平均縮短爲只有2^31 = = 2億個消息,以插入無效但經過身份驗證的消息。 – Perseids

+1

假設一條消息的大小大約爲100bytes,這會使在線服務的攻擊範圍僅爲200gb左右。這對您的應用程序來說可能是或者可能不是可接受的風險。 – Perseids

回答

1

the code of the UMac32 class來自:

for (int i = 0; i < OUTPUT_LEN; i++) 
{ 
    result[i] = (byte) (result[i]^pad[i]); 
} 

OUTPUT_LEN被定義爲一個恆定值與8中的JavaDoc定義的UMAC-OUTPUT-LEN不是實施爲一個可配置的參數,但一個UMAC算法(如Perseids已經闡明)。

所以你唯一能做的就是手動截斷結果。這實際上是密碼合理的;散列和MAC認證標籤通常被截斷,只留下最不重要的(最左邊的)字節。但是,8字節的標籤已經是最小的了;更少的東西會降低函數的密碼強度。

+0

這就是我認爲我應該做的。我想確保這是正確的做法。所以,如果我需要更短的標籤,我會手動截斷它。非常感謝! –