2013-04-26 139 views
0

我正在開發一個應用程序(iOS和Java),它需要一部分生成序列號以及從用戶輸入中讀取序列號。從長字符串生成序列號

我輸出加密的字符串,看起來都一個十六進制數據(長字符串)是這樣的:

"397cf2dbcb034c6c8e63120a211a78f1a628cfa2b36692b5efd3aff93219ca9457bde99765eab793a2f2be183082a702" 

顯然,這是非常困難的用戶閱讀,並重新鍵入。我正在尋找一種解決方案來從上面的字符串中生成序列號類型字符串(如:xxxx-xxxx-xxxx-xxxx)。 (我必須能夠解碼序列號並檢索應用程序內部的長字符串)

+8

你的加密字符串有48個字節。我不認爲您可以將其轉換爲16個字母數字字符而不會丟失信息。 – 2013-04-26 09:26:27

+0

確切地說,這是不可能的,因爲[鴿子的原理](http://en.wikipedia.org/wiki/Pigeonhole_principle)。 – Jesper 2013-04-26 09:45:20

+0

那麼,應該採用什麼樣的加密來實現呢? – Danialzo 2013-04-26 10:00:39

回答

0

Base-64編碼如何?這將會和你一樣好。這是base-64中數據的編碼:

echo "397cf2dbcb034c6c8e63120a211a78f1a628cfa2b36692b5efd3aff93219ca9457bde99765eab793a2f2be183082a702" | xxd -r -p | base64 

OXzy28sDTGyOYxIKIRp48aYoz6KzZpK179Ov+TIZypRXvemXZeq3k6LyvhgwgqcC 
0

你必須使用那個大的散列函數嗎?鑑於它只是一個序列號,你可以使用更小的東西 - 就像128位散列?即使在十六進制中,這也是合理的,並且在64位基礎上是非常合理的。使用base-64,你會得到一個128位密鑰,格式爲xxxxxx-xxxxxx-xxxx-xxxxxx