分组密码_计数器(CTR)模式_原理及java实现
2024-10-11 12:53:11
一、原理:
CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码,在CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。最终的密文分组是通过将计数器加密得到的比特序列与明文分组进行XOR而得到的。
二、原理图:
三、CRT模式的优点:
1、硬件效率高,同三种链接模式相比,CTR能够并行加密和解密。
2、软件效率高,可以充分利用其并行特性进行并行计算
3、由于加密解密过程不依赖明文和密文,因此可以做预处理以提高效率
4、可以随机访问某一明文或者密文分组进行部分加密和解密
四、实现:
之前使用DES都是使用java的cipher类。然后发现CTR模式不会写,网上也没什么人贴代码。在stackoverflow上,发现CRT的实现是需要用到IV(initial value)以保证每次加密时的计数器的初始值是不同的,如果能够保证每次加密的密钥不同也可以不使用IV,这样的话就变成一次一密了,安全性虽高,但在实际中并不实用。但是CRT的原理是不需要IV的。
encrypt函数:
public byte[] desCrypto(byte[] datasource, String password) { //明文和加密密钥
try{
DESKeySpec desKey = new DESKeySpec(password.getBytes());
//创建一个密匙工厂,然后用它把password(用户加密密钥)转换成des16轮加密中的16个密钥
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
//Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES/CTR/PKCS5Padding");
//用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey,new IvParameterSpec(desKey.getKey()));
//现在,获取数据并加密
//正式执行加密操作
return cipher.doFinal(datasource);
}catch(Throwable e){
e.printStackTrace();
}
return null;
}
decrypt函数:
public byte[] decrypt(byte[] src, String password) throws Exception { //密文和解密密钥
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(password.getBytes());
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES/CTR/PKCS5Padding");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey,new IvParameterSpec(password.getBytes()));
// 真正开始解密操作
return cipher.doFinal(src);
}
最新文章
- EF里Guid类型数据的自增长、时间戳和复杂类型的用法
- 浅谈SOA
- 在Linux上用supervisor运行ASP.NET Core站点的一个坑
- 谈谈主函数main
- jquery获取表单的值
- java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别
- 如何修改int的打印内容——史上最难的JAVA面试题
- 【特效】体验很好的导航hover效果移出恢复当前位置
- gitlab 本地 定时备份
- 转载:img是什么元素?置换元素?
- Selenium自动化 Xpath-元素定位
- 2017-11-8—自动控制原理在软硬件方面上的应用和体现
- win10重装win7
- cJSON学习笔记 续集
- ReactiveCocoa 5.0 初次了解
- Capabilities &; ChromeOptions
- IIS7的CMD指令
- 关于PostgreSQL的SQL注入必知必会
- C++面向对象高级编程(一)基础篇
- linux操作python
热门文章
- Android应用基础学习记录
- POJ 1269 Intersecting Lines(线段相交,水题)
- 连通图(Tarjan算法) 专题总结
- YTU 2572: 猜灯谜
- try-with-resources使用示例
- oracle启动流程
- android ndk环境搭建,如果是mac,请先装mac make编译器(可以使用Xcode进行安装)
- Python进程、线程、协程的对比
- log4j的1.2.15版本,在pom.xml中的顶层project报错错误: Failure to transfer javax.jms:jms:jar:1.1 from https://maven-repository.dev.java.net/nonav/repository......
- vs2010 每行代码显示虚线