encryption - 我需要什么类型的加密?

标签 encryption aes des encryption-symmetric

好的,最初的任务是在 2 个能够共享用户 cookie 的“友好”网站中跟踪用户(比方说,我有 example.com,我的 friend 有 mysite.com,他的域也很简单.example.com 这样他就可以在 .example.com 上设置 cookie)。

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

md5(microtime)

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

  1. 我们应该能够知道究竟是谁设置了 cookie:exmaple.com 引擎或 mysite.com 引擎

  2. 32 字节长度仍然是必须的

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

  4. 结果 cookie 值的第一个和最后一个字符应该不同,这样我们就可以根据 cookie 进行 A/B 测试(所以我们总是可以说如果 cookie 的最后一个字符是“> K”,显示这个用户“特征 A”)

鉴于生成的字符串的长度应始终为 32 个或更少的字符,并且数据应加密和解密(当然不是由用户进行)并且字符串对于用户而言应该是唯一的,这使得任务变得相当复杂。

我的想法和问题:

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

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

    <

我的第一个想法是将数据打包成二进制字符串,然后对其进行 base64 编码。结果将是 8 个字符长的 base64 编码字符串:

def encode():
    base64( pack('Lv', timestamp, microseconds) )

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

def getCookie():
    rand('a'...'Z') + encode() + issuerFlagChar() + rand('a'...'Z')

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

但问题是:这个算法并不确定,我不确定为数百万网站用户生成的字符串是否是唯一的。

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

是否有对称 key 算法确保类似“如果您使用 M 字节 key 加密 N 字节,您将得到 Math.Ceil(N*2+1/M) 字节的结果数据长度”?那么最终的长度是可以预测的吗?

最佳答案

抛开您确实应该咨询安全顾问这一事实不谈,您提出的实际问题很容易得到解答:

Is there symmetric key algorithms that ensure something like "if you encrypt N bytes with M-bytes key you will have resulting data length of Math.Ceil(N*2+1/M) bytes"? So the resulting length would be predictable?

是的,有。他们被称为Block Ciphers .

根据定义,每个分组密码都具有密文长度等于明文长度的特性。在实践中,大多数分组密码(包括 DES 和 AES)都有点作弊,因为它们要求明文为 padded to the length of the block。在他们开始加密之前。

换句话说,给定 N 字节的明文和 B 的 block 大小,密文的长度为 B*(Math.ceil (N/B)) 字节。

请注意我是如何谈论 block 大小的,它不同于 key 大小。在这种情况下, key 大小实际上无关紧要。

例如,AES uses a block size of 128 bits , 或 16 个字节。这意味着如果您的明文长度在 17 到 32 字节之间,AES 将保证您的密文长度为 32 字节。这与您选择的 key 大小无关,可以是 128、192 或 256 位(16、24 或 32 字节)之一。

关于encryption - 我需要什么类型的加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28846702/

相关文章:

java - 使用 bouncycaSTLe 签名和验证签名的正确方法

JAVA PHP加密解密

java - 解密 AES key 时出现无效 key 异常

java - 在java中的字符串中包含连接运算符(+)

javascript - 无效格式 pki.privateKeyFrom... PKCS#8 与 node-forge javascript

security - 我应该如何在我的服务器上保存加密的用户数据,并将其仅提供给正确的用户?

c# - 使用 C# 加密并使用 OpenSSL 解密

java - 解密不适用于生产版(Red Hat Enterprise Linux 7),但适用于 UAT(基于 SUSE 的 Linux 发行版)

java - 将字符串转换为 key

java - 在Java中生成并使用两个 key 进行加密和解密