首页
社区
课程
招聘
[原创]流密码内嵌魔方阵于随机存档之研究-- Magic Square 之神奇篇
发表于: 2009-5-25 06:22 9230

[原创]流密码内嵌魔方阵于随机存档之研究-- Magic Square 之神奇篇

2009-5-25 06:22
9230
#include <stdio.h>
#include <stdlib.h>
 main()
{ int i,j,x,y,n=2;/* 宣告循环变量i,j,及数组变量x,y,及阶层变量n */
  int **magic;/* 宣告数组的大小 */
 /* clrscr();/* 消除荧光幕 */       */
  while(n>19 || n%2==0){ /* 判断条件是否成立 */
    printf("\n 请输入奇数魔术方阵的大小(1-19):");
    scanf("%d",&n);
  }
  magic=(int *)malloc(n* sizeof(int));
  *magic=(int *)malloc(n*sizeof(int));
  printf("======>%d\n",magic);
  x=0;y=(n-1)/2; /* 设定魔术方阵中的第一个位置 */
  for(i=0;i<n;i++) /* 将所有的数组设定其值为0 */
    for(j=0;j<n;j++)
      *(*(magic+i)+j)=0;
  *(*(magic+x)+y)=1; /* 设定魔术方阵的第一个值 */
  for(i=2;i<=n*n;i++)
  { x=(x+(n-1)) % n; /* 计算方阵往右上的规则  */
    y=(y+1) % n;     /* 及其x ,y值的变化现象  */
    if( (*(*magic+x)+y) != 0){ /* 判断是否会重复 , 如果重复 */
      x=((x+2)) % n;       /* 计算方阵往下移动到的规则  */
      y=(y+(n-1)) % n;     /* 及其x ,y值的变化现象      */
    }
    *(*(magic+x)+y)=i; /* 没有错误,将数字填入魔术方阵中 */
  }

  printf("--------------%2d阶的魔术方阵------------------\n",n);
  for(i=0;i<n;i++){
    for(j=0;j<n;j++)
      printf("%5d",*((*magic+i)+j));
    printf("\n");
  }
  printf("--------------敬请批评指教--------------------\n");
}
 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
2
几处小笔误:
1.
两个对角的和分别是 (16+1)=11

应为17
2009-5-25 07:59
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
3
另一处小笔误:
magic=(int *)malloc(n* sizeof(int));
*magic=(int *)malloc(n*sizeof(int));


应该为:        magic=(int **)malloc(n* sizeof(int));
        for(i=0;i<n;i++)
                *(magic+i)=(int *)malloc(n*sizeof(int));  
2009-5-25 08:48
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
4
两个对角的和分别是 (16+1)=11

這是筆誤。
真的是 17 ,一看就知道。
謝謝提醒。
至於
magic=(int *)malloc(n* sizeof(int));
*magic=(int *)malloc(n*sizeof(int));

是沒錯的。
您要那樣寫,應該也是可以。
我只是把 magic square 的 psuecode release 出來,它應該還可以再  optimize。
2009-5-25 09:06
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
5
应为格子数的平方(或二次方)

您誤解囉。
是兩個紅色圈圈的相加,或是兩個藍色框框的相加,他們各自 的 sum 為 格子數總和再加 1。
2009-5-25 09:11
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
6


对的, 我失误了. 格子数 = n*n . 不等于n的.  呵呵, 我自己粗心了~~
2009-5-25 09:33
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
7
沒關係,讀者讀懂最重要。
這可是我50篇論文當中的其中一篇。
新改良版 magic sqaure,這個方法是我得意的之一。
2009-5-25 09:39
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
8
这些附件是根据 【原创】流密码内嵌魔方阵于随机存档之研究 所设计出来的东西。
然后接【原创】流密码内嵌魔方阵于随机存档之研究-- Magic Square 篇 继续讨论。
再继续讨论【原创】流密码内嵌魔方阵于随机存档之研究-- Magic Square 之神奇篇
在这里会是一个 magic square 篇的 final。


上面这个9 by 9 magic square 是由原本的 C program 产生的。
现在我要介绍它的 mutation。
我们知道在 magic square 中最小的是 3 by 3 matrix,如果要产生一个 9 by 9 magic square,其实可以经由 3 by 3 magic square 产生。不必直接产生 9 by 9 magic square。
3 跟 9 的关系,可以看成是 expand 及condense relationship,因此我们可以利用 3 by 3 magic square 的原理,创造出一个9 by 9 magic square。

