如何将一些数字解码为timeDate?

时间:2010-11-23 22:34:13

标签: reverse-engineering decode decoding

这个问题是this一个续集。

所以任何想法如何解码这个号码5252235562500到日期和时间19.11.2010 15:43? 我有更多像这样的对,我正在考虑一些脚本来比较它们找到一些模式。有什么建议要检查以及如何搜索模式吗?


编辑:我添加了四对我真正拥有的对。

  • 11.11.2010 16:23> 5252425372575
  • 16.11.2010 15:30> 5252922462564
  • 19.11.2010 15:39> 5252231562511
  • 19.11.2010 15:43> 5252235562500

3 个答案:

答案 0 :(得分:8)

我想我找到了解决方案。我不想简单地提出解码算法,而是想向您展示推理。

linked问题的答案显示这是EAN-13格式的条形码。

这意味着代码有12位数字和1个校验位:

11.11.2010 16:23 > 525242537257 5
16.11.2010 15:30 > 525292246256 4
19.11.2010 15:39 > 525223156251 1
19.11.2010 15:43 > 525223556250 0

校验位可以通过

计算
  • 在偶数位置添加数字值:2,4,6 ...(2 + 2 + 2 + 3 + 2 + 7 = 18)
  • 将此结果乘以3(18 * 3 = 54)
  • 在奇数位添加数字的值:1,3,5 ......(5 + 5 + 4 + 5 + 7 + 5 = 31)
  • 总结两个结果(54 + 31 = 85)
  • 计算模10并从10(5-10 = 5)
  • 中减去它

我计算了每个代码的校验位,它匹配并确认代码是EAN-13格式。

根据规范,代码的前两位或三位数字可能是国家代码,所以我试图将它们分开:

11.11.2010 16:23 > 52 5242537257 5 | 525 242537257 5
16.11.2010 15:30 > 52 5292246256 4 | 525 292246256 4
19.11.2010 15:39 > 52 5223156251 1 | 525 223156251 1
19.11.2010 15:43 > 52 5223556250 0 | 525 223556250 0

结果数字没有任何意义,因为较早的时间有更多的数字:
5292246256 292246256
比以后的时间:
5223156251 223156251

此时我怀疑时间没有以二进制格式存储。 我重新组织了数字并试图找到重复的模式 我最终得到了这个布局:

11.11.2010 16:23 > 52 52 42 53 72 57 5
16.11.2010 15:30 > 52 52 92 24 62 56 4
19.11.2010 15:39 > 52 52 23 15 62 51 1
19.11.2010 15:43 > 52 52 23 55 62 50 0

这是事情变得有趣的地方......

看看第3和第4行,除第4和第6列外,它们是相同的 第4列 15 55 。向后翻译,你会得到 51 55 两者的差异是 55 - 51 = 4 ,就像分钟的差异 43 - 39 = 4
从代码值中减去分钟数:
55 - 43 = 12
51 - 39 = 12

似乎第4列通过添加12并向后存储数字来编码分钟。

现在尝试将其应用于第5列:

11.11.2010 16:23 > 72 > 27
16.11.2010 15:30 > 62 > 26
19.11.2010 15:39 > 62 > 26
19.11.2010 15:43 > 62 > 26

26 - 15 = 11 27 - 16 = 11 因此第5列的差异为11.

从那以后很容易,这些列的差异分别为15,14,13,12和15。 11.
一些快速计算,你得到编码方案:

Digits Meaning Diff.
 2-1    year    15
 4-3    month   14
 6-5    day     13
 8-7    minute  12
10-9    hour    11

这是一个简单的解码代码片段:

union TimeFormat
{
    unsigned short codearray[5];
    struct
    {
        unsigned short year;
        unsigned short month;
        unsigned short day;
        unsigned short minute;
        unsigned short hour;
    };
};

void DecodeBarcode(char *code, TimeFormat *time)
{
    char buf[3]; // for atoi()
    buf[2] = 0;  // of course it has to be null-terminated

    for (int i = 0, diff = 15; i < 5; ++i, --diff)
    {
        buf[0] = code[i * 2 + 1];
        buf[1] = code[i * 2];
        time->codearray[i] = atoi(buf) - diff;
    }
    time->year += 2000;
}

答案 1 :(得分:2)

当您尝试解码外国时间格式时,您需要两次已知时间。取它们之间的差异,看看它相当于什么 - 秒,毫秒,天,没有太多的可能性。现在您已拥有基本时间单位,您可以使用其中一个时间并查看原始时间。

我上周必须这样做。我有两个约会:

2009-07-15 15:29:12  1247689752
2009-07-17 08:27:55  1247837275

有很多方法可以区分两个日期。最简单的可能是Excel,它会显示天数的差异;在这种情况下1.70744213。两个表示之间的差异是147523.将天数乘以一天中的秒数(24 * 60 * 60)也导致147523,所以现在我知道日期是从一些开始经过的秒数日期。

要获取开始日期,我会从自身中减去日期。再次,这在Excel中是微不足道的:将日期数除以一天中的秒数,然后减去。在我的情况下它出现在1969-12-31 19:00。这看起来有点奇怪,但我意识到我的时区在夏天的UTC时间是5小时。这告诉我时间值是UTC,表示自1970-01-01以来的秒数。

答案 2 :(得分:1)

这样的脚本你认为没有任何意义,因为你可以手工制作这个及时X,然后你可能会及时编写这个程序25*X这个程序将基于检查你所定义的模式而工作,那么当你没有这种类型的数千种算法来制动时这没有意义,但在某些方面会有所不同。

再给一些对,然后我可以告诉你更多,一对更少知道任何东西。