首页
社区
课程
招聘
[原创]星期公式及天干地支的单向散列性
发表于: 2009-7-8 23:57 9336

[原创]星期公式及天干地支的单向散列性

2009-7-8 23:57
9336
先举几个与日期有关的单向散列函数:

星期公式即“蔡勒公式”是德国数学家123年前首次推导出来的。

菜农在未知有此公式的条件下独立推导并"揭秘及推想"(逆向)出蔡勒当时的“设想”
(菜农有个恶习---知道世上必有公式也从不“偷看”,一定要用自己的歪理推导出来,哪怕是很搞笑的~~~)

不用说星期公式肯定是单向散列函数,典型的多对一和不可逆。“每7天一循环”。

对于“万年历”实际是400年一轮回

天干地支俺确实有点晕~~~



但它实际也是个单向散列函数,因为它是“60年一轮回”及“60年一甲子”。

故“万年历”和“天干地支”要1200年一轮回。

在某月有28,29,30,31这4个“最大天数”也算是一个“单向散列函数”。

某日到月底的天数=某月最大天数-某日。实际上是一个隐藏了某月最大天数的“单向散列函数”。

在这众多的和日期有关的“单向散列函数”中,我们可以用它们来隐藏日期(在HotWC3中为用户密钥)

HotWC3将此“单向散列函数”的结果称为星期密钥或假明文(初始化的明文或初值)。

由于HotWC3基础版归属传统密码体系中的序列密码中的自同步流加密算法,假明文排在明文流之首。

故应该选单向不可逆来阻止由明文来推出密钥来。

先介绍到这里。

注意:HotWC3密码网上在线演算器内有2个显示日期的地方。

上面的日期(密码输入)用的是星期公式,下面的“被访问日期”用的是JScript自带的日期及星期函数。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 129
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
hotpower 发表于 2008-9-7 16:49 侃单片机 ←返回版面
24楼: 菜农气晕数学界的(13*M+8)/5推导过程
首先声明菜农不喜欢数学,更不是数学家~~~

刚找到当年(13*M+8)/5)推导过程的“手稿”。它要从月星期表说起

通用星期偏差表(此表是菜农公式中的(13*M+8)/5)
分组           大  小  大  小  大  大  小   大   小   大   大   小  大  小  大
闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 13月 14月 3月 4月 5月  
天数   31  29  31  30  31  30  31  31  30  31   30   31   32   29  32  30   31
星期   5   1   2   5   0   3   5   1   4   6    2    4     0    3   5   1    3
星期差         3   2   3   2   3   3   2   3    2    3     3    2   3   2    3

分组           大  小  大  小  大  大  小   大   小   大   大   小  大  小  大
平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 13月 14月 3月 4月 5月  
天数   31  28  31  30  31  30  31  31  30  31   30   31   32   28  32  30   31
星期   6   2   2   5   0   3   5   1   4   6    2    4     0    3   5   1    3
星期差         3   2   3   2   3   3   2   3    2    3     3    2   3   2    3

由于明年的1月(13月)和今年5月的月表值都是0,2月(14月)和今年6月的月表值都是3
故月表简化为:
通用星期偏差表(此表是菜农公式中的(13*M+8)/5)
分组           大  小  大  小  大  大  小   大   小   大
年           3月 4月 5月 6月 7月 8月 9月 10月 11月 12月   
                      1月 2月
天数           31  30  31  30  31  31  30  31   30   31  
                       31  28/29  
星期值         2   5   0   3   5   1   4   6    2    4  
星期差         3   2   3   2   3   3   2   3    2    3  

可以看出"分组"为两组(大月小月大月小月大月),每5(记住这个"5")个月1组(注意1月2月划归为5月6月):
3月 4月 5月 6月 7月 和 8月 9月 10月 11月 12月
星期差同为:3   2   3   2   3

星期差求和=3+2+3+2+3=13(记住这个"13")

再对12个月的星期值求和=0+3+2+5+0+3+5+1+4+6+2+4=40
由于每5个月1组,则40/5=8(记住这个"8")

因为原查表算法为:
某日星期几=(百年%4*5+年+年/4+月星期表+日)%7

所以要琢磨出:
    月星期表 = ((13*M+8)/5)%7
   
