java 3des加密问题记录

3des加密有不同的加密模式和填充模式,这个网上很多不多说了,只要保证加解密的时候加密模式和填充模式保持一致就可以了

首先对于密钥的生成,java中有2种方式:

1.第一种,采用ECB模式和不填充模式

//加密
public static byte[] des3EncodeECB(byte[] key, byte[] data)
            throws Exception {
        Key deskey = null;
        SecretKeySpec spec = new SecretKeySpec(key,"desede");
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
        deskey = keyfactory.generateSecret(spec);
        Cipher cipher = Cipher.getInstance("desede" + "/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, deskey);
        byte[] bOut = cipher.doFinal(data);
        return bOut;
    }
 //解密
    public static byte[] des3DecodeECB(byte[] key, byte[] data)
            throws Exception {
        Key deskey = null;
        SecretKeySpec spec = new SecretKeySpec(key,"desede");
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
        deskey = keyfactory.generateSecret(spec);
        Cipher cipher = Cipher.getInstance("DESede" + "/ECB/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, deskey);
        byte[] bOut = cipher.doFinal(data);
        return bOut;
    }

2.第二种,同样采用ECB模式和不填充模式

//加密
    public static byte[] encrypt(byte[] targetToByte, String algorithm,String mode, String key) throws Exception {
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.ENCRYPT_MODE, getKey(key, mode));
        byte[] result = cipher.doFinal(targetToByte);
        // System.out.println("base64:" +encryptByBase64(result));
        return result;
    }
//解密
    public static byte[] decrypt(byte[] targetToByte, String algorithm,String mode, String key) throws Exception {
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.DECRYPT_MODE, getKey(key, mode));
        byte[] result = cipher.doFinal(targetToByte);
        // System.out.println("base:" + new String(result,"UTF-8"));
        return result;
    }

    public static Key getKey(String key, String algorithm) {
        try {
            KeyGenerator generator = KeyGenerator.getInstance(algorithm);
            //注意此处将key按照16进制数字解析成byte数组,按需要修改,比如key.getBytes()
            generator.init(new SecureRandom(HexString2Bytes(key)));
            return generator.generateKey();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

  两种方式的区别,第一种就是使用你给定的key作为密钥,当与其他客户端进行通信,加解密不是由同一方操作的时候推荐使用,第二种是根据你给的key来生成一个新的key,这个新的key才是真正加密时使用的key,所以如果用第一种加密出来的密文用第二种来解密,是解不出来的。

  另外,java中只提供了3倍长3des的算法,也就是key的长度必须是24字节,如果想要使用2倍长3des,需要自己将后8个字节补全(就是将16个字节的前8个字节补到最后,变成24字节)。如果提供的key不足24字节,将会报错,如果超过24字节,将会截取前24字节作为key(坑了我好长时间)

3des的加密过程

3DES,分为2种,一个是双倍长3DES,一个是三倍长3DES。

如果是双倍长3DES,密钥为16字节长,按左右,分别LK(密钥的左边8字节),RK(密钥的右边8字节)。加密内容DATA为8字节。

假设单倍长DES加密过程为:DES( data, key, dest ),其中,data为被加密数据,key为加密密钥,dest为加密结果。单倍长DES解密过程为:UDES(data, key, dest ),其中,data为被解密的数据,key为解密密钥,dest为解密结果。

那么,双倍长3DES的加密方法为:

DES( DATA, LK, TMP1 );

UDES( TMP1, RK, TMP2 );

DES( DATA, LK, DEST );

DEST是最终得到的密文。具体过程简述如下:

1)使用密钥的前8字节,对数据DATA进行加密,得到加密的结果TMP1;

2)使用密钥的后8字节,对第一的计算结果TMP1,进行解密,得到解密的结果TMP2;

3)再次使用密钥的前8字节,对第二次的计算结果TMP2,进行加密,得到加密的结果DEST。DEST就为最终的结果。

对于三倍长3DES,密钥长度的为24字节长。可以分为LK(密钥的左边8字节),CK(密钥的中间8字节),RK(密钥的左边8字节)。与二倍长3DES的加密过程基本相同,只是第一次计算,使用密钥LK;第二次计算,使用密钥CK;第三次计算,使用密钥LK。基本过程如下:

DES( DATA, LK, TMP1 );

UDES( TMP1, CK, TMP2 );

DES( TMP2, RK, DEST );

时间: 2024-08-09 10:39:20

java 3des加密问题记录的相关文章

C# Java 3DES加密解密 扩展及修正\0 问题

