DES & 3DES 加密算法
JAVA坑
跟其他公司java的对接口,一个细节对到吐血,具体:
DesUtil.java(别人的反例)
//package base_class; import java.io.IOException;
import java.security.SecureRandom; import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Base64; public class DesUtil { private final static String DES = "DES"; public static void main(String[] args) throws Exception {
String data = "123 45621145454a";
String key = "12345678_whatever"; System.err.println(encrypt(data, key));
} /**
* Description 根据键值进行加密
*
* @param data
* @param key 加密键byte数组
* @return
* @throws Exception
*/
public static String encrypt(String data, String key) throws Exception {
byte[] bt = encrypt(data.getBytes(), key.getBytes());
String strs = new String(Base64.encodeBase64(bt));
return strs;
} /**
* Description 根据键值进行加密
*
* @param data
* @param key 加密键byte数组
* @return
* @throws Exception
*/
private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom(); // 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key); // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(DES); // 用密钥初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); byte[] ret = cipher.doFinal(data); return ret;
} }
java加密算法如上:
先对密钥进行补全。
然后用“DES”对内容进行加密(默认算法经过验证为: DES/ECB/PKCS5Padding), 具体编码的时候最好明确指定,避免歧义。DES加密算法有以下4分支:
- DES/CBC/NoPadding (56)
- DES/CBC/PKCS5Padding (56)
- DES/ECB/NoPadding (56)
- DES/ECB/PKCS5Padding (56)
明确指定算法,避免乌龙,即
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
这样在不同的语言对接的时候将会是轻松的,否则(我就被动中了这个否则)会比较让人郁闷。
另外, java的DES对key没有检查!(python有,限定为8位)
如果key大于8位,则默认截取前8位用来加密!不报错!
可以编译下以上代码,修改key的后8位执行(需要自行下载commons-codec-1.10.jar包到当前执行目录)。
javac -cp ./commons-codec-1.10.jar DesUtil.java
java -cp .:./commons-codec-1.10.jar DesUtil
好吧, 我被告诉密码是16位, 于是默默手贱用了3DES算法, 对了半天对不上(java不是很熟)。
最后, 回头试了8位密码才对上,才发现以上红字为真理。(jdk1.7/commons-codec-1.10.jar)
在这里吐槽下:设计模式切记要用对地方!
对于一个需要灵活更换子类以实现多态的场合,用吧。
对于接口对接这种需要稳定性的地方, 引入工厂模式只会造成理解和沟通的成本!(对于DES, 鬼知道默认成了哪个分支算法)
DES&3DES算法
都是对称加密算法, 后者是前者的增强版(更好防暴力破解)。
不同:
DES 算法的密码是8个Byte, 64个bit, 注意!(不要多,不要少, 不要误导队友)
3DES支持的密码长度有16/24位, 注意!
ECB/CBC
这里有个10分钟的说明很给力:https://www.youtube.com/watch?v=uPiqyQOMH1E
没法翻墙, 没关系: 简单来说, CBC(cipher block chaining) 为链式加密, 即将待加密的数据分成n块, 前一块加密完的数据作为salt加入后一个模块的加密。
和ECB((electronic code book)的区别用下图就可说明:
即ECB加密不同位置的相同内容,输出一样。
CBC加密同一个内容,因其位置不同而不同。
以下stackoverflow说明也很给力:http://crypto.stackexchange.com/questions/225/should-i-use-ecb-or-cbc-encryption-mode-for-my-block-cipher
padding
直接看这里:https://asecuritysite.com/encryption/padding_des
DES & 3DES 加密算法的更多相关文章
- Java Base64、HMAC、SHA1、MD5、AES DES 3DES加密算法
● BASE64 严格地说,属于编码格式,而非加密算法 ● MD5(Message Digest algorithm 5,信息摘要算法) ● SHA(Secure Hash Algo ...
- 加密算法 DES 3DES RSA AES 简介
数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为[密文],使其只能在输入相应的[密钥]之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人 ...
- DES和3DES加密算法C语言实现【转】
转自:https://blog.csdn.net/leumber/article/details/78043675 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- DES/3DES/AES 三种对称加密算法实现
1. 简单介绍 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES ...
- DES对称加密算法简析
1 对称加密算法 在了解DES算法前,先加单介绍一下对称加密算法,因为DES属于对称加密算法的一种. 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密 ...
- 3DES加密算法32个字节
简介 最近开发的一个项目,使用到了3DES加密算法,加密socket服务端和客户端通信的报文,因为加密秘钥是32个字节,结果折腾了一番,现在记录下来分享! 1.Des3EncryptUtils.jav ...
- java和c++中的DES\3DES\Base64
首先来看一段java中对字符串加解密的代码: //密钥 private String key = "123456789012345678901234"; //解密过程,先用Base ...
- Java利用DES/3DES/AES这三种算法分别实现对称加密
转载地址:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了 ...
- 使用openssl库实现des,3des加密
原文地址: 使用openssl库实现des,3des加密 主要是调整了一下格式,以及一些变量的类型,以解决在VC2008下无法编译通过的问题. #include <stdio.h> #in ...
随机推荐
- RAID级别
raid磁盘阵列,我们一般使用RAID 5,挂载单独硬盘测试读写速度,一般使用RAID0.
- gradle项目中如何支持java与scala混合使用?
之前写过一篇maven项目中java与scala如何混用,今天来看看gradle项目中如何达到同样的效果: 一.目录结构 基本上跟maven一样,tips:这一堆目录结构不用死记,后面会讲如何用gra ...
- Angular快速入门篇
简介 AngularJS 是一个为动态WEB应用设计的结构框架,提供给大家一种新的开发应用方式,这种方式可以让你扩展HTML的语法,以弥补在构建动态WEB应用时静态文本的不足,从而在web应用程序中使 ...
- UML——在Visual Studio 2013/2015中设计UML类图
1.UML简介 Unified Modeling Language (UML)又称统一建模语言或标准建模语言. 简单说就是以图形方式表现模型,根据不同模型进行分类,在UML 2.0中有13种图,以下是 ...
- SQL 常用操作
今天网龙笔试遇到了几个SQL题,现在顺便就总结一下常用的SQL操作. 内连接:只将符合条件的行显示出来 SELECT s.name,m.mark FROM student s,mark m WHERE ...
- 一个 -100.01 的double 在内存中怎么存储的. 一个中文String 在内存中占多少直接 utf-8 / GBK
一.-100.01 的double 在内存中怎么存储的 double双精度数据类型存储格式IEEE 双精度格式为8字节64位,由三个字段组成:52 位小数 f : 11 位偏置指数 e :以及 1 位 ...
- js获取域名
<script language="javascript">//获取域名host = window.location.host;host2=document.domai ...
- php 不用四舍五入的方式截取小数点后两位
/** * 字符串截取, 默认小数点后2位 * @param $money * @param int $accuracy * @return float */ private function fil ...
- loadrunner关联取参--响应值unicode编码处理过
背景:做电商提交订单,需要获取订单号,然后进行支付.状态变更等操作 submitOrder() { lr_think_time(); /* 提交订单 */ /* specsId:规格ID,hyh_go ...
- Html特殊字符表
原始字符 entity 原始字符 entity " " & & ' ' < < > > ¡ ¡ ¢ ¢ £ £ ¤ ¤ ¥ ¥ ¦ ...