用DES-JAVA加密数据

用DES-JAVA加密数据,java,encryption,des,Java,Encryption,Des,给出以下示例: String f="A000000000000000"; FileInputStream fis = new FileInputStream("C:\\Users\\original.txt"); byte[] bytes = DatatypeConverter.parseHexBinary(f); SecretKey key = new SecretKeySpec(bytes, 0, bytes.length, "DES"); String strDataToEncrypt

给出以下示例:

String f="A000000000000000";
FileInputStream fis = new FileInputStream("C:\\Users\\original.txt");
byte[] bytes = DatatypeConverter.parseHexBinary(f);
SecretKey key = new SecretKeySpec(bytes, 0, bytes.length, "DES");

String strDataToEncrypt = new String();
String strCipherText = new String();
String strDecryptedText = new String();

    try{

    Cipher desCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
    desCipher.init(Cipher.ENCRYPT_MODE,key);

            //read from file and transform to String
            try{
            builder = new StringBuilder();
            int ch;
            while((ch = fis.read()) != -1){
            builder.append((char)ch);
            }
            }catch (IOException e){

            }

    byte[] byteDataToEncrypt = builder.toString().getBytes();
    byte[] byteCipherText = desCipher.doFinal(byteDataToEncrypt); 
    strCipherText = new BASE64Encoder().encode(byteCipherText);

    System.out.println(strCipherText);
加密数据是不同的每次我用相同的密钥值编译时,我尝试了不同的代码,加密数据总是相同的,这里出了什么问题?

部分说:

如果此密码需要任何无法使用的算法参数 从给定密钥派生的基础密码实现是 假设生成所需参数本身(使用 提供程序特定的默认值或随机值)

DES CBC(密码块链接)模式需要初始化向量(IV)。如果您不提供一个(而且您不应该提供,因为这会让您打开大门),将生成一个随机的

但如果希望加密数据每次都相同,则需要使用
IvParameterSpec
指定IV:

byte[] iv = DatatypeConverter.parseHexBinary("0000000000000000");
IvParameterSpec ips = new IvParameterSpec(iv);
desCipher.init(Cipher.ENCRYPT_MODE, key, ips);

如果让它生成随机IV,则可以使用
desCipher.getIV()

检索生成的IV,除此之外,此代码不定义
fis
。这意味着这段代码无法编译,意味着没有人可以复制和研究这个问题,意味着你将得到远没有那么有用的答案。这是代码的一部分,定义了ofc
fis
。但是这里没有提到,问题在于加密只是为了补充,您可以使用
desCipher.getIV()
检索生成的iv。这很有道理,我想如果我不添加向量,默认情况下,他会接受“000000”,干杯David@FlorentBayle谢谢很高兴知道。我已经更新了我的答案以包含它。应该是desCipher.init(Cipher.ENCRYPT_MODE,key,ips);