注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ----------------------------------------------------------- /// 说明: /// 转载自网上http://bbs.csdn.net/topics/350158619 /// 并加以扩展 /// 修正: /// 1. 修改正解密后出现 '\0' /// 注: 1. 向量不能小于8位 /// 2. 明文末尾如果是带'\0'字

[转]Java 3DES(Desede、TripleDES)加密

转自:here 从数据安全谈起 当你使用网银时,是否担心你的银行卡会被盗用? 当你和朋友用QQ进行聊天时,是否担心你的隐私会被泄露? 作为开发者,编写安全的代码比编写优雅的代码更重要,因为安全是一切应用之根本!为了确保数据不被侵犯,数据加密/解密技术运用而生.    ——摘录自<Java加密解密的艺术> 所以为了确保数据传输和数据存储的安全,我们可以通过特定的算法,将数据明文加密成复杂的密文. 众多的加密手段大致可以分为单项加密和双向加密.单项加密指通过对数据进行摘要计算生成密文,密文不可逆推

Java实现3DES加密--及ANSI X9.8 Format标准 PIN PAN获取PIN BlOCK

1, 采用银联ANSI X9.8标准 PIN xor PAN获取PIN BlOCK 2, 采用3Des进行加密 参考: des和3Des加密算法实现 要点:因为3DES是对称加密算法,key是24位,当只有16位时,后8位取key的前8位 ANSI X9.8标准 PIN xor PAN获取PIN BlOCK (1) ANSI X9.8 Format(不带主账号信息) PIN(个人识别码 Personal Identity Number)总共有8个byte长度,分为两个部分;(类似数据包的格式)

JAVA和C# 3DES加密解密

原文转自:http://blog.csdn.net/sdfkfkd/article/details/6004847 最近 一个项目.net 要调用Java的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题,下面分享一下,这里的KEY采用Base64编码,便用分发,因为Java的Byte范围为-128至127,c#的Byte范围是0-255核心是确定Mode和Padding,关于这两个的意思可以搜索3DES算法相关文章一个是C#采用CBC Mode,PKCS7 Pa

每天一段代码-C# 3DES加密

最近一个项目中,因为服务端是用的java开发的,客户端是用的C#,由于通信部分采用到了3DES加密,所以做个记录,以备以后需要的时候直接用. 这是对方(java)的加密算法,和网上流传的代码也差不多(主密钥直接写死了,方便测试) 1 package org.zwork.market.mina.msg; 2 3 import java.security.spec.KeySpec; 4 5 import javax.crypto.Cipher; 6 import javax.crypto.Secre

RSA,JAVA私钥加密,C#公钥解密

做这个东西在坑里爬了3天才爬出来,记录下供园友参考.C#程序员一枚,项目需要和Java做数据交互,对方甩了段密文和一个CER证书给我,然后我要对其密文进行解密. RSA 非对称加密,对方用私钥加密,我用公钥解密.关于证书的一点说明:证书类型有两种 .pfx 和 .cer ,其中 .pfx 证书既包含公钥也包含私钥, 而 .cer 证书只包含公钥. C#默认RSA只支持公钥加密,私钥解密.而现在的需求正好相反,因此想要直接用C#内置加密类肯定是行不通的.而且C#和Java的RSA加密并不互通.经过

iOS 3DES加密解密(一行代码搞定)

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解:3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法. 3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密.数据加密标

iOS POS之3DES加密

最近在做支付类APP,遇到了很多以前没遇到过的东西.接下来我会用这系列文章来记录我所遇到的问题. 首先就是在组8583报文时用到的3DES加密.8583报文是以字节为单位的所以可能3DES加密会有稍许不同. 我自己搞这个问题也搞了两天,最后还是拜托一个高手给搞定的. 我在网上也搜了很多资料最后发现有一帖子很接近答案.链接如下: http://www.cocoachina.com/bbs/read.php?tid=245410 请教高手所做的就是把哈希那句给去掉然后稍微做下处理,有兴趣的同学可以自

(转)java源程序加密解决方案(基于Classloader解密)

转:http://cjnetwork.iteye.com/blog/851544 源程序加密解决方案 1. 概述: Java源程序的加密,有如下两种: 1使用混淆器对源码进行混淆,降低反编译工具的作用 2基于classloader的自定义加密.解密运行 1.1. 混淆器加密 1.2. 自定义classloader加密 1.2.1. 原理 原理:java虚拟机的动态加载机制,为classloader加密方案提供了理论基础.在jvm装载运行程序,初始的时候,只装在了必要的类,如java.lang.S