免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 19805 | 回复: 13
打印 上一主题 下一主题

【练习】 Playfair 密码 - 加密解密 [复制链接]

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-18 19:49 |只看该作者 |倒序浏览
本帖最后由 rubyish 于 2013-06-19 13:42 编辑

Playfair密码(英文:Playfair cipher 或 Playfair square)是一种替换密码,1854年由查尔斯·惠斯通(Charles Wheatstone)的英国人发明。现时,波雷费密码被视为十分不安全的。

编写密文:
  • 选取一个英文字作密钥。除去重复出现的字母。将密匙的字母逐个逐个加入5×5的矩阵内,剩下的空间将未加入的英文字母依a-z的顺序加入。(将I和J视作同一字。JOY -> IOY)
  • 将要加密的讯息分成两个一组。若组内的字母相同,将 X 加到该组的第一个字母后,重新分组。若剩下一个字,也加入 X 字。(ee st um p->EX ES TU MP)。
  • 在每组中,找出两个字母在矩阵中的地方。
  • 若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母,PB->IK,BT->KP)。
  • 若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)。
  • 若两个字母不同行也不同列,在矩阵中找出另外两个字母,使这四个字母成为一个长方形的四个角(HI->BM)。
  • 新找到的两个字母就是原本的两个字母加密的结果。


解密:
其实就是反其道而行。

例子:

取“playfair example”为密钥,得矩阵

P L A Y F
I R E X M
B C D G H
K N O Q S
T U V W Z

要加密的讯息为“Hide the gold in the tree stump”
HI DE TH EG OL DI NT HE TR EX ES TU MP

就会得到密文“BM OD ZB XD NA BE KU DM UI XM MO UV IF”。


解出密码:

要解密的讯息为 'BM OD ZB XD NA BE KU DM UI XM MO UV IF'
会得到“HI DE TH EG OL DI NT HE TR EX ES TU MP”。

CHECK: example
  1. my $K = 'playfair example';
  2. my $S = 'Hide the gold in the tree stump';
  3. my $C = 'HI DE TH EG OL DI NT HE TR EX ES TU MP';
  4. my $D = 'BM OD ZB XD NA BE KU DM UI XM MO UV IF';

  5. say '加密 OK ' if $D eq PL( $K, $S, 'en' );
  6. say '解密 OK ' if $C eq PL( $K, $D, 'de' );
复制代码
破解:

密文: OH DL EK CM NC EG ME QL AT QP EW UC DK AE
原文: HA RD TH IN GS SH OU LD BE PO SX SI BL EX

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2013-06-18 20:11 |只看该作者
本帖最后由 rubyish 于 2013-06-18 16:30 编辑

为了鼓励大家积极参与技术交流。
限制使用 perl(5,6),不限名额。
版主50分奖励~

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2013-06-18 20:48 |只看该作者
是要破解还是写个加密解密函数?

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
4 [报告]
发表于 2013-06-18 21:00 |只看该作者
zhlong8 发表于 2013-06-18 16:48
是要破解还是写个加密解密函数?

写个加密解密函数ba ?
如果有破解的,版主将会给予100分奖励的~

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2013-06-18 21:05 |只看该作者
回复 4# rubyish


    破解你要用个简单点的密码加密几段英文或者汉语拼音吧。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
6 [报告]
发表于 2013-06-18 21:16 |只看该作者
zhlong8 发表于 2013-06-18 17:05
回复 4# rubyish


破解要密码。{:3_202:}  ?{:3_191:} ?

论坛徽章:
0
7 [报告]
发表于 2013-06-19 15:55 |只看该作者
本帖最后由 picbhan 于 2013-06-19 16:19 编辑

有意思,但是有一点点没看懂。第二条“将要加密的讯息分成两个一组。若组内的字母相同,将 X 加到该组的第一个字母后,重新分组。”这个地方为什么要重新分组,如何重新分组?比如例子里的tree的ee分组成EX,不需要再重新分组吧?
还有4楼的意思应该指你先加密一段数据传上来,看谁能不能破解出来你原来的数据,不是说要你的密码吧。

重新分组看懂了,是我刚刚看错了分组后的数据。
sinian126 该用户已被删除
8 [报告]
发表于 2013-06-19 16:14 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2013-06-19 17:00 |只看该作者
本帖最后由 picbhan 于 2013-06-19 17:07 编辑

因为I和J无法区分,X无法确定是重复还是真实的X,且第6和第7条找到的两个字符不确定顺序,因此个人认为解密无法正确得到原来的字符串,下面是加密的程序。
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;

  4. my $code = 'playfair example';

  5. my %used;

  6. my @matrix;

  7. $code =~ y/A-Z/a-z/;
  8. $code =~ s/\s+//g;
  9. $code =~ s/j/i/ig;
  10. my @code = split //, $code;

  11. for (@code) {
  12.     next if exists $used{$_};
  13.     $used{$_} = 1;
  14.     push @matrix, $_;
  15. }

  16. for (97 .. 105, 107 .. 122) {
  17.     next if exists $used{chr($_)};
  18.     push @matrix, chr($_);
  19. }

  20. my %position;
  21. for my $i (0 .. 4) {
  22.     for my $j (0 .. 4) {
  23.         $position{$matrix[$i * 5 + $j]} = [$i, $j];
  24.     }
  25. }

  26. my $string = 'Hide the gold in the tree stump';
  27. $string =~ y/A-Z/a-z/;
  28. $string =~ s/\s+//g;
  29. $string =~ s/j/i/ig;

  30. my @string = split //, $string;
  31. my @results;
  32. my ($k1, $k2);
  33. while (@string) {
  34.     $k1 = shift @string;
  35.     if (@string) {
  36.         $k2 = shift @string;
  37.         if ($k1 eq $k2) {
  38.             unshift @string, $k1;
  39.             $k2 = 'x';
  40.         }
  41.     }
  42.     else { $k2 = 'x'; }
  43.    
  44.     my @idx1 = @{$position{$k1}};
  45.     my @idx2 = @{$position{$k2}};
  46.    
  47.     if ($idx1[0] == $idx2[0]) { # same row
  48.         print $matrix[$idx1[0] * 5 + ($idx1[1] + 1) % 5], $matrix[$idx2[0] * 5 + ($idx2[1] + 1) % 5], ' ';
  49.     }
  50.     elsif ($idx1[1] == $idx2[1]) { # same column
  51.         print $matrix[(($idx1[0] + 1) % 5) * 5 + $idx1[1]], $matrix[(($idx2[0] + 1) % 5) * 5 + $idx2[1]], ' ';
  52.     }
  53.     else {
  54.         print $matrix[$idx1[0] * 5 + $idx2[1]], $matrix[$idx2[0] * 5 + $idx1[1]], ' ';
  55.     }
  56. }
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
10 [报告]
发表于 2013-06-19 17:28 |只看该作者
picbhan 发表于 2013-06-19 11:55
4楼的意思应该指你先加密一段数据传上来,看谁能不能破解出来你原来的数据,不是说要你的密码吧。 ...

OK ~
传上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP