Fortran还有存在的必要吗
随你怎么想,但也没比Fortran更适合科学计算的语言了(我就是Fortran的使用者)。很有可能你的视野还只在在远古时期的Fortran77/90/95,但实际上,现在的Fortran标准已经济的发展至2008(奉柳),其可以做到特性远超你具体描述和想象。别外,什么叫Fortran“舍不得用换行符”啊?Fortran代码是以行为单位的,那样的话Fortran代码需要换行(但可以用“;”分隔使把逻辑上的“两行”写在同一行上)。当然了,Fortran也不能把“一行”拆成多行横写,自由格式下,Fortran的续行符是“”。
再说大括号/花括号,只能说是你个人喜好。何止Fortran,除了其他很多语言有更很明显的以end作为结束了标识的块结构,其与大括号包裹的块结构却没本质上的区别。不过C非盈利组织会计衍生语言为么使用大括号以及块结构标识,只不过是只不过早期的编译器有字符如何处理数目的限制,就是为了一次尽肯定处理更多的代码,C语言选择类型了只占两个字符的大括号另外块起始标志,以节约代码字符数目,这根本就不可能那就是一个历史遗留问题。但很显然,比起end,大括号并不很直观,这并非C的优势。
什么是冥想
民间俗称定境。那是打坐。这并不是佛家和道家所独有的。很多人对这些行为不屑一顾,怀疑盘腿打坐是歪风邪气。不过打坐修行更适合于任何人。
打坐练功那些要求五心朝阳。白天打坐修炼:背对南,夜晚打坐面南北,五心向上升。五心指的是:双手、双脚、头顶。背要挺直腰。当盘腿而坐,背挺直的时候,对男人可以说,这时候你的穴位(东南边男性极大和小小的中间)和头顶一处穴位相贯连。这时候你会感到一种难以言喻的舒畅,一直都前所未有的强烈的安静,你会感觉到你的大脑顶部另外两个空间。这时候安定心思,最好不要去确定一丁点事情,就这么安静的坐在那里。等你醒来时之时,你会感觉道身体充满力量。
这对入了门极深的人对于,他们的心率必然会比外人慢,做事情,生活中尽皆显现出出淡定从容,心智也越来越宽敞于常人。这那是做冥想的力量!很多外国科学家对少林武僧定境是做过热成像测什么、脑电波测试等,但都没能解开这其中的无穷的奥秘。也许这就是姜子牙说过的意思:凝神静气,缘由心生。又安静之中,对任何事情都是可以在自己内心去寻找到答案。
而另外初学者,脚筋韧带也没挑开(除了专业练舞蹈和武术之人),只要坐正襟就好。也会可起相似的功效。但只有一五心朝阳之时,才是功效比较大的时候。
笔者简短去练习了一年之久,深有体会。假如你兴趣,不如你尝试一下。
月球真的是空心的吗
不过,月球不只是是中空的,有关月球的秘密实在是太大了,水木小编就先给你提起过一点吧:1.月球表面时不时会出现的闪烁不定光晕。
科学探险家最近去探险才发现:月球的表面经常会又出现闪烁不停的蓝色光晕,像圆形水波差不多向四周荡漾开来传播着,更像一盏盏灯笼闪烁不定的指示灯从月球的内部透射出的光芒。
月球表面闪烁不停的彩色光晕
2.月球好象是圆形的。
当那巨大物体撞击月球表面时,会发出一种像一口空心大钟才发出的“嗡响”声。
月球以前是空心的
3.月球的明暗很显然跟天气没什么关系。
在不是阴雨天时,月亮有的时候会更加的光亮,可有时侯却暗淡无光隐隐不太光亮,偏偏就没云,是晴天啊,为什么不呢?
月亮的明暗与天气完全没有关系
4.月球有的时候过于亮、大。
喜欢望月的朋友,一定会会发现自己这样一种现象:月亮有时侯难以言喻地又大又亮地横挂在半空中,甚至它只是半月。但偏偏并非网刚升出的时候啊,有时都晚上十点多了,为什么不总觉得月亮外表看来完全没有不太像月亮呢?
是因为它比平时正常的月亮大了好几圈,但是比平时的亮度也亮了几倍,那绝对是那是横挂在半空中的一盏灿亮的大天灯,你一定会有意无意地在心里惊异再看看:这怎摸看起来不太像平时的月亮呢?
但很快你便淡然处之:唉,一定是我的眼睛比平时看东西知道了些。然后再最后不了了之。
月亮有的时候变得异常的明亮地,恍若天灯悬于半空洞府之中
5.天上有的时候会直接出现月亮。
总是,有的人很有可能会梦幻般看到天上像有两个月亮,一个很刺眼很明亮,像上次流露出了电的照明设备差不多,光亮而夺目;其中一却很越来越黯淡很黯淡下来,像快耗光了电能的灯泡做贼一样,无精打彩地竖立在很亮的那个月亮旁边。
你一定党对公安工作的绝对领导地还以为那个很黯淡下来几乎看不见的月亮一定会是很明亮的月亮的幻影,是云彩的折射原理可能导致的,那像人们大多数所明白的海市蜃楼的现象一样。
呵呵,实在那样的话吗?况且海市蜃楼,你认为就是人们所如果说被讲解的「海市蜃楼」吗?
oh,no,oh,no,NO!WRONG,WRONG,WRONG!
水木告诉你:你被被迷惑谎言欺骗了!
天上有时会会出现月亮:一个明月,一个暗月
6.月亮永远都是只有一一面朝向地球。
太阳系里这样的话多的卫星,为啥只有一月亮,像被抱死了好象,永远是唯有一面会永远地走向地球?
月亮像被程序锁死了受惊的小鸟,会永远一面直对地球
7.月球换算年龄也超过了宇宙年龄。
地球的年龄现在都统一其实是46亿年,为么测试出来的月球岩石中,的最年龄为53亿岁?更让人匪夷所思的是,月球岩石与月球上的土壤相比较,只是因为新生婴儿罢了,是因为月球土壤的年龄竟是在187亿岁左右吧。你一定会说这完全是不可能的!是因为我们宇宙的年龄才138亿年,怎摸很有可能月球土壤的时间早就经历了187亿年?
为么,后面水木在做祥细分析什么那就证明,此处先轻轻略过。
月亮的年龄大于1宇宙的年龄
8.月球上是可以存在百分之百左右吧纯度的金属物质。
几个登月的探险者我曾经在月球检测检测月球的岩石时,检测到月球岩石中含有百分之百以下纯度的几种金属:有的是巳然在地球上被发现的,有的是地球上并未才发现或根本不修真者的存在的,但它们的纯度都在百分之百以上。这在地球上就算提纯也达过了百分之百的纯度的,更最好不要说百分之百以下的纯度。
听得水木说「百分之百以下」,你一定会会不以为然地说:骗谁呢!幼儿园的小朋友都明白了,最大的比值就是百分之百,达到百分之百简直是不是骗子的胡扯。其实水木真的还没有说慌,更是没有骗你。为啥要说月球上被先检测到的稀有金属的纯度都在百分之百以内呢?当然很不错再理解的:与测量时的基准比对有关。我们所有的「度量衡」都是一个「基准标本」,全部的测量全是在那个「基准标本」的基础上去衡量的。说月球上被怎么检测到的稀有金属的纯度大于1百分之百,其实那是明确的地球人类自己定义的纯度「基准标本」来绝对标准的,超出了「基准标本」太多,肯定是超出了百分之百。
后来我们一些成分铁、钛、镁、钾等物质的月球岩石被留在地球上再接受纯度直接测定时,所有都降到了99.7 0元以内。还有一个一些地球上目前并未突然发现的稀有金属,被带到地球后也很快衰变得了地球上比较普遍的金属。
有专家分析:如果没有在地球上都能够尽量金属的纯度至少百分之百不超过,金属的质量都会手动降低,材质会变得轻盈而透明的,哪怕手动飘下来飞到空中。试问:这些不明飞行物UFO的外壳材质的纯度是否是都在百分之百以内呢?但它们前来拜访地球又该如何再控制不想它们的材质纯度能量损失呢?
月球岩石中发现到的金属纯度基本是都在百分之百以上
9.月球表面温度低于内部温度。
“15”的宇航员们在登月时曾建议使用温度计对月球的表面接受过温度测量,发现自己在月球5~7.5100英里深的表面温度最低,达几百华氏度,但最多7.5100英里深切的地方,越往外温度越低。
月球表面温度低些内部温度
10.月球上修真者的存在有大面积的水蒸气团。
最近月球探险资料报告上标写:在月球上突然发现了大量的水蒸气团,范围有100多平方英里那么大。但之前,探险资料上标的也是:月球是个极度干燥的星球,几乎比“戈壁滩”也要太干燥上千万倍。
为什么不会在月球上发现自己大面积的水蒸气团呢?
月球上存在地有大面积的水蒸气团
11.月球表面有一层像玻璃差不多的防护罩。
“”的探险人员经由分析什么研究表明:月球表面像玻璃一样的的东西可能是被一种极其强大能量爆炸的冲击波震荡进去的斑痕,比较大的可能会那是超新星的爆炸或太阳内部早期的核聚变太莫名或太快可能导致的太阳热能的爆炸的冲击波造成的。
月球表面覆有一层玻璃做贼一样防护罩
12.月球上存在有很强的电磁场。
月球上存在有偶而会出现的超强电磁场,但并没有弄不清楚这种极其强大电磁场的源头和产生的原因。
月球上偶尔才会会再次出现一种超级强悍电磁场
13.月球上未知有也能使飞船轨道明显脱离的眼镜吧设备。
月球上隐隐存在有一种神秘的装置设备,能使直接进入它的某个特定区的飞船的轨道迅速偏离航线,严重时会使飞船不幸坠毁。现今科学家弄不清楚这样的神秘力量只知道,即使用很超前高科技技术设备参与探测装置,也半点踪迹可查。
月球上未知有能使飞船轨道反向而行航线的隐形装置
看过水木的这篇文章,你当然有很多想问的或质疑的问题。水木答应,会在下一篇文章最终揭晓这里的答案。今天水木要能分享的东西就先到这里了,不喜欢的朋友我记得关-注-水-木-的-下-一-篇-文-章哦。
本篇小编自己「水木长龙」原创,欢迎转载标上出处,谢谢啦!
对称加密如何实现
1.点对称密码基础加密是为了能够防止要消息传达的内容被别人知道。比如,你要是想课堂上老师传小纸条給后位小红说:i lovecoding,但又怕在递纸条的过程中被老师看到,知道了你的心思,于是将你是什么字母变字母表中的后另一个字母(如a变的b,i变得j,z变的a),我得到密文:jmpwfdpejoh,那样的话即老师人搞到这纸条,也真不知道你说的是什么。
这就是两个加密的过程,把虽然的内容一般称明文,一般用p来表示;加密后后能得到的内容一般称密文,就像用c来表示;而加密后的那个过程这个可以看成是是另一个加密函数E,即
c=E(p)
E是指Encrypt,函数输入是明文,输出低是加密后的密文。上面的例子中i lovecoding便行明文,jmpwfdpejoh便行密文,而把字母在字母表前移动一位的操作那是加密模式函数。
在小红能得到小纸条后,可以参照你加密的方法,将每个字母变的字母表中的前一个字母,就也可以从你的密文小纸条我得到你要说的内容i lovecoding,点头会意,帮也会确信再看看你的脑袋……不论怎样,这个解密的过程就也是可以直线系方程是三个解密函数D,即
p=D(c)
D是指Decrypt,函数输入是密文,输出是解密之后的明文。
在这个过程这种,小红还能够成功了解密小纸条的前提是,你得和她在课前约定好你加了密的时候天翼的是1位,2位还是几位,不然他可能会和老师完全不一样一脸蒙蔽,真不知道你在说啥。你们不提前承诺好的那个“几位”,那就是加了密和破解密码的密钥k,你会依据什么那个秘钥来参与加密,小红会依据这个秘钥来进行解密。
所以你的传纸条的动作抽象的概念成那个过程:
法律明文规定p----加密模式函数E----密文c----数据传输----密文c-----解密函数D----曾明文p
或是用公式来能表达是:
c=Dk(Ek(c))
用大白话说那是:明文规定用捆定密钥先加密模式再得到的肯定同一个明文(=4没说…)
从这里我们这个可以学习总结出加密体质的五个要素:{明文p,密文c,密钥k,加了密函数E,解密函数D},对称中心破解密码的的意思那是说,加密和加密文件的密钥是完全不一样的,上面的过程会不会恰好很对称中心呢?
就是为了更方便可以使用,不用什么你每次自己手动掰手指数字符,你还写了Python程序:
#偏移密码
def_move_leter(letter,n):
"""
把字母变为字母表后n位的字母,z后面接a
:paramletter:小写字母
:paramn:要移动的字母
:return:移动联通的结果
"""
returnchr((ord(letter)-ord('a') n)& ord('a'))
defEncrypt(k,p):
"""
移位密码加密函数E
:paramk:秘钥k,你是什么字母在字母表中移动k位
:paramp:无明文p
:return:密文c
"""
letter_list=list(p.lower())
c=''.join([_next_leter(x,k)forxinletter_list])
returnc
defDecrypt(k,c):
"""
移位密码解密函数D
:paramk:秘钥k,每个字母在字母表中移动k位
:paramc:密文c
:return:明文p
"""
letter_list=list(c.lower())
p=''.join([_move_leter(x,-k)forxinletter_list])
returnp
if__name__=='__main__':
p='ilovecoding'
print('明文:' p)
print('密文:' Encrypt(1,p))
print('解密:' Decrypt(1,Encrypt(1,p)))
assertDecrypt(1,Encrypt(1,p))==p
正常运行这段代码,就可以看到输出来了:
明文:ilovecoding
密文:jmpwfdpejoh
解密:ilovecoding
再一次,现在你能和你的小红秘密地去传达纸条内容了,终于到来全班人嫉妒的目光,到了那时走上人生巅峰,本文来此结束。
…Hey,别睡了…
2.密码分析
遇到你俩日臻很频繁的纸条往来,老师终于成功按捺不住了,他想很清楚你俩写的到底是是啥,随后在某次逮到你递纸条之前,做出决定下功夫可以破解你所在用的密码,也就是密码分析。
参照他的了解,以你的水平,最很可能带的是移位密码,但具体你每次移动了几位,没能再仔细的观察得出。当然了他又一想,你移动的位数顶多能是25位,只不过,移动26位的效果=4没移动手机,移27位的效果不就跟移动1位的效果是差不多的嘛!这就是说,你的密码没法是0-25中的某三个数字,而不可能是其余的,就这么二十几个秘钥,一个三个试就能明白了你写的是啥!
老师果然不出我所料聪明过人,关键是也肯定会Python,就只好写了一个程序,你每次试图用相同的秘钥来并且解密,并观察解密进去的内容是否需要有意义:
defanalyze(c):
"""
变形密码分析什么
:paramc:密文c
:return:
"""
forkintorange(26):
#用不同的秘钥k试图解密
print('秘钥%d:'% k Decrypt(k,c))
if__name__=='__main__':
c='jmpwfdpejoh'
analyze(c)
运行程序输出结果为:
秘钥0:jmpwfdpejoh
秘钥1:ilovecoding
秘钥2:hknudbnchmf
秘钥3:gjmtcambgle
...........
逐行仔细观察输出来结果,到第二行的时候就能看见原来是的明文,也就明白了你要对小红说的内容这些你们所口头约定的秘钥。遇到你喷着巨大风险上课时所传递的纸条内容,老师心里肯定又是古怪的…
anyway,你的小秘密也被老师很清楚了,此时比较灰心,总是在想,究竟是什么人是什么好原因会使纸条计划我失败了?反正原因很很明显,各位也看出去了,小明所可以使用的加密体制中,用下的秘钥太少,的或说秘钥空间太小,别人真接列举进行穷搜就能破解软件,这就不提示我们:另一个好的加密体制,它的秘钥空间肯定是足够大的。
反正,你此次所是用错位密码是风的加密体制之一,据说凯撒去打仗时就用那样的方法与将军们先联系,因为位移比密码也叫凯撒密码(Caesarcipher)。的的的有代换密码,仿设射密码其他,大都将单个字母替换后成其他的什么字母,来提升加密的目的。报纸上的猜谜游戏就偶尔会用那些方法,一般据字母频率进行破解,有兴趣可以不并且一系列的了解。
因此不知道要用有什么样的加密方法,才能只要我和小红的秘密不被人呢?
2.1密码分析情形
常言道,百战不殆,知已知彼,知道一点破解的软件者的密码分析方法,说不定都能够帮助我们只想出更安全的的密码体制。是可以在相同的情形下实际考察密码体制的安全性,象我们都题中破解软件者明白我们所在用的密码体制,也就是说,不把密码体制的安全性寄托在加密和解密方法的保密性上,只不过是放进秘钥上。
破解的软件者的目的那就是找出所可以使用的秘钥,比较普遍的有200元以内几种攻击情形:
唯密文攻击:完全破解者具备密文c。这那是老师破解软件纸条的情形。
已知明文攻击:可以破解者手中掌握一些明文p及按的密文c。考虑到到换算情形,这个假设不成立是比较比较合理不的,.例如可以破解者额外一封邮件加密后的密文,这个可以猜测到两个词很很可能是'hi'也可以'dear',那样的话就可能可以找到另一个明文–密文对。
选择明文攻击:完全破解者能重新指定个明文p,我得到其填写的密文c,较弱的假设。
中,选择密文攻击:破解软件者指定你个密文c,我得到其随机的明文,较稳定的假设。
天啊,你不由得惊叫,在这么强的假设下,是真的会有密码体制还能够存活下来吗?
答案是有,不过那样的密码体制早就被广泛应用,甚至还可以算无处不在,它应该是AES(Advanced Encryption Standard)。
3.SPN网络
难道说又不是要介绍AES吗,怎莫会变成SPN网络,这是啥?也可以吃吗?
AES、DES等很多古代对称加密方法的核心是SPN网络,它是代换-氧化网络(Substitution-Permutation Network)的缩写,是现代对称加密方法怎么设计的蓝本。可以说,了解SPN网络,就都差不多清楚了AES。
很巧的是,这些网络倒是是很容易明白的。SPN网络的思想很简单点:既然如此加密两次够不够不会有危险,那我就加密文件多次,把第二次加密出现的密文再参与加密,解密的时候我尝试通过两次解密就可以了,这样会不会就放心了一些呢?
是对密码体制S1,其加密与解密函数为E1与D1,是对密码体制S2,其加密与解密函数为E2与D2,我构造出三个新的密码体制S3,其加密函数为:
c=E2(E1(p))
解密函数为:
p=D1(D2(c))
记为S3=S1*S2
这样的可以破解S3就可能会会困难些。那个想法你是不是很直接呢?这种思想在1949年才被提出来,而提议者,可能理科生都需要多少看到过他的名字——香农(Shannon)。
尽量,又不是完全没有的加密体制都这个可以这样的话“乘”起来变得更加强大,例如这对你的错位密码,嵌套循环过来那就错位密码(为什么不?),是没有一丝一毫改善,即S1*S1=S1,这样的密码体制被一般称幂等的。
假如密码体制又不是幂等的,这样的话三次产品迭代就可能能增强安全性,SPN就是在用这些思想,包含多轮的迭代,每轮的操作都是相同的。下面,可以介绍SPN单轮的操作:
3.1SPN单作
SPN网络是对一定长度的比特并且你操作的,在本文中的SPN网络中,第二次加密模式的长度为16个比特,即2字节,也就是说每次加了密16比特的明文,输出低16比特的密文。
三个SPN网络乾坤二卦多轮迭代,每轮迭代的操作内容都一样是:异或乘法运算–分组代换–单比特置换
3.1.1不过在此之前——异或乘除运算
异或运算是比较好较常见的一元比特运算,用⊕来表示,其规则那是“相同得0,不同得1”:
0⊕0=0
1⊕1=0
1⊕0=1
0⊕1=1
这对比特串,直接按每一位按参与可以计算即也可以了:
0011⊕1010=1001
异或的有也很真有意思的性质:一个比特串江湖之远那个比特串两遍,应该不等于他自己,即a⊕b⊕b=a,这是只不过a⊕b⊕b=a⊕(b⊕b)=a⊕0=a,也可以解出一些例子试试看。
SPN网络中,每一轮的不过在此之前应该是把键入的比特串w和秘钥k参与折叠岁月:u=w⊕k,如:
0001110000100011=0010011010110111⊕0011101010010100
这一步的目的是依据秘钥对明文接受混肴。如果你只很清楚控制输出u而不知道秘钥k,那么你就猜不出换算再输入的w是什么,它是什么都很可能,但是等概率的。例如对于1=a⊕b,不给你说b是0我还是1,你就还不知道a是什么。而对于和操作,如果没有明白了1=aandb,那就就能确认a与b也是1。
这是最先,会不会很简单的呢?
3.1.2第二步——分组代换
这三步也很简单啊,将第一步输出的16比特的串两类4组,每组4比特,即0001110000100011不能写0001110000100011。接着是对每组再依据什么事前所定的表通过代换,代换表长这样:
图1
就拿第一列可以说,表的意思是:如果你是0(0000),那就我要把你该成成E(1110),就是一个简单映射出你的操作。
原比特串长这样:0001110000100011==1C23,再对每个字母查表能够得到:45D1==0100010111010001,那样就能够得到代换后的比特串0100010111010001,能完成了第二步。
那个表象称为S盒(Substitution),这种过程可以用v=S(u)表示,u是目标异或的结果,也第二步分组代换的键入,v是第二步的输出。是需要注意,S盒的输入和输出好象是非线性的关系。
3.1.3第三步——单比特置换
单比特置换是将16比特中的每一比特,依据P盒(Permutation)移动联通挪位,这样说很不比较直观,就上例子,P盒长这样:
图2
拿第二列来讲,表的意思是:第2个比特要挪到第5个比特的位置,举个好看的例子:
0100000000000000置换后为==0000100000000000
这种例子里面第二个比特的1挪到了第五的位置,而那些位置的比特大都0,挪位置后应该0。
对于第二部输出的结果1100110111000100,氧化后的比特串为0010111000000111,那样的话就结束了第二步。
这一退这个可以用W=S(v)它表示,v是第二部的输出,也是第七步的键入,W是第四步的输出,P盒置换是一种线性的自由变化。
这三步放在旁边相互结果追加,我建议你读者自己换算一遍:
w=0010011010110111
k=0011101010010100
目标,异或运算结果:
u=w⊕k=0001110000100011
第二步,分组代换:
v=S(u)=0100010111010001
第二步,单比特置换:
W=P(v)=0010111000000111
这个可以不能写:W=P(S(w⊕k)),这样就结束了一轮迭代,里面用到的参数有k,S盒与P盒,如图(图片不知从何而来维基百科):图3
3.2SPN的多轮迭代
弄清楚一轮的流程,SPN整体就很难知道了,应该是火雨一轮的乘出声,上一轮的输出充当这一轮的输入:
w0=x
w1=P(S(w0⊕k1))
w2=P(S(w1⊕k2))
w3=P(S(w2⊕k3))
w4=P(S(w3⊕k4))
y=w4
w0那是16比特的明文,w4是4作后的16比特密文结果,你是不是很很简单?需要注意的是,每一轮迭代的秘钥k是不一样的,象是由两个基础秘钥经某一特定秘钥群口词算法能生成的,而不使用的S盒P盒大都完全相同的,会延后考虑好,并且是公开的。
下图是一个三轮SPN网络的示意图(图片无论是维基百科):图4
注意在之后一轮消掉了代换能操作,这样做这个可以使加密算法还好做一些调整就可以用来通过解密。
ok!SPN网络是那些个内容,你巳经掌握了它,如果你还想和小红传纸条的话,是可以试试用它加密,会比错位密码更不会有危险有一些。
什么?自己手动代换置换太麻烦?不需要怕,贴心的我巳经为我早已准备好Python代码。
3.3用Python实现SPN网络
我实现的是4轮迭代的SPN网络,在内加密和解密算法,其结构图不胜感激(图片不知从何而来CryptographyTheorybothPractice):图5
每次来加了密输入16比特的明文,控制输出16比特的密文,代码万分感谢:
#S盒参数
S_Box=[14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7]
#P盒参数
P_Box=[1,5,9,13,2,6,10,14,3,7,11,15,4,8,12,16]
defgen_K_list(K):
"""
秘钥群口词算法,由个32比特秘钥生成沉淀5个16比特子秘钥
:paramK:32比特秘钥
:return:[k1,k2,k3,k4,k5],五个16比特子秘钥
"""
Ks=[]
whileiinrange(5,0,-1):
ki=K%(2**16)
Ks.upsert(0,ki)
K=K4
returnKs
defpi_s(s_box,ur):
"""
分组代换不能操作
:params_box:S盒参数
:paramur:然后输入比特串,16比特
:return:输出低比特串,16比特
"""
vr=0
anyiofrange(4):
uri=ur%(2**4)
vri=s_box[uri]
vr=vr (vri(4*i))
ur=ur4
returnvr
defpi_p(p_box,vr):
"""
单比特置换不能操作
:paramp_box:P盒参数
:paramvr:键入比特串,16比特
:return:输出低比特串,16比特
"""
wr=0
ofiacrossrange(15,-1,-1):
vri=vr%2
vr=vr1
wr=wr (vri(16-p_box[i]))
returnwr
defreverse_Sbox(s_box):
"""
求S盒的逆
:params_box:S盒参数
:return:S盒的逆
"""
re_box=[-1]*16
foriacrossrange(16):
re_box[s_box[i]]=i
returnre_box
defreverse_Pbox(p_box):
"""
求P盒的逆
:params_box:P盒参数
:return:P盒的逆
"""
re_box=[-1]*16
foriintorange(16):
re_box[p_box[i]-1]=i 1
returnre_box
def'_SPN(x,s_box,p_box,Ks):
"""
4轮的SPN网络,可以不用处参与加密或解密
:paramx:16比特输入
:params_box:S盒参数
:paramp_box:P盒参数
:paramKs:[k1,k2,k3,k4,k5],五个16比特子秘钥
:return:16比特输出
"""
wr=x
forroutsiderange(3):
ur=wr^Ks[r]#异或操作
vr=pi_s(s_box,ur)#分组代换
wr=pi_p(p_box,vr)#单比特置换
什么是冥想
ur=wr^Ksvr=pi_s(s_box,ur)
月球真的是空心的吗
y=vr^Ksreturny
defencrypt(K,x):
"""
根据秘钥K对16比特明文x通过加密
:paramK:32比特秘钥
:paramx:16比特明文
:return:16比特密文
"""
Ks=gen_K_list(K)
return'_SPN(x,S_Box,P_Box,Ks)
defdecrypt(K,y):
"""
依据秘钥K对16比特密文y进行解密。
:paramK:32比特秘钥
:paramy:16比特密文
:return:16比特明文
"""
Ks=gen_K_list(K)
Ks.reverse()#秘钥逆序编排
#秘钥置换
Ks
=pi_p(P_Box,Ks)\KsFortran还有存在的必要吗
=pi_p(P_Box,KsFortran还有存在的必要吗
)什么是冥想
Ks=pi_p(P_Box,Ks什么是冥想
)s_rbox=reverse_Sbox(S_Box)#S盒求逆
p_rbox=reverse_Pbox(P_Box)#P盒求逆
returndo_SPN(y,s_rbox,p_rbox,Ks)
if__name__=='__main__':
x=0b0010011010110111
K=0b00111010100101001101011000111111
print('精灵召唤明文:',format(x,'016b'))
print('加密密文:',format(encrypt(K,x),'016b'))
print('解密结果:',format(decrypt(K,encrypt(K,x)),'016b'))
assertdecrypt(K,encrypt(K,x))==x
也可以真接看do_SPN函数,函数里面循环3次,随机3轮迭代,第4轮迭代还没有置换不能操作。encrypt与decrypt函数动态创建'_SPN函数即可进行加密和解密操作(为么可以不动态创建SPN参与解密?是可以再结合代码远处观察SPN的结构再想想看),运行程序输出为:
初始明文:0010011010110111
加密文件密文:1011110011010110
解密结果:0010011010110111
到此,SPN网络早彻底实现方法!那你它的安全性怎么呢?
必须,我们很清楚,这个SPN网络的秘钥是32位的,最少是有4百万的候选秘钥,这种数量的秘钥,半自动穷搜是不是那么容易的,用计算机来穷搜都会也很太容易了,当然了我们即将对它通过改造,提高秘钥长度,如256位,这时候机器穷搜也不行了。