`

3DES 的加密算法

 
阅读更多
import java.security.Key;
import java.security.spec.KeySpec;
 
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
 
public class BcTest {
 
    // 3DES key = 00 01 02 03 04 05 06 07 01 02 03 04 05 06 07 08 02 03 04 05 06 07 08 09
    // data ("01234567") = 30 31 32 33 34 35 36 37
    // 3des cipher = 5a b3 fd 7b 2a ca b2 95
    // cipher mode = DESede/ECB/NoPadding
    public static void main(String[] args) throws Exception {
 
        byte[] key1 = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
        byte[] key2 = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
        byte[] key3 = new byte[] { 2, 3, 4, 5, 6, 7, 8, 9 };
        byte[] data = "01234567".getBytes();  // 由于未采用填充模式,因此原文长度必须为 8 的倍数
 
        // 3DES ciphertext = EK3(DK2(EK1(plaintext)))
        byte[] crypt = encrypt(decrypt(encrypt(data, key1), key2), key3);
 
        // 3DES plaintext = DK1(EK2(DK3(ciphertext)))
        byte[] plain = decrypt(encrypt(decrypt(crypt, key3), key2), key1);
 
        System.out.println("  key: " + ByteUtil.bytes2HexSpace(key1) + " "
                + ByteUtil.bytes2HexSpace(key2) + " "
                + ByteUtil.bytes2HexSpace(key3));
        System.out.println(" data: " + ByteUtil.bytes2HexSpace(data));
        System.out.println("crypt: " + ByteUtil.bytes2HexSpace(crypt));
        System.out.println("plain: " + ByteUtil.bytes2HexSpace(plain));
    }
 
    public static byte[] decrypt(byte[] crypt, byte[] key) throws Exception {
        Key k = toKey(key);
        Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, k);
        return cipher.doFinal(crypt);
    }
 
    public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
        Key k = toKey(key);
        Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, k);
        return cipher.doFinal(data);
    }
 
    public static SecretKey toKey(byte[] key) throws Exception {
        KeySpec dks = new DESKeySpec(key);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        return keyFactory.generateSecret(dks);
    }
}
 
class ByteUtil {
 
    private static final char HEX[] = "0123456789abcdef".toCharArray();
 
    public static String bytes2HexSpace(byte bys[]) {
        char chs[] = new char[(bys.length * 2 + bys.length) - 1];
        int i = 0;
        int offset = 0;
        for (; i < bys.length; i++) {
            if (i > 0)
                chs[offset++] = ' ';
            chs[offset++] = HEX[bys[i] >> 4 & 15];
            chs[offset++] = HEX[bys[i] & 15];
        }
        return new String(chs);
    }
}
上面DES的加密模式采用ECB,填充方式为不进行填充。

实际上JCE提供了3DES的加密算法,算法名为DESede,并不需要自己通过DES去实现3DES。只要把上面加密算法中有关DES改为DESede,toKey方法那个KeySpec的引用类由DESKeySpec改为DESedeKeySpec就可以了。

使用cipher可以很容易的实现3des加密,但是跟其他平台开发的3des加密对接来说,通常会有一些问题。基本的程序如下:

publicstaticbyte[]desEncrypt(Stringmessage,Stringkey)throwsException{
Ciphercipher
=Cipher.getInstance("DESede");

DESKeySpecdesKeySpec
=newDESKeySpec(key.getBytes("UTF-8"));
SecretKeyFactorykeyFactory
=SecretKeyFactory.getInstance("DESede");
SecretKeysecretKey
=keyFactory.generateSecret(desKeySpec);
cipher.init(Cipher.ENCRYPT_MODE,secretKey);

returncipher.doFinal(message.getBytes("UTF-8"));

我们跟其他平台对接发现对同样输入加密以后结果不同,看看jdk的文档,有如下描述:

A transformation is a string that describes the operation (or set of operations) to be performed on the given input, to produce some output.

A transformation is of the form:

  • "algorithm/mode/padding" or

  • "algorithm"

(in the latter case, provider-specific default values for the mode and padding scheme are used).

根据前面的代码,我们已经选择了正确的算法,那么加密不同的原因应该就是mode和padding了。

he SunJCE provider uses ECB as the default mode, and PKCS5Padding as the default padding scheme for DES, DES-EDE and Blowfish ciphers. This means that in the case of the SunJCE provider,
Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding");
and
Cipher c1 = Cipher.getInstance("DES");
are equivalent statements.

对于其他语言开发的3des,一定要采用相同的mode和padding才能保证通信。



分享到:
评论

相关推荐

    3DES加密算法C语言实现

    在C语言中实现3DES加密算法,可以确保在不同平台上的兼容性和一致性,尤其对于需要跨平台操作的应用场景,如将C语言代码移植到Android平台,通过JNI接口与Java代码交互,能够很好地解决加解密结果不一致的问题。...

    基于openssl的3DES加密算法

    3DES加密算法,使用openssl库,ECB算法,pkcs7padding填充模式(借鉴网上的算法,并经过自己的改良,可以实现加密与解密)

    3DES加密算法

    3DES(Triple DES)全称为三重数据加密标准,是DES(Data Encryption Standard)加密算法的一个变种。DES是一种块密码,它使用56位密钥对64位的数据块进行加密,但56位的密钥长度在现代密码学中被认为是不够安全的。...

    3des加密算法C语言实现

    在C语言中实现3DES加密算法,需要理解以下几个核心概念: 1. **DES算法**:DES是一种64位块密码,使用56位的密钥进行加密。它通过一系列的替换和置换操作,如初始置换、轮函数和逆初始置换,将明文转换为密文。 2....

    Java 3des加密算法ECB模式

    Java 3des加密算法ECB模式,亲测完美通过。目前网上的大部分算法都通不过或者加进Base64之类的,还要不下载其它jar包。而代码使用时直接下载运行,无须配置和下载额外的jar包 ,只需换上自己的密钥和待加密的数据...

    3DES加密算法完全解析

    3des加密算法及主要与那里解析,内附源码及十六进制算法解析!

    3DES加密算法 C++实现

    3DES(即Triple DES)是DES向AES过渡的加密算法,它使用3条64位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。

    3DES加密js前端示例

    以下是对3DES加密算法及其在JavaScript前端应用的详细说明: ### 1. 3DES工作原理 3DES由3个独立的DES加密过程组成,分为两个阶段:加密和解密。在加密过程中,数据首先用一个密钥进行DES加密,然后用第二个密钥...

    基于单片机的实时3DES 加密算法的实现

    ### 基于单片机的实时3DES加密算法实现 #### 1. 引言 随着信息技术的飞速发展,信息安全技术变得日益重要。单片机作为一种成熟且广泛应用的技术,在许多领域扮演着关键角色。然而,对于复杂的加密算法如3DES来说,...

    Android下3DES加密算法的JNI实现(完善版)

    之前上传过:编译Android下3DES加密算法的.SO文件及源码,地址:...压缩文件内包含编译后的lib3DES.so文件,3DES加密算法的JNI C语言源码,Android的makefile文件等。希望能够帮助到有需要的朋友!

    3DES加密算法C++实现

    总的来说,理解和实现3DES加密算法需要对位操作、循环和模式有深入的理解,同时需要关注加密过程中的安全性和效率。C++代码段可以作为一个学习和研究3DES的实用工具,帮助我们更好地理解加密算法的工作原理。

    3des加密算法源码

    3des加密算法源码,里面包含3des加密算法 和 解密算法。

    3des加密的C语言算法

    3des加密算法的C语言实现,很好很实用

    3DES加密算法源代码.rar

    了解并掌握3DES加密算法对于理解和实现其他更复杂的加密技术,如AES(Advanced Encryption Standard),也是非常有帮助的。同时,它对于信息安全专业人员来说,是必备的知识点,因为理解加密算法的工作原理可以帮助...

    3des加密算法

    3DES(Triple DES)全称为三重数据加密标准,是一种基于DES(Data Encryption Standard)的加强版加密算法。DES在1970年代被广泛使用,但由于其密钥长度相对较短(56位),在面临现代计算能力的挑战下,安全性受到了...

    3DES加密算法源码

    它相当于是对每个数据块应用三次DES加密算法。 最早的定义了该算法的标准(ANS X9.52,1998年发布)将其描述为“三重数据加密算法(TDEA)”— 即为ANSI X3.92中定义的数据加密算法(DEA)的三次重复操作— 而完全...

    3des加密算法(EDE)

    ### 3DES加密算法(EDE)知识点解析 #### 一、3DES算法概述 3DES(Triple Data Encryption Standard),即三重数据加密标准,是一种对称密钥算法,它是基于早期的DES(Data Encryption Standard)算法发展而来的。...

    3des加密算法cpp程序

    描述中提到的"3des加密算法cpp程序"可能存在的问题可能有以下几种情况: 1. **密钥管理不当**:3DES的密钥长度和管理非常重要,如果密钥过于简单或泄露,加密的安全性将大大降低。 2. **编码错误**:C++中处理字符...

    Java中3DES加密解密示例(封装byte数组16进制互转)

    在 Java 中,3DES 加密是一种常用的加密算法,它可以将明文数据转换为密文数据,以保护数据的安全性。在本示例中,我们将展示如何使用 3DES 算法在 Java 中实现加密和解密操作,并封装 byte 数组和 16 进制字符串...

Global site tag (gtag.js) - Google Analytics