使用Java中的双倍长度3DES密钥加密并生成16字节数组密码

时间:2017-07-27 13:29:16

标签: java encryption 3des

我需要使用16字节的数组密钥材料在Java中创建一个双倍长度的3DES密钥,用它加密消息并返回16字节长度的数组。我能够使用24个字节而不是16个字节...

因为DESede需要24字节[],这是产生具有16字节长密钥材料的双倍长度3DES密钥的唯一方法,我能够通过使用DESede实例然后通过在前面添加前8个字节来增加其长度。结束得到24个字节。像这样:

    byte[] keyMaterial = // Assume this one is 16 bytes. 

    byte[] newKeyBytes = ByteBuffer.wrap( new byte[ 24 ] )
            .put( Arrays.copyOfRange( keyMaterial, 0, 16 ) )
            .put( Arrays.copyOfRange( keyMaterial, 0, 8 ) )
            .array();

    SecretKeyFactory mySecretKeyFactory = SecretKeyFactory.getInstance( "DESede" );
    KeySpec myKeySpec = new DESedeKeySpec( newKeyBytes );
    SecretKey encryptionKey = mySecretKeyFactory.generateSecret( myKeySpec );

现在,当我拥有我的DESede密钥时,我可以使用它以下列方式加密消息。另外,我需要使用“ECB”模式:

    Cipher cipher = Cipher.getInstance( "DESede/ECB/PKCS5Padding" );
    cipher.init( Cipher.ENCRYPT_MODE, encryptionKey );
    byte[] returnValue = cipher.doFinal( dataToEncrypt )

但结果我得到了24字节数组而不是16字节数组,我猜这是因为我用24字节数组进行加密。

有没有办法创建一个16字节而不是24字节的3DES SecretKey,或者当使用24字节长的SecretKey进行加密时,根据需要获取一个16字节长的加密消息而不是24字节长?

谢谢!

1 个答案:

答案 0 :(得分:1)

我想我刚刚找到了问题的答案。

https://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html

我使用了DESede / ECB / NoPadding,当与NoPadding一起使用时,然后用24字节加密一个16字节的数组消息SecretKey产生一个16字节长的密码消息,这正是我需要的。

我希望这个发现是正确的。如果我弄错了,请纠正我。