【发布时间】:2018-11-16 13:29:30
【问题描述】:
我需要生成一组 10 字节的唯一 ID。这些集合可能非常大(即 10000 个值),并由有限内存设备检查其有效性。所以有人在设备中输入其中一个ID,设备应该能够辨别该ID是否真实(由我生成)。
基本方法是将相同的 ID 集存储在设备的内存中并检查列表,但我不能使用所有这些内存。
我认为的第二种方法是使用 CRC 或散列函数:例如,启用 CRC 为 X 的所有 ID。这里的问题是我应该遍历所有可能的 ID 组合以找到提供正确 CRC 的 ID。
理想情况下,我想找到一个/两个像这样工作的函数:
uint8_t * generate_ID(uint16_t index);
bool is_valid validate_key(uint8_t * ID);
//optional
uint16_t index find_index(uint8_t * ID);
//example
//generate id value from index 0
uint8_t ID[10] = generate_ID(0)
//id is now {0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b}
bool is_valid = validate_key(ID);
//is_valid is True
uint16_t index = find_index(ID);
//index is now 0
ID[0] = 0xff; //change ID with random value
is_valid = validate_key(ID);
//is_valid is now False
//BONUS: use also a "seed" value, so that I can differentiate through sets of ids:
uint8_t * generate_ID(uint16_t index, uint16_t seed);
bool is_valid validate_key(uint8_t * ID, uint16_t seed);
find_index() 是可选的,因为一旦我知道密钥有效,我就可以简单地遍历所有索引以找到匹配的索引。
基本上,generate_ID() 函数应该足够复杂,以便在不知道大量 ID 的情况下不容易猜到,但能够在具有有限马力的嵌入式 CPU (Cortex M0) 上进行计算
【问题讨论】:
-
符号是数字(10 个符号)还是字母数字(如果固定大小写,则为 36 个符号,如果大小写混合则为 62,如果允许两个特殊字符加上固定字符,则为 64)。假设每个符号有 64 个值,那么 10 个符号 = 2^60 个可能的值,假设您允许 2^14 = 16384 个,那么您可以使用 46 位 CRC。如果有人知道它仅基于 CRC,它就不会那么安全了。在数据上使用一些异或模式可能会有所帮助。