首页
论坛
课程
招聘
[原创]密码学入门系列(一) 之 移位密码(古典)
2009-5-19 19:43 36007

[原创]密码学入门系列(一) 之 移位密码(古典)

2009-5-19 19:43
36007
【文章标题】: 密码学入门系列(一) 之 移位密码(古典)
【文章作者】: jackozoo
【作者邮箱】: [email]jackozoo@163.com[/email]
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  系列声明: 此系列文章皆为密码学入门相关知识, 因此都比较基础, 旨在帮助尚未入门的朋友们尽快地走进密码学的大门, 由于是一个系列, 所以所有的文章会从一个全新的角度来诠释密码学, 而不是从破解的角度.
  另外, 此系列将会包含常见古典密码, 现代密码, 及系统安全等方面的内容, 对于每一种加密算法, 我都会在文后附上相应的C程序.
  
  P.S. 由于所有文章是从密码学的角度来解释的, 所以一些名词会和当今常用的名词的意思不太一样, 请注意这一点.
  如 :
  1.明码--通过密匙-->得到密码. 这里的密码也就是密文的意思.
  2.字母表:明密文中的单个字母单元所属的表. 这里的字母不是一般说来的abcd等,它可能是8位的,16位的,32位的,也可能只是某一部分字母比如A~Z.
  ...  ...
  
  OK, 进入正题:
  
  密码学入门系列(一) 之 移位密码(古典):
  
移位密码简介:
  
  移位密码最早可追溯至古罗马时期, <<高卢战记>>有描述恺撒曾经使用密码来传递信息,即所谓的"恺撒密码",它是一种替代密码,通过将字母按顺序推后起3位起到加密作用,如将字母A换作字母D,将字母B换作字母E.这是一种简单的加密方法,这种密码的密度是很低的, 只需简单地统计字频就可以破译, 现今又叫"移位密码", 只不过移动的为数不一定是3位而已.
  
  虽然移位密码非常简单, 但它是我们走向更高深的密码的基础, 因此以下基础知识还是希望大家能仔细看看.
  
  在详细介绍之前, 我们有必要知道一些密码学所需的数学知识.
  
  1.字母表:明密文中的单个字母单元所属的表. 比如如下
  
  Z26:很常用的基于26个英文大写字母的字母表. 这里从0开始,25结束来标志其值, 而不是使用其ASCII值,目的是为了使计算更加方便.
      A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z
      0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
      如明文JACKOZOO的码值即为:9 0 2 10 14 25 14 14 . 每个字符占字母表中的一个字母.
  
  Z2~8: 也即Z256. 这是很常用的一类字母表, 也即大家经常使用的字节流加密. 字母表从00~FF共2的8次个字母元素.
      
      如明文JACKOZOO的码值(ANSI编码)即为4A 41 43 4B 4F 5A 4F 4F  .
        明文爱你一生一世(ANSI编码)的码值即为B0 AE C4 E3 D2 BB C9 FA D2 BB CA C0 .
  
  Z2~16:也即Z65536.  此字母表常用于字流加密. 字母表从0000~FFFF共2的16次个字母元素.
      
      如明文JACKOZOO(ANSI)的码值为: 4A41 434B 4F5A 4F4F . 共占4个字母单元.
        明文爱你一生一世(ANSI)的码值为: B0AE C4E3 D2BB C9FA D2BB CAC0. 共占6个字母单元.
  
  Z2~32 : 字母表从00000000~FFFFFFFF共2的32次个字母单元. 常用于双字流的加密.
  
      如明文JACKOZOO(ANSI)的码值为: 4A41434B 4F5A4F4F . 共占2个字母单元.
        明文爱你一生一世(ANSI)的码值为: B0AEC4E3 D2BBC9FA D2BBCAC0. 共占3个字母单元.
  
  附注: 上述的所谓字节流,字流,双字流仅仅是相对于你加密时所选取的字母表而言的, 因为任何信息在计算机中都是以二进制流存放的.
  
  
  2.模n加与模n乘:
    命n为正整数,且字母表Zn = {0,1,2 ... n-1}. a,b属于Zn, 则定义a+b mod n 为a和b的模n加.
    同理有ab mod n 为a 和 b 的模n乘.
  
  
  移位密码:
  移位密码体制(Caesar Cipher)的原理可用a+b mod 26 做简介刻画. 设移位密码体制中有:
  
    明文: IAMJACKOZOO
    秘匙: K = 2
    密文: KCOLCEMQBQQ
  
  其中的密文的每个字母单元是由明文在字母表内循环右移3位所得 .
  
  这一加密法则可概括为: y = (x+3) mod 26 . x,y ∈Z26. x为密文, y为明文.
  
  
  我们小结一下, 移位密码中有如下概念:
  
  (这是针对Z26字母表)
  1) 明密文字母表 Z26
  2) 秘匙K = a 属于Z26
  3) 加密变换 y = (x+a) mod 26 , x,y ∈ Z26
  4) 解密变换 x = (y-a) mod 26 , x,y ∈ Z26

  
  我们来看一个例子:
  例1:已知移位密码中明文为HIJACKOZOO, 字母表为Z26,秘匙为K=9,请加密之.
  
  解 :由字母表Z26得HIJACKOZOO 的码值为:
      7 8 9 0 2 10 14 25 14 14         (共10个字母单元)
      对其每个字母单元做y = (x+k) mod 26 运算得:
   → 16 17 18 9 11 19 23 8 23 23
      因此得密文为:
   → QRSJLTXIXX
  
  例2:已知移位密码中明文为爱你一生一世, 字母表为Z2~8, 秘匙为0x99, 请加密之.
  
  解 :由字母表Z2~8得爱你一生一世的码值为:
      B0 AE C4 E3 D2 BB C9 FA D2 BB CA C0     (共12个字母单元)
      对其每个字母单元做 y = (x+k) mod 0x100 运算得:
   → 49 47 5D 7C 6B 54 62 93 6B 54 63 59
      因此得密文为:
      IG]|kTb搆TcY.
  
  
  由于密码学中会用到很多的数学知识, 而很多的数学符号我们使用键盘很难输入进去, 比如∑,∈,∫∮≡≌≈等,但这些符号
  我是怎么弄上来的了? 其实是很笨拙的方法.
  我是通过生成一个文本, 在从里面复制我想要的字符.不同语言的系统能显示的字符数是不一样的.
  代码如下:
  #include <stdio.h>
  #include <windows.h>
  void main()
  {
  	FILE *fp = NULL;
  	int i,j;    //勿定义为BYTE, 否则无限循环.
  	if(NULL == (fp = fopen("a.txt","ab+")))
  	    return;
  	for(i=0;i<=0xFF;++i)
  	    for(j=0;j<=0xFF;++j)
  	    {	
  	        fputc(i,fp);
  	        fputc(j,fp);
  	    }
  	fclose(fp);
  }
  

  
  移位密码的理论讲解就到这里, 虽然内容很简单, 但我还是尽量说的详细些.希望可以照顾到基础不太好的朋友.
  
  
  附件中为我编写的一个用于学习移位密码的小软件. 附带源码 . 大家可自行学习.
  
  
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年05月19日 PM 07:28:57

