文章目录

  • Api文档
  • DES加密解密
  • Base64加密和解密
  • AES加密解密
  • DES和AES密钥长度
  • 工作模式和填充模式
  • 对称加密的应用场景



Api文档

https://docs.oracle.com/javase/7/docs/api/

DES加密解密

//单例
object DESCrypt{//des加密fun encrypt(input:String,password:String): ByteArray {//1.创建cipherval c = Cipher.getInstance("DES")//2.初始化cipher(参数1:加密/解密模式)val kf = SecretKeyFactory.getInstance("DES")val keySpec = DESKeySpec(password.toByteArray())val key: Key? = kf.generateSecret(keySpec)c.init(Cipher.ENCRYPT_MODE, key)//3.加密/解密val encrypt = c.doFinal(input.toByteArray())return encrypt}//des解密fun decrypt(input:ByteArray,password:String): ByteArray {//1.创建cipherval c = Cipher.getInstance("DES")//2.初始化cipher(参数1:加密/解密模式)val kf = SecretKeyFactory.getInstance("DES")val keySpec = DESKeySpec(password.toByteArray())val key: Key? = kf.generateSecret(keySpec)c.init(Cipher.DECRYPT_MODE, key)//3.加密/解密val encrypt = c.doFinal(input)return encrypt}
}fun main(args: Array<String>) {//原文val input = "欢迎来到Errol_King的博客"//密码,密钥长度8位val password = "12345678"val encrypt = DESCrypt.encrypt(input,password)val decrypt = DESCrypt.decrypt(encrypt,password)println(String(decrypt))
}

Base64加密和解密

上面的栗子中用DES成功进行了加密和解密

之前加密返回的是bytearray,现在返回字符串,现在加密解密变成了

//单例
object DESCrypt{//des加密fun encrypt(input:String,password:String): String {//1.创建cipherval c = Cipher.getInstance("DES")//2.初始化cipher(参数1:加密/解密模式)val kf = SecretKeyFactory.getInstance("DES")val keySpec = DESKeySpec(password.toByteArray())val key: Key? = kf.generateSecret(keySpec)c.init(Cipher.ENCRYPT_MODE, key)//3.加密/解密val encrypt = c.doFinal(input.toByteArray())return String(encrypt)}//des解密fun decrypt(input:String,password:String): ByteArray {//1.创建cipherval c = Cipher.getInstance("DES")//2.初始化cipher(参数1:加密/解密模式)val kf = SecretKeyFactory.getInstance("DES")val keySpec = DESKeySpec(password.toByteArray())val key: Key? = kf.generateSecret(keySpec)c.init(Cipher.DECRYPT_MODE, key)//3.加密/解密val encrypt = c.doFinal(input.toByteArray())return encrypt}
}fun main(args: Array<String>) {//原文val input = "欢迎来到Errol_King的博客"//密码,密钥长度8位val password = "12345678"val encrypt = DESCrypt.encrypt(input,password)println(encrypt)val decrypt = DESCrypt.decrypt(encrypt,password)println(String(decrypt))
}

运行程序

加密后变成了乱码,解密报错了

我们把原文改为“欢迎”

 //原文val input = "欢迎"val array = input.toByteArray()//转成字节数组array.forEach {println(it)}

utf8中,一个中文字符占3个字节

加密后为什么变成乱码了呢。打印一下加密后字节数组长度

