我被要求验证加密是否正常。我得到238字节的输入十六进制文本。要求使用DESede / CBC / NoPadding算法。我也有加密值。当然,我也给了密钥(给定两个字节。添加第三个字节作为第一个字节的副本,使其成为三个字节)
(238字节+ 2字节填充)
问题是:我的代码中的加密值与给定的加密值不完全匹配(只有前56个字节匹配)。
我所做的是:解密给定的加密值和从我的代码生成的加密值。这两个解密值都与给定输入匹配。
这意味着,我有两个加密值,解密后的值相同。
使用Zeros的InitialVector。(8个零字节)。
有人可以投光吗?我相信我错过了一些东西。谢谢你的帮助。
使用javax.crypto.Cipher.getInstance获取Cipher实例。使用SecretKeyFactory和DESedeKeySpec类生成密钥
编辑:
public String encrypt(byte[] sourceDataInBytes, String keyInHex, String cryptoMode, String cryptoPadding)
{
Cipher des3cipher = null;
IvParameterSpec ivParamSpec = null;
String transformation = "DESede"+"/"+ cryptoMode+"/"+cryptoPadding;
byte[] encryptedDataInBytes = null;
try{
des3cipher = Cipher.getInstance(transformation);
Key key = generate3DESKey(keyInHex);
if(cryptoMode.equalsIgnoreCase("CBC"))
{
ivParamSpec = new IvParameterSpec(INITIAL_VECTOR_SALT);
des3cipher.init(CYPHER_ENCRYPT_MODE, key, (AlgorithmParameterSpec)ivParamSpec );
}else{
des3cipher.init(CYPHER_ENCRYPT_MODE, key);
}
if(cryptoPadding.equals("NoPadding")){'
sourceDataInBytes = addPadding(sourceDataInBytes, 8);
}
encryptedDataInBytes = des3cipher.doFinal(sourceDataInBytes);
}catch(Exception e){
e.printStackTrace();
}
return encryptedDataInBytes ;
}
public Key generate3DESKey(String srcInHex)
{
Key key = null;
if(src != null)
{
byte[] bk = null;
try{
bk = hexStringToByte(src + src.length==32 ? src.substring(0,16) : ""));
DESedeKeySpec des3KeySpec = new DESedeKeySpec(bk);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
key = keyFactory.generateSecret(des3KeySpec);
}catch(Exception e){
e,printStyackTrace();
}
}
return key;
}