【看雪培训】《Adroid高级研修班》2022年春季班招生中!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (51)
雪    币: 296
活跃值: 活跃值 (11)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
萧萧黄叶 活跃值 1 2009-5-19 20:16
2
0
写得很好啊,从开始认真来学
雪    币: 2309
活跃值: 活跃值 (48)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
加百力 活跃值 12 2009-5-20 14:41
3
0
支持一下,密码学普及工作!
雪    币: 123
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
whack 活跃值 2009-5-21 21:05
4
0
支持下了。哈哈
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
罪恶天神 活跃值 2009-5-22 10:23
5
0
支持了。楼主辛苦。。。一个很好的移位密码的讲解。。。谢谢。。学习了。。。
雪    币: 269
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
jxccy 活跃值 1 2009-5-22 11:06
6
0
很好,通俗易懂,支持!!!
雪    币: 43751
活跃值: 活跃值 (163989)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 活跃值 2009-5-23 19:43
7
0
Support.
雪    币: 297
活跃值: 活跃值 (42)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
pyq逍遥 活跃值 1 2009-5-24 10:15
8
0
不错不错,继续下去就是了
雪    币: 196
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chowfaye 活跃值 2009-5-24 12:05
9
0
“ if(NULL == (fp = fopen("a.txt","ab+"))”
掉了一半括号
雪    币: 331
活跃值: 活跃值 (309)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
iawen 活跃值 3 2009-5-24 12:15
10
0
继续支持楼主,,收藏学习
雪    币: 1806
活跃值: 活跃值 (39)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
rockinuk 活跃值 8 2009-5-24 17:25
11
0
chowfaye 大大看的真仔細。
我代 jackozoo 大大 謝您說聲謝謝。
雪    币: 1225
活跃值: 活跃值 (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
jackozoo 活跃值 14 2009-5-24 21:00
12
0
谢谢chowfaye指正,  谢谢R大代谢
雪    币: 1871
活跃值: 活跃值 (21)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
逍遥风 活跃值 55 2009-5-24 23:09
13
0
非常不错的文章哦
雪    币: 210
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
诗意世袭 活跃值 2009-5-24 23:10
14
0
OK,吸收了,谢谢希望后续文章能很快出炉
雪    币: 1806
活跃值: 活跃值 (39)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
rockinuk 活跃值 8 2009-5-24 23:30
15
0
謝謝逍遥风版主大駕光臨,還希望您可以撥空給我們指導呢。
雪    币: 267
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wangfir 活跃值 2009-5-25 20:52
16
0
请问
附件源码是c的吗,开发环境是什么。。。
雪    币: 1225
活跃值: 活跃值 (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
jackozoo 活跃值 14 2009-5-26 14:08
17
0
用Peid看下bin你不就知道咯
(IDE为VS2005)
雪    币: 226
活跃值: 活跃值 (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Thinker 活跃值 2009-5-27 09:43
18
0
xiexie
雪    币: 24
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我走以后 活跃值 2009-6-1 22:45
19
0
谢谢,虽然我现在还用不上。不过又多懂了些知识了。。
雪    币: 297
活跃值: 活跃值 (42)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
pyq逍遥 活跃值 1 2009-6-2 21:32
20
0
汉字的编码不知道怎么回事
解 :由字母表Z2~8得爱你一生一世的码值为:
      B0 AE C4 E3 D2 BB C9 FA D2 BB CA C0     (共12个字母单元)
不知道上面是编码是怎么来的
雪    币:
能力值: (RANK: )
在线值:
发帖
回帖
粉丝
游客 活跃值 2009-6-2 21:38
21
0
GB2312的编码.
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cliclicker 活跃值 2009-6-3 10:05
22
0
通俗易懂,好文章!
雪    币: 290
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
芳草碧连 活跃值 2009-6-5 23:48
23
0
不错 一篇篇慢慢看
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wefgod 活跃值 2009-6-14 14:33
24
0
嗯很好谢谢!!!
雪    币: 193
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
心静 活跃值 2009-6-14 15:52
25
0
辛苦了!支持!
游客
登录 | 注册 方可回帖
返回