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 加密算法的更多相关文章

  1. Java Base64、HMAC、SHA1、MD5、AES DES 3DES加密算法

    ●  BASE64 严格地说,属于编码格式,而非加密算法    ●  MD5(Message Digest algorithm 5,信息摘要算法)    ●  SHA(Secure Hash Algo ...

  2. 加密算法 DES 3DES RSA AES 简介

    数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为[密文],使其只能在输入相应的[密钥]之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人 ...

  3. DES和3DES加密算法C语言实现【转】

    转自:https://blog.csdn.net/leumber/article/details/78043675 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  4. DES/3DES/AES 三种对称加密算法实现

    1. 简单介绍 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES ...

  5. DES对称加密算法简析

    1 对称加密算法 在了解DES算法前,先加单介绍一下对称加密算法,因为DES属于对称加密算法的一种. 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密 ...

  6. 3DES加密算法32个字节

    简介 最近开发的一个项目,使用到了3DES加密算法,加密socket服务端和客户端通信的报文,因为加密秘钥是32个字节,结果折腾了一番,现在记录下来分享! 1.Des3EncryptUtils.jav ...

  7. java和c++中的DES\3DES\Base64

    首先来看一段java中对字符串加解密的代码: //密钥 private String key = "123456789012345678901234"; //解密过程,先用Base ...

  8. Java利用DES/3DES/AES这三种算法分别实现对称加密

    转载地址:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了 ...

  9. 使用openssl库实现des,3des加密

    原文地址: 使用openssl库实现des,3des加密 主要是调整了一下格式,以及一些变量的类型,以解决在VC2008下无法编译通过的问题. #include <stdio.h> #in ...

随机推荐

  1. ConcurrentHashMap和HashMap的一点区别

    HashMap不是线程安全的,ConcurrentHashMap则在某一个方法的执行上是线程安全的. package testMap; import java.util.HashMap; public ...

  2. PL/SQL 如何查看当前连接信息以及SQL PLUS如何指定IP地址

    1.通过PL/SQL 想连接别的数据库可以通过在服务名前面加上IP和左斜线来实现: 2.有时我们的IP和左斜线不用输也能连别的数据库,是因为在一个文件里配置好了.这个文件在哪里? 在这个路径下的 NE ...

  3. IO(六)--- 编码和解码

    编码: 把看得懂的字符变成看不懂码值这个过程我们称作为编码. 解码: 把码值查找对应的字符,我们把这个过程称作为解码. 注意: 以后编码与解码一般我们都使用统一的码表.否则非常容易出乱码. 常用码表: ...

  4. Stack Overflow: The Architecture - 2016 Edition

    To get an idea of what all of this stuff “does,” let me start off with an update on the average day ...

  5. 豪斯课堂K先生全套教程淘宝设计美工第一期+第四期教程(无水印)

    第一期课程包括 <配色如此简单> <配色的流程><对称之美>第二期课程包括 <字体的气质及组合><平衡及构图形式><信息的筛选与图片的 ...

  6. NB-IoT的相关资料整理(基本概念,技术优势,典型案例和当前的进展)

            人与人之间的通讯规模已近天花板,物与物的则刚刚进入增长快车道.随着可穿戴.车联网.智能抄表等新兴市场的开启,工业4.0.智慧城市.智慧农业等理念照进现实,万物互联的时代正加速到来. 一 ...

  7. # 2015-2016-2 《Java程序设计》课程总结

    2015-2016-2 <Java程序设计>课程总结

  8. 怎样让 Web 项目暴露在外的服务坚不可摧?

    Web 项目一般给特定人群使用,有些是局域网用户量不足1K的内部系统,也有些广域网用户上万的中型项目,当然还有用户上亿的大型项目. 这些大大小小的 Web 项目都会有用户登录的存在,登录后有特定的权限 ...

  9. WCF开发那些需要注意的坑 Z

    执行如下 批处理:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\svcutil.exe" http://127.0.0.1: ...

  10. Mysql连表之多对多

    说明 这里的文章是接着前面 Mysql连表一对多 写的. 连表多对多 可以理解成一夫多妻和一妻多夫. 男人表: nid name 1 xxx 2 yyy 3 zzz 女人表: nid name 1 a ...