怎么说呢?
下面这个彩色的 9 by 9 magic square 就是由 3 by 3 magic square 所 expanded 出来的。
现在我们来看红色粗线,我把它分成一个井字形,或是九宫格。

它总共有九大区块 (9 big blocks),分别 mark 上不同颜色,每一大区块又可以细分成九小区块 (9 small blocks)。


现在,我们把九大区块分别编号,从(1) 到(9),再把(1)切割为1到9。
等全部切割完毕,再按顺序从1至81填入9 by 9 magic square。
填完毕后,就大功告成。


我现在用四个 corner 的值来初步验证一下。
(71+11)= 82,(51+31)=82,因 9 * 9 = 81,而 82 比 81 大 1。
符合大于 1 的特性。
验证每一个 column 及 row 或是 cross 的 sum 会不会一样,我就不计算,留给您们自己算。
产生更大的 magic square,可以利用这样的方式依此类推。
关于 magic square topic,我就介绍到这里。
后面若有空,我会回到 stream cipher 的 pseudo random generator 的 topic。
上传的附件:
2009-5-26 19:23
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
“Send 最少要传 plaintext 及 key 给 receiver”
LZ的意思难道是你讲的这个Magic Square的东东就不需要传送Key了?

“For example:
  Sender 传送 seeds 为 (9,47,45,37,35) 及 cipertext 给 receiver 时,receiver 收到后,……”
其实还是传了四个角上的数字和Square的阶数过去,而这5个变量又可以唯一的生成一个矩阵,尽管LZ把这个称之为Seed,但是我觉着这里面有偷换概念的嫌疑,这个seed就是Key嘛,你那个生成Square的算法其实就是相当于一个对称算法的密钥扩展函数。

“当 receiver 收到 sender 所传送的 ciphertext 及 seed 时,receiver 可以利用自行产生一个 magic square,此时,产生的这个 magic square 就是一个 key,利用这个 key 来把 ciphertext 做decryption,就会得到plaintext。”一个seed唯一对应一个squae,实际上seed就是Key,没有什么不一样的地方。

这个东东有意思的是那个阶越高组合可能就越大的问题,随后再找TW版主讨论。
2009-6-10 16:25
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
10
“Send 最少要传 plaintext 及 key 给 receiver”
LZ的意思难道是你讲的这个Magic Square的东东就不需要传送Key了?


是的!

“For example:
Sender 传送 seeds 为 (9,47,45,37,35) 及 cipertext 给 receiver 时,receiver 收到后,……”
其实还是传了四个角上的数字和Square的阶数过去,而这5个变量又可以唯一的生成一个矩阵,尽管LZ把这个称之为Seed,但是我觉着这里面有偷换概念的嫌疑,这个seed就是Key嘛,你那个生成Square的算法其实就是相当于一个对称算法的密钥扩展函数。


所謂 key ,是直接可以進行 encrypt 及 decrypt,所以,這就是為什麼在 Cryptology 裏,要保護 key 的原因。seed 的確跟 key 的地位很像。

“当 receiver 收到 sender 所传送的 ciphertext 及 seed 时,receiver 可以利用自行产生一个 magic square,此时,产生的这个 magic square 就是一个 key,利用这个 key 来把 ciphertext 做decryption,就会得到plaintext。”一个seed唯一对应一个squae,实际上seed就是Key,没有什么不一样的地方。


這個 seed 本身就很像 key ,但不是 key。key 是 那個 magic square。
如我之前說了,要先有 seed ,再利用 seed 產生 key。
至於 一個 seed 是不是唯一對應一個 square,這點我還在研究中。
我希望是,但我擔心實際上不是。


这个东东有意思的是那个阶越高组合可能就越大的问题,随后再找TW版主讨论。

謝謝您參與這個討論。


這裏有衍生一個問題,如果“一个 seed 唯一对应一个 squae ”,那這個 seed,就要 keep secret,那 seed 的確跟 key 的功能差不多。
如果“ 一个 seed 不是唯一对应一个 squae”,那這個 seed,是否有必要 keep secret?
當 不是唯一對應的關係時, receiver 又怎麼能判斷怎麼產生正確的magic square!?
2009-6-10 17:04
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
BOSS不在,上来发帖~~~