因为每5个月1组,故肯定有((aM+b)/5)%7或((aM+b)%5)%7存在。
但是((aM+b)%5)%7可化简为(aM+b)%5,结果只有0,1,2,3,4.这肯定不过!!!

所以((aM+b)/5)%7将是推导的框架!!!

哈哈~~~"5"用到了。该"13"和"8"上阵了。

参数只有a,b.代入((aM+b)/5)%7几次即可搞定((13*M+8)/5)%7~~~

哈哈~~~菜农没文化让大家见笑了~~~搞笑~~~绝对的"非典"

菜农的"推导过程"绝对气晕数学教授,不过俺数学不好也难为菜农胡思乱想了~~~
2009-7-9 00:34
0
雪    币: 129
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
蔡勒同志敬礼!!!

hotpower 发表于 2008-9-6 09:34 侃单片机 ←返回版面
12楼: 这个算法实际是把月星期表进行了代换
月星期表+日+2天 等效为公式 (13 * m + 8)/ 5

再“转帖”我当时的“四百年历”的帖子:
推导过程:
1。平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。
   由于公元1月1日设为星期六,故3月1日为星期三。         ——注意这个“三”
   为使算法达到最简,故本算法以“星期”为计算单位。且选3月1日为基月。
2。每400年整一闰,或每4年且不为百年的一闰。
   百年%4=0闰或(年%4=0并且年<>0)闰。
3。每 4年(3个平年+1个闰年)共208周+5天                  ——注意这个“5天”
   每百年共100*(208周+5天)-1天=5217周+5天              ——注意这个“5天”(整
百年暂设为平年)
   每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和
“1天”(4个整百年只有一个闰年)
   即400年一轮回!(原来万年历400年前是一家)
4。万年3月1日星期算法(记住那个三)
   公式:某年3月1日星期几=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7
         某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7
   或    某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   
   闰4百年3月1日星期算法(百年%4=0)
   公式:某年3月1日星期几=(年+年/4+月星期表+日+2天)%7
   例:0000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
       1600年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
       2000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
       2001年3月1日星期几=(1+1/4+0+1+2)%7=4%7=星期四
       2004年3月1日星期几=(4+4/4+0+1+2)%7=8%7=星期一
       2008年3月1日星期几=(8+8/4+0+1+2)%7=13%7=星期六
       2042年3月1日星期几=(42+42/4+0+1+2)%7=55%7=星期六

   平4百年3月1日星期算法(百年%4<>0)
   公式:某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   例:1700年3月1日星期几=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平
年)
       1800年3月1日星期几=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平
年)
       1900年3月1日星期几=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平
年)
       1901年3月1日星期几=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五
       1918年3月1日星期几=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%7=40%7=星期五
       1958年3月1日星期几=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)%7=90%7=星期六
       1988年3月1日星期几=(19%4*5+88/4*5+88%4+3)%7=(15+110+0+3)%7=128%7=星期二
       1999年3月1日星期几=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一
       2100年3月1日星期几=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:
2100年是平年)
       2101年3月1日星期几=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二
       2102年3月1日星期几=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三
       2103年3月1日星期几=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四
       2104年3月1日星期几=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:
2104年是闰年)
       9999年3月1日星期几=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一
   注:按400年一轮回!(400年前是一家)的说法
       1600年,2000年是一样的
       1700年,2100年是一样的
       1800年,2200年是一样的
       1900年,2300年是一样的
       所以,万年历实际上是骗人的,应该叫“四百年历”才是。万只是多的意思罢了。
5. 万年某日星期算法  
   公式:某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   通同星期偏差表
   闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  29  31  30  31  30  31  31  30  31   30   31
   星期   3   6   0   3   5   1   3   6   2   4    0    2
   平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  28  31  30  31  30  31  31  30  31   30   31
   星期   4   0   0   3   5   1   3   6   2   4    0    2

可以看出:
月星期表实际是根据(闰年/平年,天数)得到星期数的。
它实际是个固定的数,只要分清闰年/平年即可。

新算法:星期=(百年%4*5+年+年/4+(13*月+8)/5+日)%7
旧算法:星期=(百年%4*5天+年+年/4+月星期表+日+2天)%7

