您现在的位置是:首页 > 文章详情

【Java小工匠聊密码学】--对称加密--DES

日期:2018-06-09点击:400

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)); } } 

如果读完觉得有收获的话,欢迎点赞、关注、加公众号【小工匠技术圈】

个人公众号,欢迎关注,查阅更多精彩历史!

image
原文链接:https://yq.aliyun.com/articles/605516
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章