对称加密:凯撒加密(位移),DES,AES

非对称加密:RSA

消息摘要:md5,sha1,sha256,数字签名

1.with高阶函数,可以接收一个对象作为参数,方法体里对参数对象进行操作,最后一行可以返回结果,再用参数接收。

2.凯撒加密 :把字母移动一个数字来实现的加密和界面。

3.对称加密

注意:中文DES加密后乱码,因为加密后的二进制数据在码表中找不到对应的字符,就会变成乱码,所以加密后再用Base64进行加密,Base64会在码表将每个字节找到对应的字符。解密时,先用Base64解密,再用DES解密。

4.DES和AES密钥长度 (8个字节,16个字节)

DES(56) 8Byte*8Bit=64位,最后一个字节是校验符,所以需要56Bit

AES(128) 16Byte*8Bit = 128位

5.算法/工作模式/填充模式

注意://CBC工作模式需要三个参数 IvParameterSpec

cipher.init(Cipher.ENCRYPT_MODE, key,IvParameterSpec(password.toByteArray()))

6.应用场景:android缓存到本地的数据加密

可逆的,可以使用对称加密(或者非对称RSA)

DES和AES: 优先使用AES, 安全系数更高

7.非对称加密

为什么要互换公钥???这样双方才可以交流吧,

8.如何生成RSA密钥对

//如何生成密钥对
val generator = KeyPairGenerator.getInstance("RSA")
val keyPair = generator.genKeyPair()//生成密钥对
val publicKey = keyPair.public//公钥
val privateKey = keyPair.private//私钥

println("publicKey="+ Base64.getEncoder().encodeToString(publicKey.encoded))

println("privateKey="+Base64.getEncoder().encodeToString(privateKey.encoded))

9.RSA非对称加密, 示例:

import java.io.ByteArrayOutputStream
import java.security.KeyPairGenerator
import java.security.PrivateKey
import java.security.PublicKey
import java.util.*
import javax.crypto.Cipher/*** 非对称加密RSA加密和解密*/
object RSACrypt {private val transformation = "RSA"private val ENCRYPT_MAX_SIZE = 117 //加密:每次最大加密长度117个字节private val DECRYPT_MAX_SIZE = 128 //解密:每次最大解密长度128个字节/*** 私钥加密*/fun encryptByPrivateKey(input: String, privateKey: PrivateKey): String {/********************非对称加/解密三部曲**********************///1.创建cipher对象val cipher = Cipher.getInstance(transformation)//2.初始化ciphercipher.init(Cipher.ENCRYPT_MODE, privateKey)//3.加密/解密val encrypt = cipher.doFinal(input.toByteArray())return Base64.getEncoder().encodeToString(encrypt)}/*** 公钥解密*/fun decryptByPublicKey(input: String, publicKey: PublicKey): String {val decode = Base64.getDecoder().decode(input)/********************非对称加/解密三部曲**********************///1.创建cipher对象val cipher = Cipher.getInstance(transformation)//2.初始化ciphercipher.init(Cipher.DECRYPT_MODE, publicKey)//3.加密/解密val encrypt = cipher.doFinal(decode)return String(encrypt)}/*** 公钥加密*/fun encryptByPublicKey(input: String, publicKey: PublicKey): String {/********************非对称加/解密三部曲**********************///1.创建cipher对象val cipher = Cipher.getInstance(transformation)//2.初始化ciphercipher.init(Cipher.ENCRYPT_MODE, publicKey)//3.加密/解密val encrypt = cipher.doFinal(input.toByteArray())return Base64.getEncoder().encodeToString(encrypt)}/*** 私钥解密*/fun decryptByPrivateKey(input: String, privateKey: PrivateKey): String {val decode = Base64.getDecoder().decode(input)/********************非对称加/解密三部曲**********************///1.创建cipher对象val cipher = Cipher.getInstance(transformation)//2.初始化ciphercipher.init(Cipher.DECRYPT_MODE, privateKey)//3.加密/解密val encrypt = cipher.doFinal(decode)return String(encrypt)}/*** 私钥分段加密*/fun encryptByPrivateKey2(input: String, privateKey: PrivateKey): String {val byteArray = input.toByteArray()var temp:ByteArrayvar offset = 0 //当前偏移的位置val bos = ByteArrayOutputStream()/********************非对称加/解密三部曲**********************///1.创建cipher对象val cipher = Cipher.getInstance(transformation)//2.初始化ciphercipher.init(Cipher.ENCRYPT_MODE, privateKey)//3.加密:分段加密
//        val encrypt = cipher.doFinal()while (byteArray.size - offset >0) { //没有加密完//每次最大加密117个字节if(byteArray.size - offset >= ENCRYPT_MAX_SIZE){//剩余部分大于117,加密完整117temp  = cipher.doFinal(byteArray, offset, ENCRYPT_MAX_SIZE)offset+= ENCRYPT_MAX_SIZE}else{//加密最后一块temp  = cipher.doFinal(byteArray, offset, byteArray.size - offset)offset = byteArray.size}//存储到临时缓冲区bos.write(temp)}bos.close()return Base64.getEncoder().encodeToString(bos.toByteArray())}/*** 公钥分段解密*/fun decryptByPublicKeyKey2(input: String, publicKey: PublicKey): String? {val byteArray = Base64.getDecoder().decode(input)var temp:ByteArrayvar offset = 0 //当前偏移的位置val bos = ByteArrayOutputStream()/********************非对称加/解密三部曲**********************///1.创建cipher对象val cipher = Cipher.getInstance(transformation)//2.初始化ciphercipher.init(Cipher.DECRYPT_MODE, publicKey)//3.加密:分段加密
//        val encrypt = cipher.doFinal()while (byteArray.size - offset >0) { //没有加密完//每次最大解密128个字节if(byteArray.size - offset >= DECRYPT_MAX_SIZE){//剩余部分大于128,解密完整128temp  = cipher.doFinal(byteArray, offset, DECRYPT_MAX_SIZE)offset+= DECRYPT_MAX_SIZE}else{//解密最后一块temp  = cipher.doFinal(byteArray, offset, byteArray.size - offset)offset = byteArray.size}//存储到临时缓冲区bos.write(temp)}bos.close()return String(bos.toByteArray())}/*** 公钥分段加密*/fun encryptByPublicKey2(input: String, publicKey: PublicKey): String {val byteArray = input.toByteArray()var temp:ByteArrayvar offset = 0 //当前偏移的位置val bos = ByteArrayOutputStream()/********************非对称加/解密三部曲**********************///1.创建cipher对象val cipher = Cipher.getInstance(transformation)//2.初始化ciphercipher.init(Cipher.ENCRYPT_MODE, publicKey)//3.加密:分段加密
//        val encrypt = cipher.doFinal()while (byteArray.size - offset >0) { //没有加密完//每次最大加密117个字节if(byteArray.size - offset >= ENCRYPT_MAX_SIZE){//剩余部分大于117,加密完整117temp  = cipher.doFinal(byteArray, offset, ENCRYPT_MAX_SIZE)offset+= ENCRYPT_MAX_SIZE}else{//加密最后一块temp  = cipher.doFinal(byteArray, offset, byteArray.size - offset)offset = byteArray.size}//存储到临时缓冲区bos.write(temp)}bos.close()return Base64.getEncoder().encodeToString(bos.toByteArray())}/*** 私钥分段解密*/fun decryptByPrivateKey2(input: String, privateKey: PrivateKey): String? {val byteArray = Base64.getDecoder().decode(input)var temp:ByteArrayvar offset = 0 //当前偏移的位置val bos = ByteArrayOutputStream()/********************非对称加/解密三部曲**********************///1.创建cipher对象val cipher = Cipher.getInstance(transformation)//2.初始化ciphercipher.init(Cipher.DECRYPT_MODE, privateKey)//3.加密:分段加密
//        val encrypt = cipher.doFinal()while (byteArray.size - offset >0) { //没有解密完//每次最大解密128个字节if(byteArray.size - offset >= DECRYPT_MAX_SIZE){//剩余部分大于128,解密完整128temp  = cipher.doFinal(byteArray, offset, DECRYPT_MAX_SIZE)offset+= DECRYPT_MAX_SIZE}else{//解密最后一块temp  = cipher.doFinal(byteArray, offset, byteArray.size - offset)offset = byteArray.size}//存储到临时缓冲区bos.write(temp)}bos.close()return String(bos.toByteArray())}
}fun main(args: Array<String>) {//如何生成密钥对val generator = KeyPairGenerator.getInstance("RSA")val keyPair = generator.genKeyPair()//生成密钥对val publicKey = keyPair.public//公钥val privateKey = keyPair.private//私钥println("publicKey=" + Base64.getEncoder().encodeToString(publicKey.encoded))println("privateKey=" + Base64.getEncoder().encodeToString(privateKey.encoded))var input_short = "黑马"//    私钥加密val encryptByPrivateKey = RSACrypt.encryptByPrivateKey(input_short, privateKey)println("私钥加密=" + encryptByPrivateKey)//   公钥解密val decryptByPublicKey = RSACrypt.decryptByPublicKey(encryptByPrivateKey, publicKey)println("公钥解密=" + decryptByPublicKey)//    公钥加密val encryptByPublicKey = RSACrypt.encryptByPublicKey(input_short, publicKey)println("公钥加密=" + encryptByPublicKey)//    私钥解密val decryptByPrivateKey = RSACrypt.decryptByPrivateKey(encryptByPublicKey, privateKey)println("私钥解密=" + decryptByPrivateKey)var input_long = "黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马黑马"//    私钥分段加密val encryptByPrivateKey2 = RSACrypt.encryptByPrivateKey2(input_long, privateKey)println("私钥分段加密=" + encryptByPrivateKey2)//     公钥分段解密val decryptByPublicKeyKey2 = RSACrypt.decryptByPublicKeyKey2(encryptByPrivateKey2, publicKey)println("公钥分段解密=" + decryptByPublicKeyKey2)//    公钥分段加密val encryptByPublicKey2 = RSACrypt.encryptByPublicKey2(input_long, publicKey)println("公钥分段加密=" + encryptByPublicKey2)//    私钥分段解密val decryptByPrivateKey2 = RSACrypt.decryptByPrivateKey2(encryptByPublicKey2, privateKey)println("私钥分段解密=" + decryptByPrivateKey2)}

10.非对称加密RSA-分段加密,分段解密

注意:

  1. RSA速度很慢,所以加密的长度不能超过117个字节,所以可以采取分段加密
  2. 分段解密是,每次最大解密128字节

11.RSA保存密钥对

开发中先会将生成的密钥对保存成字符串,使用时将字符串转成对象。

注意:私钥通常的加密方式是:PKCS8; 公钥通常的加密方式是:X509。

    /***********************保存密钥对********************************/val  publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpOATXST66dBJzkgYRMXqlIfjSAlkNaKcin4bjkuj3fUEQTHBPqkAhf9UbcoeT59/V2U5xjH3JX5SnDe7zDo2TT0YxIu402zaimbY52uZzbgsmS3+6jhX6URwcQIPghXEDrKIFwWEBWWV9+leRilBCS9sGQk8Cxq/C9wLwHKJ+3wIDAQAB"val  privateKeyStr = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOk4BNdJPrp0EnOSBhExeqUh+NICWQ1opyKfhuOS6Pd9QRBMcE+qQCF/1Rtyh5Pn39XZTnGMfclflKcN7vMOjZNPRjEi7jTbNqKZtjna5nNuCyZLf7qOFfpRHBxAg+CFcQOsogXBYQFZZX36V5GKUEJL2wZCTwLGr8L3AvAcon7fAgMBAAECgYEAuTwiNDBb31IT2bFQmlVXWVNrQrpUqt7FaS2VwKlN2kyk4eIkjlHmD/VteRh1cNeJpFut/2gb/FarRig98tVLQgIRJkHqatPyw+uBJPvudTuo2VyRD+p2Riqx/iFtCk9ArBViBWa/yn8bWncC+Wx5iLodHM1YLNSUvbemGYJ/TykCQQD+JYPD+qeRJ1F+fYAxa9Q1/qkVD5dJQscioxELDDVH6F9UoSXyKkaA3pmQiDnHNf/5YKUHE+EfMgYOM2tHh9fzAkEA6utuw3zwddPjOH+d4mnKoU9JQZSNvMkV1emW8Zos45FUneN65FI4e7G8UIYlJyzxGiHwTO+l7ULMYng8ucuEZQJAT9CsTxIbKgT1HQqBBgRdQw/VPh4FXyavr3sS0StmWEzsE4IAjsskFTjTdYayzpNw7nqhmVVu8AMfz7nqSS6qbQJBAL1VywvboqIUiEl88W8N/LZOBKjKZgIFv4eMoI9Qx2USOLSYJu/mJIftE+2CcGdGnXuGZvpbG8xBziB+79J+6NECQCEH4tHy51c0lbg3XCfLGC3nyByYPFleflx714xFlQYAasPL/CXRyjSH9oJAHuD+CMI6Av/YNMwnjNaubyqlyOE="val keyFactory:KeyFactory = KeyFactory.getInstance("RSA")val privateKey:PrivateKey = keyFactory.generatePrivate(PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyStr)))//私钥val publicKey:PublicKey = keyFactory.generatePublic(X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyStr)))//公钥