昨日首次“拜读”了蔡勒公式,对-2C一直迷茫~~~
既然((C%4)*5)%7对应0,5,3,1
那么(203+C/4-2*C)也对应0,5,3,1???
C=0, (203+0/4-2*0)%7=203%7=0
C=1, (203+1/4-2*1)%7=(203-2)%7=5
C=2, (203+2/4-2*2)%7=(203-4)%7=3
C=3, (203+3/4-2*3)%7=(203-6)%7=1
C=4, (203+4/4-2*4)%7=(203+1-8)%7==(203+0)%7=0
C=5, (203+5/4-2*5)%7=(203+1-10)%7=(203-2)%7=(203+5)%7=5
C=6, (203+6/4-2*6)%7=(203+1-12)%7=(203-4)%7=(203+3)%7=3
C=7, (203+7/4-2*7)%7=(203+1-14)%7=(203+1-0)%7=(203+1)%7=1
C=8, (203+8/4-2*8)%7=(203+2-16)%7=(203-14)%7=(203+0)%7=0

晕呀!!!
蔡勒公式中的-2C竟然是想得到重复的0,5,3,1序列采取的“手段”

最后还有个1月2月变换问题,蔡勒公式取13月14月,菜农取5月6月。
因为菜农公式是在月星期表“进化”而来,又因为13月14月与5月6月的表值相同,
所以最后决定改为1月2月变换为5月6月。
这样做现在看来“物理意义”失去,但当时考虑“月表”的M大于12就不成“月”了.
总之把握:
1月2月为去年的以3月为基月表的表尾。
所以:
公式中出现1月2月的年是“去年”!!!
公式中出现1月2月的月是“明年”!!!(13月14月下一年的1月2月)
这样“去年”和“明年”就“能量守恒”了~~~
到此菜农“反汇编”蔡勒公式终成正果~~~
感觉蔡勒公式确实和菜农公式在思路上有很大的差距~~~
哈哈~~~看来蔡勒“同志”的脑浆还是“白颜色”的~~~

最后给出完整的菜农公式:
W = (C%4*5+Y+Y/4+(13*M+8)/5+D)%7
其中:
C=1~XX,Y=0~99,M=1~12,D=1~28/29/30/31
计算时要注意1月和2月的“去年”“明年”变换。
即:
当M=1或2时,M=M+12或M=M+4,Y=Y-1;当结果Y<0时,C=C-1.
哈哈~~刚搜索的:
蔡勒公式最早是由德国数学家克里斯蒂安 · 蔡勒( Christian Zeller, 1822-1899 )在 1886 年推导出的,因此通称为蔡勒公式( Zeller’s Formula )。为方便口算,式中的 [13 * (M+1) / 5] 也往往写成 [26 * (M+1) / 10] 。
哈哈~~~122年前就有蔡勒公式,菜农深感惭愧~~~
蔡勒同志敬礼!!!

以下都是“百度知道”的“最佳答案”,可气无菜农“半点气息”~~~

计算万年历的每一天是星期几的公式的意思?

给我一张闰年表

有没有<<星期速算法>>?

请问一年有多少周?
2009-7-9 00:36
0
雪    币: 129
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
菜农星期公式揭秘及蔡勒公式推想

讨论及论证过程详见:http://bbs.21ic.com/club/bbs/list.asp?boardid=11&page=1&t=3063061
今日方敢自称菜农星期算法为“菜农星期公式”~~~

因为“菜农公式”竟然与“蔡勒公式”结果完全相同!
哈哈~~~不同菜农就栽了~~~
结果当然必须相同,但过程和推导方法虽然雷同,可公式的优化和“物理意义”及“路径”差距很大。
菜农不知蔡勒(Zeller)是何须人也,也不知是“什么朝代”人士,
也不想知道~~~估计也是“卖脑浆的主”~~~
首先对比2个算法:
蔡勒公式如下:
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1
或者是:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

