双向密钥加密/哈希算法(two-way keyed encryption/hash algorith

2019-07-03 17:26发布

我没办法在这种类型的事情经历过,所以我甚至不能确定的关键字(因此标题)的。 基本上,我需要一个双向功能

encrypt(w,x,y) = z

decrypt(z) = w, x, y

Where w = integer 
      x = string (username)
      y = unix timestamp 

且z =是一个8位的数字(可能包括字母,规范是还没有。)

我想Z到不容易被猜到的和容易核查。 速度不是一个巨大的关注,安全是没有。 追踪一比一的关系是主要的要求。 任何资源或方向,将不胜感激。

编辑

感谢您的答案,学习了很多。 因此,为了澄清,8个字符是唯一的硬性要求,与链接W上的能力沿着< - > Z.用户名(Y)和时间戳(Z)将被认为是在蛋糕上糖衣。

我想这样做数学上而不是做一些数据库查找,如果可能的话。

如果我要完成今晚,我能找到一个合适的哈希算法,并使用一个查找表。 我只是想扩大我这种类型的事情的了解,看看我能做到这一点数学。

Answer 1:

你只需要的(W,X,Y)序列化用私钥加密。 使用相同的私钥进行解密。

在任何情况下,z的大小不能简单地约束像你这样的,因为它取决于序列化的大小(因为它需要双向的,有一个必然的压缩,你可以做,这取决于熵)。

你是不是在找一个哈希函数,因为它显然会失去一些信息,你将无法扭转这种局面。

编辑:由于z的大小是一个硬限制,需要将输入限制8个字节,并选择使用64位(或更少)的块大小,加密技术。 河豚和三重DES使用64个块,但请记住,这些算法没有收到同样级别的AES 。

如果你想很简单的东西,相当不安全的,只是xor用密钥输入。



Answer 2:

加密哈希对比

这是一个加密的问题,因为原来的信息需要恢复。 加密散列的质量是由是多么难以扭转的哈希,并恢复原来的信息,所以散列这里不适用判断。

为了执行加密,需要的一些关键材料。 有很多种加密算法,但它们分为两大类:对称和不对称。

应用

这里的应用是不明确的。 但如果你是“加密”某些信息和发送某处它,后来得到它回来,做一些与它, 对称加密是要走的路。 例如,假设你想编码的用户名,IP地址,并从你在某些HTML链接包括参数您的应用程序的一些标识。 当用户点击链接,该参数传回给你的应用程序,您对其进行解码,以恢复原始信息。 这是对称加密非常适合,因为发件人和收件人是同一人,密钥交换是一个空操作。

背景

在对称加密,发送者和接收者需要知道相同的密钥,但保持其秘密从其他人。 作为一个简单的例子,两个人能满足的人,并决定密码。 后来,他们可以使用该密码,以保持他们的电子邮件给对方私人。 然而,谁偷听密码交换就能窥探他们。 联交所已发生过安全通道......但如果你已开始与一个安全通道,你不会需要更换一个新的密码。

在非对称加密中,每一方将创建一对密钥。 一个是公开的,可以自由分配给谁想要发送私人消息。 另一种是私有的。 只有消息接收者知道的私钥。

一大优势,以对称加密是,它是快。 所有精心设计的协议使用对称算法来加密大量数据。 缺点是,它可能很难交换密钥安全的,如果你不能在一个安全的地方,在一个密码同意“见面”(虚拟或物理)?

由于公共密钥可以自由共享,两个人可以在无需预先在关键同意在不安全的通道交换的私人信息。 不过,非对称加密慢得多,所以它通常用于加密对称密钥或对称密码进行“关键协议”。 SSL和大多数加密协议,经过哪儿非对称加密被用于建立一个对称密钥,这是用来保护的谈话其余握手。



Answer 3:

你可能无法。

比方说,w是32位,X支持至少8个区分大小写的ASCII字符,所以至少37位,y是32位(让你2038年,31位甚至不会让你到现在)。

所以,这是一个总数据的至少101位。 你试图将其存储在一个8位数字。 这是数学上是不可能从一个更大的集合到一个较小的一套创建一个可逆函数,所以你需要为每个“数字”超过12.5位储存。

当然,如果你去超过8个字符,或者如果你的角色是16位Unicode,那么你有机会是最少。



Answer 4:

加密或不加密的,我不认为这是可能的包那么多信息,为8位数字,以这样的方式,你将永远无法再次把它弄出来。

的整数为4个字节。 让我们假设你的用户名被限制为8个字符,并且字符是字节。 然后,时间戳是至少另一个4个字节。 这是16个字节就在那里。 在十六进制,这将需要32位。 Base36或东西会少一些,但它不会是接近8的任何地方。



Answer 5:

让我们正式你的问题,更好地研究它。

k从可能的密钥集合K的关键,和(w, x, y)的一条信息,从一组我,我们需要隐窝。 让我们定义该组“加密后的消息”作为A 8,其中A是从我们的字符提取到我们的加密后的消息的字母(A = {0,1,...,9,A,B,... ,Z,...},根据您的规格,如你所说)。

我们定义两个函数:

crypt: I * K --> A^8.
decrypt A^8 * K --> I

这里的问题是,集合A ^ 8的大小,加密后的消息的,可能比一组信息(W,X,Y)片小。 如果是这样,这是根本不可能实现你在找什么,除非我们尝试不同的东西...

比方说,只有你(或你的服务器,或者您的服务器上的应用程序)必须能够从ž计算(W,X,Y)。 也就是说,你可以发送z给别人,你不关心,他们将无法对其进行解密。

在这种情况下,你可以做的是使用服务器上的数据库。 您将使用著名的算法,比你生成一个随机数地穴信息z 。 您定义表:

Id: char[8]
CryptedInformation: byte[]

然后,将存储z在Id列,并在相应的列中的加密后的信息。

当你需要解密的信息,有人会给你z ,对加密后的信息索引,然后就可以进行解密。

但是,如果这对你的作品,你甚至不需要隐窝的信息,你可以有一个表:

Id: char[8]
Integer: int
Username: char[]
Timestamp: DateTime

并使用相同的方法,没有任何crypting。

这可以适用于“电子邮件验证系统”上的预订过程,例如。 你会通过邮件发送给用户的链接将包含z

希望这可以帮助。



Answer 6:

根据定义哈希是单向只,一旦散列,它是很难再取回原来的值。

对于2路加密我想看看这.NET已对符合出炉TripleDes的TripleDESCryptoServiceProvider 。

一个相当简单的实现的文章。

编辑

前面已经讲过低于你不能把大量的信息到一个小的加密值。 然而,对于许多(不是全部)情况下,这正是位掩码存在解决。



Answer 7:

我不能告诉你,如果试图设置此一方式来存储密码,但如果你是,你不应该使用双单向散列函数。

如果你真的想要做你所描述的,你应该只将字符串和时间戳(填用下划线或一些额外的空格)。 采取这一结果字符串,将其转换为ASCII或UTF-8或什么的,发现它的价值模最大的黄金比10 ^ 8以上。



文章来源: two-way keyed encryption/hash algorithm