对称加密:凯撒加密(位移),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. CVPR2020:点云弱监督三维语义分割的多路径区域挖掘
  2. 架构体系需要进一步研究探索的V2路线图
  3. iOS面试题总结 二
  4. linux 32库路径,linux – 共享库如何在64位/ 32位混合系统中工作?
  5. SAP中用json数据格式调用http接口发送短信邮件案例
  6. workaround for error message Table maintenance not allowed for table XXX
  7. 电视百科常识 九大视频接口全接触
  8. Linux中exit与_exit的区别
  9. php apache win7,win7安装apache+php
  10. HTML5废除元素,HTML5 与 HTML4 的区别(2) - 新增的元素和废除的元素
  11. Python拷贝(深拷贝deepcopy与浅拷贝copy)
  12. dstwo linux 模拟器,dstwo md模拟器使用图文教程
  13. gmp新附录 计算机系统,GMP新附录:计算机系统.doc
  14. 3-矢量数据的构建和获取坐标集
  15. EDM邮件制作遇到的兼容性问题
  16. [LuoGu] P3957 跳房子
  17. 计算机中mac ip地址查询,mac苹果电脑怎么查看本机IP与MAC地址
  18. AD网络标号高亮设置
  19. 现在, Delphi 的多线程已经非常易用了!
  20. windows上配置IIS全过程

热门文章

  1. 用工资表做工资条详细介绍(excle简单的录制宏操作)
  2. 深度学习笔记(三)计算图及其导数运算方法
  3. echarts 饼图引导线尾部画圆入坑
  4. docker 使用理解 全流程
  5. 用Coreldraw制作节日贺卡(转)
  6. android 数据流量统计
  7. 【python】tkinter设置窗口图标
  8. 如何生成文件夹的目录结构?
  9. 微循环与耳聋模型的建立
  10. 京东二面:高并发系统如何设计?