数据加密标准——DES
DES算法和DESede算法统称DES系列算法。DES算法是对称加密算法领域中的典型算法,为后续对称加密算法的发展奠定了坚实的基础。但是DES算法密钥偏短,仅有56位,迭代次数偏少,受到诸如查分密码分析和线性密码分析等各种攻击威胁,安全性受到严重威胁。不仅如此,由于DES算法具有半公开性质,被怀疑存在美国国家安全局安置的后门,受到各大密码学机构的强烈质疑。以后的文章中会具体描述一下AES算法。
生产密钥,对数据加密、解密
package test; import java.security.Key; import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec; /**
* DES安全编码组件
*/
public abstract class DESCoder {
/**
* 密钥算法
* java 7只支持56位密钥
* Bouncy Castle 支持64位密钥
*/
public static final String KEY_ALGORITHM = "DES";
/**
* 加密/解密算法 /工作模式/填充方式
*/
public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
/**
* 转换密钥
* @param key 二进制密钥
* @return key 密钥
* @throws Exception
*/
private static Key toKey(byte[] key) throws Exception{
//实例化DES密钥材料
DESKeySpec dks = new DESKeySpec(key);
//实例化密钥工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
//生产密钥
SecretKey secretKey = keyFactory.generateSecret(dks);
return secretKey;
}
/**
* 解密
* @param data 待解密数据
* @param key 密钥
* @return byte[] 解密数据
* @throws Exception
*/
public static byte[] decrypt(byte[] data,byte[] key) throws Exception{
//还原密钥
Key k = toKey(key);
//实例化
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
//初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, k);
//执行操作
return cipher.doFinal(data);
}
/**
* 加密
* @param data 待加密数据
* @param key 密钥
* @return byte[] 加密数据
* @throws Exception
*/
public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
//还原密钥
Key k = toKey(key);
//实例化
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
//初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE,k);
//执行操作
return cipher.doFinal(data);
}
/**
* 生产密钥
* java 7只支持56位 密钥
* Bouncy Castle 支持64位密钥
* @return byte[] 二进制密钥
* @throws Exception
*/
public static byte[] initKey() throws Exception{
/*
* 实例化密钥生成器
* 若要使用64位密钥注意替换
* 讲下述代码中的
* KeyGenerator.getInstance(KEY_ALGORITHM);
* 替换为
* KeyGenerator.getInstance(KEY_ALGORITHM,"BC");
*/
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
/*
* 初始化密钥生成器
* 若要使用64位密钥注意替换
* 将下述的代码 kg.init(56);
* 替换为 kg.init(64);
*/
kg.init(56);
//生成密钥
SecretKey secretKey = kg.generateKey();
//获得密钥的二进制编码形式
return secretKey.getEncoded();
}
}
单元测试:引入了三个包 commons-codec-1.9.jar 引入Base64.encodeBase64String(inputData)方法
junit-4.11.jar hamcrest-core-1.3.jar 进行单元测试
package test; import org.apache.commons.codec.binary.Base64;
import org.junit.Test; public class DESCoderTest {
@Test
public void test() throws Exception{
String inputStr = "DES";
byte[] inputData = inputStr.getBytes();
System.out.println("原文:\t" + inputStr);
//初始化密钥
byte[] key = DESCoder.initKey();
System.out.println("密钥:\t" + Base64.encodeBase64String(key));
//加密
inputData = DESCoder.encrypt(inputData, key);
System.out.println("加密后:\t" + Base64.encodeBase64String(inputData));
//解密
byte[] outputDate = DESCoder.decrypt(inputData, key);
String outoutStr = new String(outputDate);
System.out.println("解密后:\t" + outoutStr);
}
}
输出:
原文: DES
密钥: x8TN3Ku8/iM=
加密后: lOAZ+WcFAEU=
解密后: DES
数据加密标准——DES的更多相关文章
- 数据加密标准(DES)详解
1 简介 1.1 历史 DES(Data Encryption Standard)是由IBM公司在1974年提出的加密算法,在1977年被NIST定位数据加密标准.随后的很多年里,DES都是最流行的对 ...
- Android数据加密之Des加密
前言: 端午节前有个同事咨询我有关Android DES加密的相关实现,简单的实现了一下,今天来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...
- AES--高级数据加密标准
AES--高级数据加密标准 对称密码体制的发展趋势将以分组密码为重点.分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成.密钥扩展算法将b字节用户主密钥扩展成r个子密钥.加密算法由一个密码学上 ...
- DES(Data Encryption Standard)数据加密标准
DES算法入口参数 DES算法的入口参数有三个:Key.Data.Mode.其中Key为7个字节共56位,是DES算法的工作密钥.Data为8个字节64位,是要被加密或解密的数据;Mode为DES的工 ...
- 数据加密之DES加密
DES加密即使用DESCryptoServiceProvider加密.DESCryptoServiceProvider在命名空间下:System.Security.Cryptography; 对称加密 ...
- DES原理
1.DES的描述 为了建立适用于计算机系统的商用密码,美国商业部的国家标准局NBS于1973年5月和1974年8月两次发布通告,向社会征求密码算法.在征得的算法中,由IBM公司提出的算法lucifer ...
- DES加密解密与AES加密解密
随着开发时间的变长,当初认为比较难的东西,现在渐渐也就变的不那么难了!特别对于一些经常很少使用的类,时间长了之后渐渐就陌生了.所以在这里写一些日后可能会用到的加密与解密. 一.AES加密算法和DES加 ...
- 对称加密算法 ~ Des
一.对称加密 (Symmetric Key Encryption) 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret ...
- asp.net DES加密解密
数据加密标准DES加密算法是一种对称加密算法,DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小.这是一个迭代的分组密码,使用称为 Feistel 的技术,其中 ...
随机推荐
- Git使用指南(2)——工作区,暂存区,版本库
1 工作区修改添加到暂存区 git add 2 暂存区提交到版本库 git commit 3 版本库更新到暂存区 git reset HEAD 4 删除暂存区文件 git rm --cached< ...
- ROCKETMQ源码分析笔记2:client
CLIENT 之前讲过tools里面有大量调用client的东西.为了从源码层面了解rocket,决定啃下client这块骨头. pom 先看pom,看看CLIENT依赖谁.看完后原来是依赖commo ...
- 【前端】移动端Web开发学习笔记【1】
下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...
- Oracle(控制用户权限)
权限允许用户访问属于其它用户的对象或执行程序, ORACLE系统提供权限:Object 对象级.System 系统级 查看权限的数据字典: 字典名 含义 ROLE_SYS_PRIVS System p ...
- web前端之HTML的大框架(body元素与frameset元素)
web前端之HTML的大框架 body元素与frameset元素 对于从事html的人员来说,我们一般熟悉的框架是先声明html ,然后在<html>标签对里包着<head ...
- SQL函数
1,字符串截取拼接 CONCAT(),'****');SUBSTRING_INDEX(c.context,'}',1);SUBSTRING_INDEX(a.task_context,':',-1) a ...
- 16-腾讯-intership-面试
问题 问:说一下在浏览器那里输入一个网址,会发生什么?答:DNS服务器解析,TCP三次握手,建立连接,然后bilibala............... 问:你对http相关协议熟悉吗?答:我问是ge ...
- python走起之第十四话
HTML 标题 HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的. 实例 <h1>这是一个标题</h1> <h2> ...
- thinkphp3.2自定义配置文件
扩展配置可以支持自动加载额外的自定义配置文件,并且配置格式和项目配置一样. 设置扩展配置的方式如下(多个文件用逗号分隔): // 加载扩展配置文件 'LOAD_EXT_CONFIG' => 'u ...
- Java 中如何原样输出转义符号
Java 中的转义字符有好几种,常见的有: 八进制转义字符,格式:\ + 1到3位八进制数字,如\1, \20,范围为 \0 ~ \377,即最大值为255. Unicode转义字符,格式:\u + ...