0 0

Java 三重DES(DESede,Triple DES)加密后,密文长度的困惑10

最近刚接触3DES加密.遇到一个问题,百般折腾,无果.
我的问题是:
通过3DES对长度为7或者8的字符数组加密,加密后应该都是8个字节啊.
为什么会不一样呢?

程序输出结果如下
对长度为7的字节数组加密,解密输出结果:
原明文byte[]长度:7	相应的16进制字符串值:0123456789abcd
加密后byte[]长度:8	相应的16进制字符串值:19dffce951d8c37d
解密后byte[]长度:7	相应的16进制字符串值:0123456789abcd


对长度为8的字节数组加密,解密输出结果:
原明文byte[]长度:8	相应的16进制字符串值:0123456789abcdef
加密后byte[]长度:16	相应的16进制字符串值:bb93c15e93aafe01c15629bc63a3c3c8
解密后byte[]长度:8	相应的16进制字符串值:0123456789abcdef


以下是源代码(也可以下载附件里的源码),代码复制即可执行.期待您的帮助
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class DESedeCoderTest {
	public static void main(String[] args) throws Exception {
		String sHexPlainText = "0123456789abcdef";
		SecretKey skSecretkey=(SecretKey)TDESCoder.generateKey(112);
		byte[] byteaPlainText = hexStr2ByteArr(sHexPlainText);
		byte[] byteaCryptograph = TDESCoder.enc(byteaPlainText, skSecretkey);
		byte[] byteaPlainTextAftDec = TDESCoder.dec(byteaCryptograph, skSecretkey);
		System.out.println("原明文byte[]长度:"+byteaPlainText.length+"\t相应的16进制字符串值:"+byteArr2HexStr(byteaPlainText));
		System.out.println("加密后byte[]长度:"+byteaCryptograph.length+"\t相应的16进制字符串值:"+byteArr2HexStr(byteaCryptograph));
		System.out.println("解密后byte[]长度:"+byteaPlainTextAftDec.length+"\t相应的16进制字符串值:"+byteArr2HexStr(byteaPlainTextAftDec));
	}
	public static String byteArr2HexStr(byte[] bytea) throws Exception {
		String sHex = "";
		int iUnsigned = 0;
		StringBuffer sbHex = new StringBuffer();
		for (int i = 0; i < bytea.length; i++) {
			iUnsigned = bytea[i];
			if (iUnsigned < 0) {
				iUnsigned += 256;
			}
			if (iUnsigned < 16) {
				sbHex.append("0");
			}
			sbHex.append(Integer.toString(iUnsigned, 16));
		}
		sHex = sbHex.toString();
		return sHex;
	}


	public static byte[] hexStr2ByteArr(String sHex) throws Exception {
		
		if(sHex.length()%2!=0){
			sHex="0"+sHex;
		}
		byte[] bytea =bytea=new byte[sHex.length() / 2];
		
		String sHexSingle = "";
		for (int i = 0; i < bytea.length; i++) {
			sHexSingle = sHex.substring(i * 2, i * 2 + 2);
			bytea[i] = (byte) Integer.parseInt(sHexSingle, 16);
		}
		return bytea;
	}
	 
}
class TDESCoder {
	private static final String S_KEY_ALGORITHM = "DESede";
	private static final String S_CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";
	private static SecretKey skSecretkey;
	public static byte[] enc(byte[] byteaPlainText,SecretKey skSecretkey) throws Exception {
		Cipher cipher = Cipher.getInstance(S_CIPHER_ALGORITHM);
		cipher.init(Cipher.ENCRYPT_MODE, skSecretkey);
		byte[] byteaCryptograph=cipher.doFinal(byteaPlainText);
		return byteaCryptograph;
	}
	
	public static byte[] dec(byte[] byteaCryptograph,SecretKey skSecretkey) throws Exception {
		Cipher cCipher = Cipher.getInstance(S_CIPHER_ALGORITHM);
		cCipher.init(Cipher.DECRYPT_MODE, skSecretkey);
		byte[] byteaPlainText=cCipher.doFinal(byteaCryptograph);
		return byteaPlainText;
	}

	public static Key generateKey(int iBits) throws Exception {
		iBits=112;
		KeyGenerator kg = KeyGenerator.getInstance(S_KEY_ALGORITHM);
		kg.init(iBits);
		skSecretkey = kg.generateKey();
		return   skSecretkey;
	}
}
2011年2月27日 14:46

4个答案 按时间排序 按投票排序

0 0

S_CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding"; 

重点是填充模式,你可以重点看下PKCS5Padding
des、3des是块加密,最小块是8 bytes,如果不足8,填充算法会补足8的倍数,当用8个字节原文进行加密后,填充算法是PKCS5Padding,那么会再填充8个字节,实际加密的是16个字节,你如果用NoPadding,8个字节明文就可以获得8个字节密文,妥妥滴

2016年11月18日 09:19
0 0

can i response ?

2016年11月18日 09:18
0 0

看看 正在寻找

2012年8月07日 20:52
0 0

3Des 加密结果都是8位么? 又不是MD5 Base64 不需要解密的那种.

2011年3月01日 16:07

相关推荐

Global site tag (gtag.js) - Google Analytics