这里面有两个问题:
    1.   如果Seed与square一一对应,则有固定算法可以从Seed恢复出Key,seed传送过程仍然要保密,因为在密钥体系中的作用一致。其实DES的Key也不是直接拿来去参与Feistel结构的加密过程了了,而是经过了密钥扩展,生成了16轮迭代的子密钥,每个子密钥去参与Feistel中的异或运算。参照DES来看,版主说的Seed更类似与DES的Key,而Square更类似于DES的16轮子密钥。
    2.   如果不是一一对应的,就不是有无必要Keep secret的问题了,假设A发送了用某个Square_1加密过的密文C(假设明文是M1),同时传给B的还有一个Seed,但是Seed恢复出来的Square_2与Sqare_1不同,就无法保证B可以将C还原了。

不知说的是否清楚。简单试验了一下(主要是不知如何证明……汗)貌似是一一对应的。有没有数分比较悍的同学给个证明出来啊。
2009-6-12 13:22
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
12
1. 如果Seed与square一一对应,则有固定算法可以从Seed恢复出Key,seed传送过程仍然要保密,因为在密钥体系中的作用一致。其实DES的Key也不是直接拿来去参与Feistel结构的加密过程了了,而是经过了密钥扩展,生成了16轮迭代的子密钥,每个子密钥去参与Feistel中的异或运算。参照DES来看,版主说的Seed更类似与DES的Key,而Square更类似于DES的16轮子密钥。

我在前面的帖子裏就說明了,seeds 要在 secure channel 或是 VPN 裏傳輸,要保護 seeds。
我這裏沒論及 DES ,所以不知道你說的那個情況。

2. 如果不是一一对应的,就不是有无必要Keep secret的问题了,假设A发送了用某个Square_1加密过的密文C(假设明文是M1),同时传给B的还有一个Seed,但是Seed恢复出来的Square_2与Sqare_1不同,就无法保证B可以将C还原了。

這裏,我之前解釋的不是很清楚,讓你誤解,對不起。
我再說明清楚一點:
A) 我所謂的不是一一對應,當然不成立,它一定是一一對應的關係。

B) 這麼說好了,以 6 by 6 magic square 為例子,第一個 case 就沒有符合“ 大於1” 的法則,我在第二個 case 才給出另一個 6 by 6 magic square。
以 4 by 4 magic square 為例子,它有 880 種,對於每四個角落的值( 4 corner value) 都只出現過一次,這是不是真的?我也不知道。若是真的,則符合 A) 點,若不為真,則與 A) 矛盾。

C) 表面上看來,“大於1”的法則,並不能完全適用在全部的 magic square;至少我發現在,有好幾組 5 by 5 magic square 上,不符合 “大於1”法則,但確實是一個 normal type 的 5 by 5 magic square。
產生 normal type 的 magic square 有 N 種 algorithm,我也知道其中幾種 algorithm,而我所知道的那些 algorithm,是符合 “大於1”法則的。

以下我給出 5 by 5 不是 “大於1” 的法則。
既然不符合這個法則,那它四個 corner value 當然就不能做為 seeds,可是它依然還是一個 5 by 5 的 normal type magic square。













理論上,我們可以假設 Sender send 一個 4 by 4 magic square's seeds (parameters)  給 Receiver,當 Receiver 收到 seeds 時,他會根據 seeds 去產生一個跟 Sender  一模一樣的 4 by 4 magic square。
這樣的假設很合理,但不實際。

Why?
因為, Receiver 要知道所有 880 種的 Algorithm,這本身就是一個大問題。

以 Computer 來說,如何 stored 880 種的 Algorithm? 對 memory space /disk space 等都是困難的工作。
因此,去除這些不符合 “大於1”法則的,某方面是可以解決 memory space/disk space 的難題。

可是又發生一個新問題,什麼問題?
這樣可能就 insecure。

所以,我才會用 兩道關卡 stream cipher 及 magic square 一起使用。取 stream cipher 及 magic square 它們各自的特性來做成一個很 practical 的 software encryption/decryption.
上传的附件:
2009-6-12 15:33
0
雪    币: 202
活跃值: (151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
数学很神奇,不禁回想起了93年6.1买的十万个为什么数学卷里的“河图、洛书、百子图”^_^
2009-8-17 11:46
0
游客
登录 | 注册 方可回帖
返回
//