新浪博客

由扑克游戏引出的字符串加(解)密技术

2014-02-08 19:42阅读:
记得小的时候,大人们给我用扑克牌变了一个小魔术。其实这个魔术很简单,就是拿着事先排好次序的清一色的(比如红桃)13张牌,牌面朝下不能看牌,由最下面向上面倒一张牌,然后打出最下面一张牌放在桌子上翻过来是A;再从最下面向上面倒一张牌,然后再打出最下面一张放在桌子上翻过来是 2;循环着倒一张打出一张,可以依次打出 3 4 5 6 7 8 9 10 J Q K。
虽然这是一个糊弄小孩子的游戏,但却并不那么简单破解。刚开始我觉着这有啥呀,太容易了!拿着扑克一通插排。开始给你变啦,从1到7是顺利打出来了,但到8以后,怎么都不对!费了半天的功夫,初始排序终于被我破解了。我那个高兴啊!看官,您可以自己拿着扑克试试,说不定您的智力还真有可能赶不上小孩子呢!
长大后,又想起这个游戏,既然是大人了,就来点儿高难度的吧。经过研究,我编写出了三种破解程序,参加游戏的字符串个数和“倒牌”的间隔数都可以随意设定。其实,这就是一种简单的加密技术。比如下面一组经过用上述方法加密的10位明码数字 46328Q9517,其实它的原码是 8162Q37495,其密钥就是“倒牌”的间隔数5。如果想再玩高级一些的,可以将密钥从固定数值改成以无规律变化的不同数值,比如3152。这个密钥的意思是第一间隔是3张、第二间隔是1张、第三间隔是5张、第四间隔是2张,以此4位密钥循环着倒牌。要是没有这个密钥,靠人工解密几乎是不可能的。
现代人的生活离不开密码,希望此贴能帮助您为自己的密码加密,加密后的明码可以随意写在您的笔记本里,不怕别人看见。当然,密钥(间隔数)要另外记好哦!好了,为了娱乐,下面给出“倒牌间隔张数”从1 至10的游戏谜底。玩的时候注意,不论间隔几张倒牌,都要一张一张的倒哦!
由扑克游戏引出的字符串加(解)密技术

由扑克游戏引出的字符串加(解)密技术
由扑克游戏引出的字符串加(解)密技术
由扑克游戏引出的字符串加(解)密技术
由扑克游戏引出的字符串加(解)密技术
由扑克游戏引出的字符串加(解)密技术
由扑克游戏引出的字符串加(解)密技术
由扑克游戏引出的字符串加(解)密技术
由扑克游戏引出的字符串加(解)密技术
由扑克游戏引出的字符串加(解)密技术

现在就把倒牌的解题思路和程序献给朋友们:
首先说说,如果您破解上述倒牌游戏的方法,是将A、2、3......隔X张牌就插一张去试的话,那你的思路是很笨的。我的思路是:怎么倒出去的牌,咱就怎么给它倒回来。
以间隔一张倒牌为例,先将牌按A、2、3、4......K排好,A在最下 K在最上面,牌的背面朝上放在桌子上(因为没必要看牌面,看了反而会添乱)。从桌子上那摞牌的上面拿一张牌(K)放在手上,再拿一张(Q)放在手里牌(K)的上面,开始破解了!
将手里最上面的一张牌倒到下面去,从桌子上那摞牌拿一张放到手里牌的最下面,再将手里最上面的一张倒到下面,再从桌子上拿一张放到手里牌的最下面......,依次循环下去,直至桌子上的牌都倒到手里。别忘了最后还要将手里最上面的牌向下倒一张哦。
好了,把牌翻过来看看吧,对照一下以前我给出的正确牌序,您是不是该开心的笑了?
倒2张以上牌的破解方法,无非是每次从上向下倒牌时的次数增多几次而已。
下面给出用 VB6 语言编写的破解程序,就是按照上述的破解思路设计的:
如下图所示,首先要建立一个主程序界面,在此界面上设定一个下拉列表控件Combo1、一个文本框控件Text1、一个按钮控件Command1、两个说明控件Label1(间隔张数)和Label2(计算结果)。然后进入程序编辑界面,将下列程序清单拷贝过去。OK,您就可以运行此程序了!
如果您是编程高手,只要对程序进行必要的改动,就可随意计算任意位字符串和任意间隔张数的初始牌序了。再进一步,您还可以举一反三,将此破解原理运用到其它应用程序中。

由扑克游戏引出的字符串加(解)密技术
程序清单:
Dim a(13), b(13)
Private Sub Command1_Click()
Text1.Text = ''
n = 13
For i = 1 To 13
a(i) = n
n = n - 1
Next i

g = Val(Combo1.Text)
For k = 1 To 12
For j = 1 To g
For i = 1 To k
a(0) = a(i)
a(i) = a(i + 1)
a(i + 1) = a(0)
Next i
Next j
Next k

For i = 1 To 13
b(i) = Str(a(i))
If a(i) = 1 Then b(i) = ' A'
If a(i) = 11 Then b(i) = ' J'
If a(i) = 12 Then b(i) = ' Q'
If a(i) = 13 Then b(i) = ' K'
Text1.Text = Text1.Text + b(i) + ' '
Next i
End Sub

Private Sub Form_Load()
For i = 1 To 100
Combo1.AddItem (i) '为“倒牌间隔张数列表”赋值
Next i
Combo1.ListIndex = 0
End Sub
扑克倒牌游戏1至100间隔的初始排列表
倒牌间
隔张数
1 10 6 K 5 9 4 J 3 8 2 Q A 7
2 K 4 7 9 3 Q 6 2 10 8 A 5 J
3 J 3 9 10 5 2 7 Q K A 4 8 6
4 8 9 Q 2 6 4 J K A 7 10 3 5
5 4 2 8 Q K 5 10 A 3 J 6 9 7
6 5 8 6 7 3 10 A K Q 4 9 J 2
7 K 3 8 J 4 A 7 5 6 Q 2 9 10
8 4 5 K Q A 8 10 9 2 7 J 3 6
9 7 10 Q A 6 8 2 5 3 4 9 K J
10 5 J A 4 2 3 7 9 8 K 6 10 Q
11 3 A 2 K 6 9 10 7 5 8 J 4 Q
12 A J 10 5 9 K Q 4 6 8 3 7 2
13 K 6 7 4 9 J Q 3 10 5 2 8 A
14 8 9 Q 5 3 7 6 10 2 J K A 4
15 9 3 8

我的更多文章

下载客户端阅读体验更佳

APP专享