我需要什么类型的加密?

Nem*_*den 1 encryption des aes encryption-symmetric

好的,最初的任务是在2个能够共享用户cookie的"友好"网站中跟踪用户(比方说,我有example.com,我的朋友有mysite.com,而且他有一个域simple.example. com所以他可以在.example.com上设置cookie.

要跟踪我们想要设置唯一cookie的用户活动,此cookie应该是唯一的并且长度为32个字节(ascii).从这个角度来看非常简单,可以这样实现:

md5(microtime)
Run Code Online (Sandbox Code Playgroud)

就是这样,但现在我们有了新的约束:

  1. 我们应该能够告诉谁确切地设置了cookie:exmaple.com引擎或mysite.com引擎

  2. 仍然需要32个字节的长度

  3. 我们应该能够加密时间戳(发布cookie时)

  4. 结果cookie值的第一个和最后一个字符应该不同,所以我们可以根据cookie进行A/B测试(所以我们总是可以说,如果cookie的最后一个字符是"> K",则显示此用户"功能A")

鉴于结果字符串的长度应始终为32个或更少,并且数据应加密和解密(当然不是用户),并且字符串对于用户应该是唯一的,这使得任务非常复杂.

我的想法和问题:

  • 我们应该使用对称密钥加密(解决约束 1和3),但是在这种情况下我们如何确保结果字符串不超过32个字符(约束 2)?

  • 考虑到我们需要加密的数据量是:时间戳和微秒(14字节),站点发布者标志(1字节)=总共15字节,还有其他解决方案吗?

我的第一个想法是将数据打包成二进制字符串而不是base64编码.结果将是8-chars长base64编码的字符串:

def encode():
    base64( pack('Lv', timestamp, microseconds) )
Run Code Online (Sandbox Code Playgroud)

在开头和结尾添加site-issuer标志和字符:

def getCookie():
    rand('a'...'Z') + encode() + issuerFlagChar() + rand('a'...'Z')
Run Code Online (Sandbox Code Playgroud)

因此,结果是11个字符长,我们很容易满足约束2.

但问题是:这个算法肯定不安全,我不确定数百万网站用户的结果字符串是否是唯一的.

我想知道我是否可以为此目的使用DES或AES,但我不确定结果字符串是否总是满足约束2(结果字符串不应超过32个ascii字符).

是否存在对称密钥算法,以确保"如果使用M字节密钥加密N个字节,那么结果数据长度为Math.Ceil(N*2 + 1/M)字节"?因此产生的长度是可预测的?

pub*_*her 6

撇开您确实应该咨询安全顾问的事实,您可以轻松回答您提出的实际问题:

是否存在对称密钥算法,以确保"如果使用M字节密钥加密N个字节,那么结果数据长度为Math.Ceil(N*2 + 1/M)字节"?因此产生的长度是可预测的?

是的,有.它们被称为分组密码.

根据定义,每个分组密码具有密文的长度等于纯文本的长度的属性.实际上,大多数分组密码(包括DES和AES)都有些作弊,因为它们需要在开始加密之前将明文填充到块的长度.

换句话说,给定N字节的明文和块大小B,密文将具有B*(Math.ceil(N/B))字节长度.

请注意我是如何讨论块大小的,它与密钥大小不同.在这种情况下,密钥大小实际上是无关紧要的.

例如,AES使用128位或16字节的块大小.这意味着如果您的纯文本长度在17到32个字节之间,AES将保证您的密文长度为32个字节.这与您选择的密钥大小无关,密钥大小可以是128,192或256位(16,24或32字节)之一.