2013-04-26 123 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