博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kotlin探究之旅--凯撒加密
阅读量:5887 次
发布时间:2019-06-19

本文共 3882 字,大约阅读时间需要 12 分钟。

前面有讲过三篇的kotlin基础,相信看过那三篇的同学对kotlin的基础语法基本都有了一个大概的认识,如果认真研究研究,想必也可以熟练的应用kotlin敲代码了。

从这篇开始,主要开始kotlin的实践应用,利用kotlin的语法去实现加密算法,加密算法可以说是一个系列文章,公众号每天会更新一个加密算法,看完这篇,不仅可以让你对凯撒加密算法有一个新的认识,还可以带你去学习kotlin的具体实现,相信你一定会爱上kotlin这门语言的。

加密算法一般分为:

对称加密:DES AES 凯撒加密

非对称加密:RSA

消息摘要:md5 sha1 sha256

数字签名:SHA256withRSA

加密算法一般会用到到ASCII码:

ASCII:美国信息交换标准代码,是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。

对照着上面的表,我们先定义一个字符串,然后打印它的ASCII码,看看会运行出什么结果。

fun main(args: Array
) {
    //获取字符ASCILL编码     val str=" i love you"     val toCharArray = str.toCharArray()     val result = with(StringBuilder()){
        for (ch in toCharArray){
            val result = ch.toInt()             append(result.toString()+" ")         }         toString()     }     println(result) } 复制代码

运行结果如下

可以看到运行后的结果是一串数字,小伙伴们可以对照上面的ascii码表,看看是否能对的上。

上面代码中,我们还用到了一个kotlin的高级函数,with()

fun with(receiver: T, block: T.() -> R): R = receiver.block() 复制代码

with函数是将某对象作为函数的参数。

在函数块内可以通过 this 指代该对象。返回值为函数块的最后一行或指定return表达式。

关于kotlin的高级函数的更多用法,可以看公众号中的这篇文章

https://mp.weixin.qq.com/s/ogg6y2bZYtcqcAvbjl-cjg

好了,学完ASCII码和with()函数后,就让我们一起来实现以下凯撒加密和解密算法吧!

凯撒算法的原理:把字符移动一定的位数来实现加密和解密:

加密

fun main(args: Array
) {
    val cryptresult=with(StringBuilder()){
        //秘钥         val key=2         //要加密的字符串         val command="I love you"         //将字符串转换成为字符数组         val charArray=command.toCharArray()         charArray.forEach {
            //遍历每一个字符,获取ascii码             var ascii = it.toInt()             //对ascii进行偏移运算             ascii+=key             //ascii转成加密后的字符             val result=ascii.toChar()             //将加密后的字符拼接进stringbuild中             append(result)         }         //返回stringbuild的tostring值         toString()     }     print(cryptresult) } 复制代码

打印加密后的结果

可以看到,通过对字符串对应ascii码的偏移运算后,打印出来的字符和我们定义的字符串已经相差十万八千里了,是不是很神奇。

解密

fun main(args: Array
) {
//解密     val decryptresult=with(StringBuilder()){
        //秘钥         val key=2         //将先前机密后的字符串转换成为字符数组         val charArray=cryptresult.toCharArray()         charArray.forEach {
            //遍历每一个字符,获取ascii码             var ascii = it.toInt()             //对ascii进行反偏移运算             ascii-=key             //ascii转成解密后的字符             val result=ascii.toChar()             //将加密后的字符拼接进stringbuild中             append(result)         }         //返回stringbuild的tostring值         toString()     }     println(decryptresult) } 复制代码

打印结果

可以看到,解密的代码和加密的代码几乎差不多,唯一不同的是,加密时,是将字符的ascii码与秘钥key进行相加偏移,而解密时,则是进行相反的偏移。

好了,下面是用kotlin实现的凯撒加密的完整代码:

fun main(args: Array
) {
    val cryptresult=with(StringBuilder()){
        //秘钥         val key=2         //要加密的字符串         val command="I love you"         //将字符串转换成为字符数组         val charArray=command.toCharArray()         charArray.forEach {
            //遍历每一个字符,获取ascii码             var ascii = it.toInt()             //对ascii进行偏移运算             ascii+=key             //ascii转成加密后的字符             val result=ascii.toChar()             //将加密后的字符拼接进stringbuild中             append(result)         }         //返回stringbuild的tostring值         toString()     }     println(cryptresult)     //解密     val decryptresult=with(StringBuilder()){
        //秘钥         val key=2         //将字符串转换成为字符数组         val charArray=cryptresult.toCharArray()         charArray.forEach {
            //遍历每一个字符,获取ascii码             var ascii = it.toInt()             //对ascii进行反偏移运算             ascii-=key             //ascii转成加密后的字符             val result=ascii.toChar()             //将加密后的字符拼接进stringbuild中             append(result)         }         //返回stringbuild的tostring值         toString()     }     println(decryptresult) } 复制代码

完整代码运行的结果

代码很简单,你学会了吗,上面的代码中的加密和解密算法,其实是可以单独抽取出来,进行封装的,勤劳的小伙伴们可以动手自己去实现了。

更多精彩内容,请随手关注 IT烟酒僧

这里有酒,也有故事,有代码,有人生,有眼前的苟且,也有诗和远方

天涯很远,时间很短。关注我们,每天进步一点点~

转载于:https://juejin.im/post/5bcc8cd5518825533c6802c2

你可能感兴趣的文章
彻底卸载删除微软Win10易升方法
查看>>
SWT/JFACE之环境配置(一)
查看>>
应用程序日志中总是说MS DTC无法正确处理DC 升级/降级事件,是什么意思
查看>>
mybatis数据处理的几种方式
查看>>
作业2
查看>>
远程主机探测技术FAQ集 - 扫描篇
查看>>
C++中调用python函数
查看>>
Nomad添加acl认证
查看>>
“TI门外汉”网路知识笔记一 OSI参考模型
查看>>
你不需要jQuery(五)
查看>>
DatanodeDescriptor说明
查看>>
ServlertContext
查看>>
Python WOL/WakeOnLan/网络唤醒数据包发送工具
查看>>
sizeof(long)
查看>>
pxe网络启动和GHOST网克
查看>>
2.5-saltstack配置apache
查看>>
django数据库中的时间格式与页面渲染出来的时间格式不一致的处理
查看>>
增强myEclipse的提示功能
查看>>
[翻译]Protocol Buffer 基础: C++
查看>>
runloop与线程的关系
查看>>