Kotlin加密/解密系列
(一)Kotlin加密/解密之ASCII码
前言
前面我介绍了使用kotlin获取字符的ASCII码。本章的内容就和ASCII码有关系,凯撒加密算法就是通过操作相关字符ASCII码向前或者向后移动一个位移量,使ASCII码变成其他字符的。比如A的ASCII码是97,向后移动一位就变成了98,显示出来就是B,也就是以前的原文是A,加密后就是B。以此来达到安全的目的,具体的凯撒加密算法让我们一起来看看吧。
一、什么是凯撒加密算法?
凯撒加密算法其实很简单,就是操作字符的ASCII码,获得原文的每一个字符后,对每个字符的ASCII做偏移,偏移后再转成字符,这样原文就被加密了。加密过程如下:
 解密其实就是加密的逆过程,这里的加密算法其实就是对称加密,只是密钥是一个偏移量,得到这个偏移量和规则(+,-,*,/)就可以解密。
二、kotlin 实现凯撒加密算法
1.凯撒加密算法
代码如下:
fun encrypt(content: String, key: Int): String {
val charArray = content.toCharArray()
val result = with(StringBuilder()) {
charArray.forEach {
val c = it
var ascii = c.code
ascii += key
val result = ascii.toChar()
append(result)
}
toString()
}
return result
}
2.凯撒解密
代码如下:
fun decrypt(encryptTxt: String, key: Int): String {
val charArray = encryptTxt.toCharArray()
val result = with(StringBuilder()) {
charArray.forEach {
val c = it
var ascii = c.code
ascii -= key
val result = ascii.toChar()
append(result)
}
toString()
}
return result
}
调试代码:
fun main() {
val command = "I love you"
val key = 1
val encrypt = CaesarCrypt().encrypt(command, key)
val decrypt = CaesarCrypt().decrypt(encrypt, key)
println("encrypt: $encrypt")
println("decrypt: $decrypt")
}
运行结果:

这里补充一个知识,kotlin 的with()函数的使用
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return receiver.block()
}
可以看到传入的是一个参数T,本文中传的是一个StringBuilder对象:另一个参数是一个匿名函数,参数是传入T的扩展函数,也就是StringBuilder中的可以调用的函数,如append(),toString 之类的函数,返回值是R,也就是最后一行的类型
val result = with(StringBuilder()) {
charArray.forEach {
val c = it
var ascii = c.code
ascii += key
val result = ascii.toChar()
append(result)
}
toString()
}
从上面的代码中可以看出,使用with函数可以减少很多代码,假如不使用with.在with{}的函数体中可以使用StringBuilder中的可调用的函数,就像咱们在Activity中可以直接使用startActivity()方法一样。非常方便
假如不使用with函数,那么如下所示
val charArray = command.toCharArray()
val stringBuilder = StringBuilder()
charArray.forEach {
val c = it
var ascii = c.code
ascii += key
val result = ascii.toChar()
stringBuilder.append(result)
}
stringBuilder.toString()
看起来代码就多了很多
总结
以上就是今天要讲的内容,本文仅仅简单介绍了凯撒算法的使用,但是凯撒算法很容易被破解,使用字符的频数分析法很容易破解,频数分析法感兴趣的小伙伴可以去网上看看,就是统计各个字符的出现频率,暴力获得解密的key,所以后面会介绍更安全的加密算法。下一章节见
|