0

我被要求验证加密是否正常。我得到了 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;
}
4

0 回答 0