【Java小工匠聊密码学】--对称加密--DES
1、 DES算法
DES对称加密,对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一对称加密算法。
2、DES算法特点
密钥长度56位+8位校验位,生命周期短。
3、DES算法实现
3.1 DES的JDK实现
(1)工作模式
ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128.
(2) 填充模式
NoPadding、PKCS5Padding、ISO10126Padding
(3) 代码实现
package lzf.cipher.jdk; import java.nio.charset.Charset; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** * @author Java小工匠 */ public class JdkDesUtils { // 获取 DES Key public static byte[] getDesKey() { try { // 1、创建密钥生成器 KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); keyGenerator.init(56); // 2、产生密钥 SecretKey secretKey = keyGenerator.generateKey(); // 3、获取密钥 byte[] key = secretKey.getEncoded(); return key; } catch (Exception e) { throw new RuntimeException(e); } } // DES 加密 public static byte[] encryptDes(byte[] data, byte[] key) { try { SecretKey secretKey = new SecretKeySpec(key, "DES"); String type = "DES"; // 加工作模式和填充方式 // type= "DES/ECB/PKCS5Padding"; Cipher cipher = Cipher.getInstance(type); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] rsData = cipher.doFinal(data); return rsData; } catch (Exception e) { throw new RuntimeException(e); } } //解密 public static byte[] decryptDes(byte[] data, byte[] key) { try { SecretKey secretKey = new SecretKeySpec(key, "DES"); String type = "DES"; // 加工作模式和填充方式 // type= "DES/ECB/PKCS5Padding"; Cipher cipher = Cipher.getInstance(type); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] rsData = cipher.doFinal(data); return rsData; } catch (Exception e) { throw new RuntimeException(e); } } // 数据转16进制编码 public static String encodeHex(final byte[] data, final boolean toLowerCase) { final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; final char[] toDigits = toLowerCase ? DIGITS_LOWER : DIGITS_UPPER; final int l = data.length; final char[] out = new char[l << 1]; // two characters form the hex value. for (int i = 0, j = 0; i < l; i++) { out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; out[j++] = toDigits[0x0F & data[i]]; } return new String(out); } public static void main(String[] args) { byte[] data = "java小工匠".getBytes(Charset.forName("UTF-8")); byte[] key = getDesKey(); String hexKeyStr = encodeHex(key, true); System.out.println("加密密钥:" + hexKeyStr + ",length=" + hexKeyStr.length()); byte[] encryptData = encryptDes(data, key); System.out.println("加密数据:" + encodeHex(encryptData, true)); byte[] decryptData = decryptDes(encryptData, key); System.out.println("解密数据:" + new String(decryptData)); } }
如果读完觉得有收获的话,欢迎点赞、关注、加公众号【小工匠技术圈】
个人公众号,欢迎关注,查阅更多精彩历史!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【Java小工匠聊密码学】--对称加密--概述
1、什么是对称加密 对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文“原始数据”和“加密密钥“一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。 image.png 2、对称密码特点 (1)加密密钥与解密密钥相同,加密算法与解密算法互逆 (2)算法公开、计算量小、加密速度快、加密效率高。 (3)双方使用相同的密钥,安全性得不到保障。 3、对称密码工作模式 (1)ECB:电子密码本 最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。 (2)CBC:密码连接 明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但...
- 下一篇
写在Github被微软收购之际 - Github的那些另类用法
这几天朋友圈被微软75亿美元收购Github的新闻刷屏了。Jerry也来贡献一篇和Github相关的文章。 这篇文章包含了Jerry平时对于Github的一些另类用法。目录如下: 1. 部署HTML应用到Github并运行 2. Github和云平台的集成 3. ABAP Git客户端 4. 用Github搭建个人博客 5. 一些提高工作效率的小窍门 6. Github周边 如果您也有使用Github的小技巧,欢迎留言。 1. 部署HTML应用到Github并运行 这个技巧其实是把Github作为一个简单的Web容器使用。新建一个Github仓库,再新建一个gh-pages分支,将您的HTML项目文件保存并推送到该分支下。假设我开发了一个Angular应用,应用的入口页面是angular_controller.html,那么将本地文件推送到Github后,使用如下格式的url访问该应用: http:// user name in github>.github.com//angular_controller.html 我做的一个例子: 详细步骤参考我的博客: Step by ste...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,8上快速安装Gitea,搭建Git服务器