JAVA使用不同的密钥加密字符串两次并解密它

时间:2015-12-11 09:56:52

标签: java encryption

我会使用AES算法使用2个不同的密钥对字符串进行两次加密。之后,我想使用加密方法用相同的2个密钥解密加密的字符串。 我使用了这个功能,它适用于一次加密和解密,但不适用于第二次加密/解密:



 public String encryptDecryptAes(String key , String input , int mode) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException, ShortBufferException, BadPaddingException, IllegalBlockSizeException {
        java.security.Security.addProvider(new BouncyCastleProvider());
        String result = null;
        byte[] inputBytes = input.getBytes();
        byte[] keyBytes = key.getBytes() ;

        SecretKeySpec secretKey = new SecretKeySpec(keyBytes , "AES") ;

        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

        if(mode==0) {

            //Encrypt
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);

             cipherText = new byte[cipher.getOutputSize(inputBytes.length)];
             ctLength = cipher.update(inputBytes, 0, inputBytes.length, cipherText, 0);
            ctLength += cipher.doFinal(cipherText, ctLength);
            result = new  String(cipherText);


        }

        if(mode==1) {

            //DECRYPT
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] output = new byte[cipher.getOutputSize(ctLength)];
            int ptLength = cipher.update(cipherText, 0, ctLength, output, 0);
            ptLength += cipher.doFinal(output, ptLength);
           result = new String(output);
        }

        return result ;
    }




1 个答案:

答案 0 :(得分:1)

执行加密应该可以无限次,因为您只是从纯文本开始并使用新的密文结束。解密时,您需要确保以相反的顺序使用密钥。该过程类似于以下内容:

从名为plainText的文本开始。

加密:

  • 使用密钥1加密plainText,存储在singleEncryption
  • 使用密钥2加密singleEncryption,以doubleEncryption存储

解密:

  • 使用密钥2解密doubleEncryption,存储在singleEncryption
  • 使用密钥1解密singleEncryption,以plainText
  • 存储

在此示例中使用变量是为了简化说明,并不要求您实际拥有多个文本副本。

编辑:如果您认为用于加密的密钥是堆栈,那么最后一个是第一个。