12.总结

13.消息摘要

消息摘要需要注意的:

消息摘要应用场景:一般不可逆的,都用消息摘要

下图中的登录接口,密码是明文登录,容易被抓包,不安全,一般会采用md5加密,为了增加破解难度,会多次加密,同时再结果后加盐(就是拼接自定义字符串)

14.数字签名

15.数字签名流程图

16.加密算法总结

Kotlin学习笔记——加密解密相关推荐

  1. Kotlin 学习笔记(八)—— Kotlin类与对象之接口

    Kotlin 学习笔记(八)-- Kotlin类与对象之接口 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- 基础 ...

  2. Kotlin学习笔记(3)- 语法

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!kotlin学习笔记系列首发简书和CSDN Kotlin学习笔记(1)- 环 ...

  3. Kotlin学习笔记(2)- 空安全

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!kotlin学习笔记系列首发简书和CSDN Kotlin学习笔记(1)- 环 ...

  4. Kotlin学习笔记(1)- 环境配置

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!kotlin学习笔记系列首发简书和CSDN Kotlin学习笔记(1)- 环 ...

  5. kotlin学习笔记——枚举、封闭类

    1.枚举 kotlin中提供类枚举的实现,与java相同.枚举可以带参数,如 enum Icon(val res: Int){MENU(R.drawable.menu),BACK(R.drawable ...

  6. kotlin学习笔记——重载操作符

    Kotlin中有很多操作符可以使用,具体可以见kotlin学习笔记--操作符_There is a Bug!!!-CSDN博客 Kotlin的一个特点就是可以重载这些操作符,为操作符赋予不同的行为. ...

  7. Kotlin 学习笔记(七)—— Kotlin类与对象之属性与字段

    Kotlin 学习笔记(七)-- Kotlin类与对象之属性与字段 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- ...

  8. Kotlin学习笔记20 阶段复习2

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 lambda表达式 内联函数 Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数_积跬步 至千里- ...

  9. Kotlin学习笔记19 阶段复习1

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 基础部分 Kotlin学习笔记 第一章开始 第二章 基础_积跬步 至千里-CSDN博客 类与继承 Kotlin学习笔记 第 ...

最新文章

  1. 第十六届智能车竞赛开源云台设计
  2. 一键添加JAVA环境变量
  3. 三种css样式表及其优先级
  4. cmd运行python服务器,python如何利用paramiko执行服务器命令
  5. Python3.6学习笔记(三)
  6. Java学习笔记-正则表达式的模式匹配
  7. python中curve fit_scipy.optimize.curve_fit函数用法解析
  8. 酒泉-嘉峪关-敦煌-西宁青海湖-兰州六日游之一
  9. rpg人物制作软件_RPG游戏制作教程
  10. ENSP模拟器下载分享
  11. Vue-Layout(可视化布局)
  12. 双重差分法之平行趋势检验
  13. 车牌号测试打分最准确的软件,车牌号码测吉凶准吗?手把手教你选好的车牌号...
  14. vb中怎么使图片适应框的大小_如何让放进框内的图片随框大小而变
  15. 华芯通服务器芯片将于今年年底前上市
  16. 对有序表的查找(快步搜索算法)
  17. 能不能推荐几个专门与外国人交友的app?这3款软件很有趣!
  18. 19年职业院校技能大赛总结
  19. 2021年JS解决那些有趣的数学题
  20. git 报错信息:Failed to connect to github.com port 443: Timed out

热门文章

  1. 中职计算机应用基础课程考试,计算机应用基础课标考试试题
  2. 日志报错SQL Error: 1062, SQLState: 23000
  3. 高等数学学习笔记——第二十三讲——导数运算法则
  4. 案例分析——需求分析的重要性
  5. 事件:onblur()无限触发问题
  6. 《Social Network》中扎克伯格所做的美女照片对比选美的实现原理
  7. 计算机组成--虚拟内存技术
  8. Unity 禁用动画位移
  9. x平方检验计算_x2检验或卡方检验和校正卡方检验的计算
  10. 名人名言(英文中文)(转)