2012-12-06 93 views
1

無論輸入如何,是否可以保證輸出具有一定的長度?如何控制加密字符串的長度?

例如,我想傳遞一個字符串,並保證其'加密的等價物將包含45個字符。無論輸入是愛麗絲漫遊仙境中的1個字符,這45個字符都必須存在。

:45顯然是一個實施例中,點是輸出字符數目應當以某種方式(確切數量,或整除5,或甚至)來控制

+0

我很好奇:爲什麼你想要對密文的大小有這樣的控制?你想做什麼? –

+0

將在一秒內更新問題 – JAM

+0

正如我在輸入答案,我意識到這不是一個硬性要求:)總是有助於表達事物。 – JAM

回答

3

否 - 是不可能指定一個固定的結果長度。如果數據足夠長,那麼它不能被加密到一個固定的短的任意長度(這將是驚人的壓縮)。有可能設計出這種性質的hash。但是哈希是不同的(這是一種方法;你不能從哈希中提取原始數據)。

雖然可以通過使用填充來控制長度。

+0

是的,我懷疑這個..我可能會繼續並散列元素併爲其內部維護某種查找表 – JAM

+0

如果散列相當獨特,那麼這可能會起作用。總會有碰撞的可能性。但是如果哈希值相當大,那麼賠率可能會變得非常小。 –

+0

謝謝馬克。很高興聽到確認。 – JAM

2

如果你設置的限制「足夠高」,是的,你可以很容易地做你想做的事情,使用填充加流密碼。

例如,看一看塊密碼的操作CTR(計數器)模式:http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29

在CTR模式下使用AES-128,如果使用隨機IV,在開始時將其插入在密文中,您知道密文的大小恰好是純文本的16個字節+大小。因此,例如,如果將密文長度修正爲100字節,則可以加密最多84個字節的純文本。你必須填充較短的純文本。例如,如果你正在加密ASCII文本,你可以使用字節0x00作爲字符串末尾的標記(就像C中的「null-terminated strings」一樣),然後用隨機垃圾填充,直到得到84字節。

有可以使用其他許多常見的填充方案:http://en.wikipedia.org/wiki/Padding_(cryptography)

我只是想到了另一種可能性:你可以使用某種形式的認證加密,如伽羅瓦/計數器模式(GCM)。您將隨機IV與密文連接起來,並用隨機字節將其填充到所需的大小。然後,爲了解密,您只需嘗試密文的每個子字符串:如果您得到正確的子字符串,解密算法將輸出純文本;否則,它會輸出「錯誤」。請注意,使用這種方法,您可能會在計劃中引入一些計時攻擊,並且如果明文大小差異很大,您可能還會執行大量計算來解密密文。

在任何情況下,請確保您的計劃由密碼學專家審查(例如,在您設計計劃後,在https://crypto.stackexchange.com/處詢問),因爲忽略一些攻擊可能性非常容易。

+0

是否有算法實現可以推薦使用填充並可以可靠地對加密字符串進行逆向工程? – JAM

+0

「反向工程加密字符串」是什麼意思? –

+0

謝謝布魯諾。一個很好的迴應 – JAM