菜农补充“完整的蔡勒公式”:
W = (203 + C/4 - 2C + y + y/4 + 13 * (M+1) / 5 + d - 1) % 7
或者是:w=(203+y+y/4+c/4-2c+26(m+1)/10+d-1)%7
其中:C<=99,w在加203后不会出现负数
菜农公式如下:
W = (C%4*5+Y+Y/4+(13*M+8)/5+D)%7
菜农的(13*M+8)/5是根据月星期表推导出的。
菜农依据表的万年某日星期算法:  
   公式:某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   通用星期偏差表
   闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  29  31  30  31  30  31  31  30  31   30   31
   星期   3   6   0   3   5   1   3   6   2   4    0    2
   平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  28  31  30  31  30  31  31  30  31   30   31
   星期   4   0   0   3   5   1   3   6   2   4    0    2
或(1月2月为5月6月星期表):
   公式:某日星期几=(百年%4*5天+年+年/4+月星期表+日-0天)%7
   通用星期偏差表(此表是菜农公式中的(13*M+8)/5)
   闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  29  31  30  31  30  31  31  30  31   30   31
   星期   5   1   2   5   0   3   5   1   4   6    2    4
   平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  28  31  30  31  30  31  31  30  31   30   31
   星期   6   2   2   5   0   3   5   1   4   6    2    4

故蔡勒用的星期表为(1月2月为13月14月星期表):
   公式:某日星期几=(百年/4-2*百年+年+年/4+月星期表+日-1天)%7
   蔡勒星期偏差表(此表是蔡勒公式中的13*(M+1)/5)
   闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 13月 14月
   天数   31  29  31  30  31  30  31  31  30  31   30   31   31   29
   星期   5   1   2   5   0   3   5   1   4   6    2    0    3    5   
   平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月  13月 14月
   天数   31  28  31  30  31  30  31  31  30  31   30   31   31   28
   星期   6   2   2   5   0   3   5   1   4   6    2    0    3    5

以下略
2009-7-9 01:08
0
雪    币: 1270
活跃值: (109)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
学习学习,第一次知道这个公式。
2009-7-9 09:52
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
6
感谢大师分享 ~

PS. 一楼的图片未显示出来, 若能将图片上传至本论坛再用IMG标签引用会比较好.
      帖子中显示图片方法:
1. 点击附件按钮上传自己的图片完毕后, 再次点击附件按钮右边的向下的箭头, 选中刚上传好的图片, 即可成功引用(推荐).
2. 上传至个人的相册, 然后复制UBB代码即可.
2009-7-9 10:10
0
雪    币: 129
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不要开口什么“大师”,俺只是一个“上过农校、有点文化的知识农民”~~~

俺级别不够~~~所以无版主说的功能~~~

现在估计主贴可以上传,但回复还是不可以的~~~

刚试过了~~~估计是级别不够~~~
好像XP可以,vista不可以。
现在用的是vista,下午到单位看看XP行否。

不过俺有几个个人网站和众多博客,只要允许链接就问题不大了。
2009-7-9 12:45
0
雪    币: 164
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谈谈自己的感受:
1.头有点晕~
2.看了lz的文章,发现一些概念我忽然不明白了:什么是单向散列函数?什么是典型?什么是不可逆
3.于是看了lz发布的其他文章,头更晕了~~
4.我该去学习了~~~

另:根据lz的指点,我发现了无穷多个散列函数,举个例子更清楚点,y = x mod 7,如果按天来计算,也是7天一循环。当然我发现的这是一个函数系,还可以8天一循环.....
不知道我的思路是否正确,如有偏差,敬请lz斧正!
2009-7-11 18:20
0
雪    币: 129
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
晕是很正常的,我自己也经常发晕~~说些晕活~~

HotWC3选择星期和“天干地支”主要是保护明文的。

星期和“天干地支”都各有自己的成熟算法,而且“1200年一轮回”。

它们是从日期密钥中分离出来的,都是不可逆的。

由于HotWC3是流加密即字节或分组8位的加密系统,而星期的变化太小(0~6)
“天干地支”的变化也不足(0~59).
故将它们柔和在一起(更不可逆了)组成“星期密钥”,这样当日起密钥发生微小变化时,
星期密钥有可能发生“巨变”。从而使攻击日期密钥的难度增大。
2009-7-11 18:55
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习一下,感谢分享
2009-7-19 13:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这个比较有兴趣,看看先!学习一下
2009-7-25 16:00
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
原来蔡勒公式还能这样推导啊,没有注意呢
2009-7-31 12:57
0
游客
登录 | 注册 方可回帖
返回
//