fun encrypt(input:String,password:String): String {......//3.加密/解密val encrypt = c.doFinal(input.toByteArray())//加密后字节数组的长度println("加密后字节数组长度"+encrypt.size)//8return String(encrypt)}

加密后变成了8个字符,在码表中找不到对应字符

在开发中用base64做编码节码,来解决乱码的问题

引入Base64的工具类

//单例
object DESCrypt{//des加密fun encrypt(input:String,password:String): String {......return  Base64.encode(encrypt)}//des解密fun decrypt(input:String,password:String): ByteArray {......//3.加密/解密val encrypt = c.doFinal(Base64.decode(input))return encrypt}
}fun main(args: Array<String>) {//原文val input = "欢迎来到Errol_King的博客"//密码,密钥长度8位val password = "12345678"val encrypt = DESCrypt.encrypt(input,password)println(encrypt)val decrypt = DESCrypt.decrypt(encrypt,password)println(String(decrypt))
}


Base64工具类:
链接:https://pan.baidu.com/s/1FzMDzF5jRwu6U8aFNytrTg
提取码:kvs4

AES加密解密

object AESCrypt{//加密fun encrypt(input:String,password:String): String {//创建cipher对象val cipher = Cipher.getInstance("AES")//初始化:加密/解密val keySpec:SecretKeySpec = SecretKeySpec(password.toByteArray(),"AES")cipher.init(Cipher.ENCRYPT_MODE,keySpec)//加密val encrypt = cipher.doFinal(input.toByteArray())return Base64.encode(encrypt)}//解密fun decrypt(input:String,password:String): String {//创建cipher对象val cipher = Cipher.getInstance("AES")//初始化:加密/解密val keySpec:SecretKeySpec = SecretKeySpec(password.toByteArray(),"AES")cipher.init(Cipher.DECRYPT_MODE,keySpec)//因为传过来的是Base64加密后的字符串,所以先Base64解密val encrypt = cipher.doFinal(Base64.decode(input))return String(encrypt)}
}fun main(args: Array<String>) {//AES密码必须是16位val password = "1234567812345678"val input = "欢迎"val e = AESCrypt.encrypt(input,password)val d = AESCrypt.decrypt(e,password)println(e)println(d)
}

DES和AES密钥长度


DES后都带有56

val password8 = "12345678"
println(password8.toByteArray().size)//8个字节,8*8=64位,DES前7位参与计算,最后一位作为校验码,7*8=56

AES后都带有128

    val password16 = "1234567812345678"println("AES密钥字节长度:"+password16.toByteArray().size)//16个字节,16*8=128

工作模式和填充模式


看之前的api文档,AES/DES是加密算法,中间的是工作模式,最后的是填充模式



先使用ECB的工作模式

object DESCrypt{//算法/工作模式/填充模式val transformation = "DES/ECB/PKCS5Padding"//算法val algorithm = "DES"//des加密fun encrypt(input:String,password:String): String {//1.创建cipherval c = Cipher.getInstance(transformation)//2.初始化cipher(参数1:加密/解密模式)val kf = SecretKeyFactory.getInstance(algorithm)val keySpec = DESKeySpec(password.toByteArray())val key: Key? = kf.generateSecret(keySpec)c.init(Cipher.ENCRYPT_MODE, key)//3.加密/解密val encrypt = c.doFinal(input.toByteArray())return  Base64.encode(encrypt)}//des解密fun decrypt(input:String,password:String): ByteArray {//1.创建cipherval c = Cipher.getInstance(transformation)//2.初始化cipher(参数1:加密/解密模式)val kf = SecretKeyFactory.getInstance(algorithm)val keySpec = DESKeySpec(password.toByteArray())val key: Key? = kf.generateSecret(keySpec)c.init(Cipher.DECRYPT_MODE, key)//3.加密/解密val encrypt = c.doFinal(Base64.decode(input))return encrypt}
}fun main(args: Array<String>) {//原文val input = "欢迎来到Errol_King的博客"//密码,密钥长度8位val password = "12345678"val encrypt = DESCrypt.encrypt(input,password)println(encrypt)val decrypt = DESCrypt.decrypt(encrypt,password)println(String(decrypt))
}


再来使用CBC的工作模式

object DESCrypt{//算法/工作模式/填充模式val transformation = "DES/CBC/PKCS5Padding"//算法val algorithm = "DES"//des加密fun encrypt(input:String,password:String): String {//1.创建cipherval c = Cipher.getInstance(transformation)//2.初始化cipher(参数1:加密/解密模式)val kf = SecretKeyFactory.getInstance(algorithm)val keySpec = DESKeySpec(password.toByteArray())val key: Key? = kf.generateSecret(keySpec)val iv = IvParameterSpec(password.toByteArray())c.init(Cipher.ENCRYPT_MODE, key,iv)//CBC需要额外参数//3.加密/解密val encrypt = c.doFinal(input.toByteArray())return  Base64.encode(encrypt)}//des解密fun decrypt(input:String,password:String): ByteArray {//1.创建cipherval c = Cipher.getInstance(transformation)//2.初始化cipher(参数1:加密/解密模式)val kf = SecretKeyFactory.getInstance(algorithm)val keySpec = DESKeySpec(password.toByteArray())val key: Key? = kf.generateSecret(keySpec)val iv = IvParameterSpec(password.toByteArray())c.init(Cipher.DECRYPT_MODE, key,iv)//CBC需要额外参数//3.加密/解密val encrypt = c.doFinal(Base64.decode(input))return encrypt}
}fun main(args: Array<String>) {//原文val input = "欢迎来到Errol_King的博客"//密码,密钥长度8位val password = "12345678"val encrypt = DESCrypt.encrypt(input,password)println(encrypt)val decrypt = DESCrypt.decrypt(encrypt,password)println(String(decrypt))
}

运行结果相同

对称加密的应用场景

手机连接AS,data-data-com.tencent.mobileqq-databases中找到qq号.db,下载到电脑,用SQLite打开,如果关联了手机联系人,phoneContact中会有数据。但是加密的,这里用到的就是对称加密

【Kotlin】加密解密2:DES、AES加密和解密相关推荐

  1. 程序猿成长之路番外篇之前后端加解密(rsa+aes混合加解密算法)

    今年国庆前夕接手一个外部项目,说是要保障接口数据安全,数据安全相对容易些,接口安全嘛emmmmm, 这个要考虑加解密算法.白名单之类的问题了.于是打算今天搞一期接口安全为题的成长之路番外篇. 为什么要 ...

  2. python 加密解密_python实现AES加密解密

    本文实例为大家分享了python实现AES加密解密的具体代码,供大家参考,具体内容如下 (1)对于AES加密解密相关知识 (2)实现的功能就是输入0-16个字符,然后经过AES的加密解密最后可以得到原 ...

  3. c php aes加密解密,php的AES加密解密

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. $privateKey = "1234567812345678"; $ ...

  4. python调用库函数用ecb模式加密图片_python 实现AES加密解密(ECB模式,配合base64)...

    import base64 from Crypto.Cipher import AES ''' 采用AES对称加密算法 ''' # str不是32的倍数那就补足为16的倍数 def add_to_32 ...

  5. oracle实现aes解密_Oracle的AES加密与解密用法

    Oracle的AES加密与解密用法 2013年12月11日 11:50:35 iteye_751 阅读数:428 --加密字符串 create or replace function des3_enc ...

  6. php aes解密中文,PHP AES加密解密算法

    //--------第四种AES加密/解密方案 CBC模式,128-bit-------- /* * 实现AES加密 * $str : 要加密的字符串 * $keys : 加密密钥 * $iv : 加 ...

  7. C#常用加密解密方法(AES加密解密)

    在日常开发过程中,总会遇到需要加密解密的需求,这里我整理了C#常用的加密解密方法分享给大家. 先看看加密的基本概念: "加密",是一种限制对网络上传输数据的访问权的技术.原始数据( ...

  8. Android加密工具类,Android AES加密工具类分享

    1.AES加密工具类 java不支持PKCS7Padding,只支持PKCS5Padding.我们知道加密算法由算法+模式+填充组成,下一篇介绍iOS和Android通用的AES加密,本篇文章使用PK ...

  9. 小编带你简单了解一下加密技术原理:AES加密标准

    随着因特网的发展,信息传输及存储的安全问题成为影响因特网应用发展的重要因素.信息安全技术也就成为了人们研究因特网应用的新热点. 信息安全的研究包括密码理论与技术.安全协议与技术.安全体系结构理论.信息 ...

  10. java如何实现aes加密_Java 如何实现AES加密

    做360广告的对接需要对密码进行AES加密,下面是点睛平台文档的描述: (AES模式为CBC,加密算法MCRYPT_RIJNDAEL_128)对MD5加密后的密码实现对称加密.秘钥是apiSecret ...

最新文章

  1. C语言感觉有意思得意东西!_只愿与一人十指紧扣_新浪博客
  2. React(0.13) 定义一个动态的组件
  3. Tomcat 内存与优化篇
  4. IDC运维团队技术交流总结篇————换个角度看世界
  5. ubuntu apache php mysql phpmyadmin_Ubuntu下Apache+PHP+MySQL+phpMyAdmin的快速安装步骤
  6. select的一些问题。
  7. 经理人如何与这“六种人”打交道?
  8. php获取扫码枪的内容,一起看看js获取扫码枪输入数据的方法_WEB前端开发
  9. Springcloud服务如何在Eureka安全优雅的下线
  10. 通用窗口类 Inventory Pro 2.1.2 Demo1(中)
  11. 什么叫“职业年金”,与养老保险有什么关系?
  12. 使用struts中的DisPatchAction的时候需要用到的jar包
  13. PDF阅读器哪个好用?看完这篇文章就可以不用再问了
  14. 华南主板超频设置图解_支持XMP2.0,3000稳超3733MHz,威刚龙耀D60G超频体验
  15. 静默安装weblogic
  16. 数学基础(1)线性代数总结
  17. 关于大学生睡眠时间及质量的问卷调查
  18. 【学习笔记】多目标优化问题分解成若干简单多目标子问题--MOEA/D-M2M
  19. win7如何设置wifi热点_mac如何共享网络?mac怎么建立wifi热点?
  20. w7设置双显示器_Win7系统双屏显示设置的方法

热门文章

  1. java的源代码存放于_android开发工程目录中用来存放java源代码的是哪个目录?
  2. 手游梦幻西游决战华山最强阵容搭配攻略盘点
  3. 如何关闭苹果手机自动扣费_手机下载软件,岂料每月自动扣费?快看你手机有没有...
  4. 基于A股周内效应择时策略验证与思考(附代码)
  5. 量化择时:基于经验模态分解的希尔伯特-黄变换(一)数理
  6. php判断一个数组是否存在在另一个数组中
  7. win10系统常用办公技巧
  8. 自贸经济中架起的“隐形桥梁”:国货精品与中国AI力量
  9. 3种人民币RMB符号的写法
  10. 转载 深圳证券交易所行情对接