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. web端功能测试总结(一)

    一.功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征,主要是用于页面之间切换跳转,指导用户去一些不知道地址的页面的主要手段,链接测试一般关注三点: 1)链接是否按照既定指示那样,确实链 ...

  2. ubuntu14.04为安装fcitx卸载ibus后出现system setting (系统设置)中图标消失的问题

    最近在系统为ubuntu14.04原版中,安装fictx.按照以往的经验应先把ibus卸载干净,否则可能会有冲突.因此惯性思维驱使,先卸载ibus,然后安装fcitx,但是问题出现了,system s ...

  3. MVC之前的那点事儿系列(10):MVC为什么不再需要注册通配符(*.*)了?

    文章内容 很多教程里都提到了,在部署MVC程序的时候要配置通配符映射(或者是*.mvc)到aspnet_ISPAI.dll上,在.NET4.0之前确实应该这么多,但是.NET4.0之后已经不要再费事了 ...

  4. Showbo.Msg.alert

    注意alert,confirm及prompt并不同于系统的,这个是用层模仿的,并不能挂起程序的执行 所以如果需要在确认后执行相关的操作,需要在配置文件中传递回调函数fn 按钮只提供yes和no两个 S ...

  5. knockoutJS学习笔记08:表单域绑定

    前面的绑定都是用在基本标签上,这章主要讲表单域标签的绑定. 一.value 绑定 绑定标签:input text.textarea. <p>用户名:<input type=" ...

  6. C#进阶系列——MEF实现设计上的“松耦合”(终结篇:面向接口编程)

    序:忙碌多事的八月带着些许的倦意早已步入尾声,金秋九月承载着抗战胜利70周年的喜庆扑面而来.没来得及任何准备,似乎也不需要任何准备,因为生活不需要太多将来时.每天忙着上班.加班.白加班,忘了去愤,忘了 ...

  7. 代码比较器 Araxis Merge

    Araxis Merge 是一个可视化的文件比较.合并和同步的软件,能够方便的被软件工程师和 web 站点开发者使用快速精确地比较.了解和联合不同版本的源文件:进行版本和质量控制,创建 HTML 或是 ...

  8. sublime编辑器插件

    sublime---插件 http://www.cnblogs.com/dudumao/p/4054086.html sublime--- Emmet插件  使用方法 http://docs.emme ...

  9. eclipse-将同一个文件分屏显示

    windows-editor-toggle split editor 效果图

  10. VirtualBox中Ubuntu 14.04屏幕分辨率不能设置的问题

    VirtualBox中Ubuntu 14.04屏幕分辨率不能设置的问题   在VirtualBOx虚拟机中Ubuntu 14.04设置屏幕分辨率,怎么点都没反应. 方法一:安装与你的Ubuntu-Gu ...