看过《斯巴达克斯》吗?里面的反派竟是密码学鼻祖
若有小伙伴让你推荐一部暴力、血腥、色情的美剧,很多人可能会推荐《斯巴达克斯》。斯巴达克斯和他的小伙伴们经过不懈的努力,一次又一次战胜前来镇压他们的军队,最终还是输给了克拉苏、庞培和凯撒。其实今天想说的是凯撒,因为最近在研究密码学相关知识,发现凯撒竟然是密码学鼻祖。据传,掌管军队的他曾创立了凯撒密码,这种方式当然也是为了加密作战信息。凯撒密码其实很简单,如下图2所示。凯撒密码是采用固定平移的方式,形成一个固定的对应关系,当决定平移为3时,那么a–D,b–E……以此类推,通过该种方式就可以将消息加密,对方解密也很容易,只需要按照事先约定好的平移数就可以反过来采用一一对应的方式得到原文。
利用Go语言来实现加密的过程也很容易,只需定义两个26字母的长字符串,然后按照平移位数来计算密文就可以了。参考代码如下。
package mainimport ("fmt""strings"
)var text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var bigtext = "abcdefghijklmnopqrstuvwxyz"
// 加密方法:data是原文,length代表平移位数
func Encode(length int, data string) string {var result []byteif length > len(text) {return ""}for _, v := range []byte(data) {//fmt.Printf("%d-%c\n", k, v)n := strings.IndexByte(bigtext, v) + lengthfmt.Println("n = ", n)if n >= 26 {n = n - 26}result = append(result, text[n])//fmt.Printf("%c\n", text[n])}fmt.Println("get:", string(result))return string(result)
}
凯撒密码的解密也很简单,同样是按照平移位数来一个反对应就可以了。
// 密文解密:data为密文,length为平移位数
func Decode(data string, length int) string {var result []byteif length > len(text) {return ""}for _, v := range []byte(data) {//fmt.Printf("%d-%c\n", k, v)n := strings.IndexByte(text, v) - length//fmt.Println("n = ", n)if n < 0 {n = n + 26}result = append(result, bigtext[n])//fmt.Printf("%c\n", text[n])}//fmt.Println("get:", string(result))return string(result)
}
最后,可以通过main函数来验证一下加密和解密的效果。
func main() {Encode(3, "yekai")fmt.Println(Decode("BHNDL", 3))
}
执行该代码,就可以看到加密和解密后的效果。
凯撒密码的原理已经了解了?如何破解呢?其实很简单,对于凯撒密码来说,使用的字典是明确的,唯一的变数是平移位数,因此,我们只要对平移位数进行暴力穷举,就总能找到答案。
for i := 0; i < 26; i++ {fmt.Printf("i = %d, result = %s\n", i, Decode("BHNDL", i))}
根据上述代码打印出来的结果,我们能够发现当平移位数为3的时候,打印的信息是:yekai,好像发现这个秘密了!
密码学在区块链系统中扮演着举足轻重的作用,如果小伙伴对区块链感兴趣,不妨关注本人,并留言。如果想学区块链+Go语言相关内容也可以购买此书。
看过《斯巴达克斯》吗?里面的反派竟是密码学鼻祖相关推荐
- Android加密 看雪,Android加密与解密入门两题
写在最前面 本次题目来自看雪2w班9月题.密码学一直是安全的基础,Android安全也不例外,这次9月份的题分别从java层和C层考察了密码学中常用的对称加密.hash函数以及一些基础的编码,但是不是 ...
- 响铃:从艾媒季度监测报告,看混战后在线音乐的稳态格局
文|曾响铃 来源|科技向令说(xiangling0815) 最近,知名新经济行业数据挖掘和分析机构iiMedia Research(艾媒咨询)权威发布<2018Q1中国手机音乐客户端季度监测报 ...
- 香港电影黄金配角,虽其貌不扬,演技却吊打小鲜肉,你认识几个
https://www.toutiao.com/a6709340231109181959/ 我们在看电影前,很多时候都会问是谁演的,虽说主演很重要,但是红花也少不了绿叶的衬托.在一部电影中,一名或者多 ...
- 现在的编译器还需要手动展开循环吗_一例 Go 编译器代码优化 bug 定位和修复解析...
缘起 某日,一位友人在群里招呼我,"看到有人给 Go 提了个编译器的 bug,挺有意思,感觉还挺严重的,要不要来看看?"于是我打开了 issue 40367 .彼时,最新一条评论是 ...
- 理解矩阵,矩阵背后的现实意义
https://blog.csdn.net/ecidevilin/article/details/79065949 原文链接(排版稍作调整) http://www.360doc.com/conten ...
- 李春雷 | 夜宿棚花村
汶川地震过后几天,我随中国作家小分队入蜀.集中活动后,我申请去重灾区的一个点上采访.于是,就结识了棚花村. 从成都出发,经广汉.德阳,再过绵竹.遵道.汽车沿着龟裂的公路,小心翼翼地颠簸爬行,不足百公里 ...
- 理解矩阵背后的现实意义
线性代数课程,无论你从行列式入手还是直接从矩阵入手,从一开始就充斥着莫名其妙.比如说,在全国一般工科院系教学中应用最广泛的同济线性代数教材(现在到了第四版),一上来就介绍逆序数这个"前无古人 ...
- 线性代数的本质(干货!)
原文链接:https://www.cnblogs.com/TenosDoIt/p/3214096.html 从大学开始接触矩阵论和线性代数,记了很多公式,但是总感觉徘徊在线性代数的门外没有进去,感觉并 ...
- 【转载】理解矩阵(一)
原文:理解矩阵(一) 前不久chensh出于不可告人的目的,要充当老师,教别人线性代数.于是我被揪住就线性代数中一些务虚性的问题与他讨论了几次.很明显,chensh觉得,要让自己在讲线性代数的时候不被 ...
最新文章
- html引入php文件中的函数,在b2core框架和simple_html_dom.php文件里面都有一个load()函数...
- UWP crop image control
- redis 的使用 (sort set排序集合类型操作)
- Java与C#平台通信 WCF CXF SOAP
- java程序优化快捷键_Java 代码中针对性能优化的总结方案
- Golang make chan 第二个参数(size)
- 佳能hdr_多方位升级 佳能发布数码单反相机新品EOS 850D
- Spring源码分析之BeanPostProcessor接口和BeanFactoryPostProcessor接口方法不执行原因分析
- 华为发布首款5G折叠机,价格一万七;ofo被冻结145万;苹果最早明年放弃英特尔 | 极客头条...
- 【spring】常用注解作用归纳
- yii2 配置文件加载顺序, 以及调用自定义配置信息。
- centos yum 国内源
- 调用Google翻译 语音接口
- 社招和校招有什么不同?阿里美团等大厂 JAVA 社招面经分享
- hdu - 1789 题解
- 页面布局基础——2.3
- HTML5仿五子棋游戏源码
- 悟空crm 进销存功能展示 配图
- Linux下树莓派spi编程
- PMSM FOC控制 Matlab/Simulink仿真 SVPWM算法