Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中AES加密和解密的首选方法_Java_Aes_Encryption - Fatal编程技术网

Java中AES加密和解密的首选方法

Java中AES加密和解密的首选方法,java,aes,encryption,Java,Aes,Encryption,我编写了以下两种方法对给定令牌进行加密和解密: private static final String ALGORITHM_TYPE = "AES"; private static final String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding"; private static byte[] INITIALIZATION_VECTOR = new byte[] { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,

我编写了以下两种方法对给定令牌进行加密和解密:

private static final String ALGORITHM_TYPE = "AES";
private static final String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static byte[] INITIALIZATION_VECTOR = new byte[] {
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
public String encrypt(String token) {
    Cipher cipher = null;
    SecretKey key = null;
    String tokenAsHex = null;
    byte[] encryptedToken = null;
    byte[] sksKey = getKeyAsByteArray(KEY); // SecretKeySpec key.

    try {
        key = new SecretKeySpec(sksKey, ALGORITHM_TYPE);
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(INITIALIZATION_VECTOR);
        cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
        encryptedToken = cipher.doFinal(Base64.encodeBase64(token.getBytes("UTF-8")));
    } catch (Exception e) {
        throw new EncryptionException(e);
    }
    return Base64.encodeBase64String(encryptedToken).toLowerCase();
}

public String decrypt(String token) throws EncryptionException {
    Cipher cipher = null;
    SecretKey key = null;
    byte[] decryptedToken = null;
    byte[] sksKey = getKeyAsByteArray(KEY); // SecretKeySpec key.
    try {
        key = new SecretKeySpec(sksKey, ALGORITHM_TYPE);            
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(INITIALIZATION_VECTOR);
        cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        decryptedToken = cipher.doFinal(Base64.decodeBase64(token));
    } catch(Exception e){
        throw new EncryptionException(e);    
    }
    if (decryptedToken == null) {
         throw new EncryptionException("Unable to decrypt the following token: " + token);
    }
    return Base64.encodeBase64String(decryptedToken);
}
但是,我无法成功解密任何使用加密方法加密的字符串。我搜索了类似的问题,最近的发现是在这里:。即使使用了类似的策略,我仍然无法解密加密的字符串。如果有任何帮助,我们都将不胜感激


此外,我正在使用Base64对加密/解密的字节数组进行编码,而不是创建新字符串,因为后者会导致不安全的URL字符串。

您正在加密Base64编码,然后重新对其进行Base64编码,解密Base64解码,然后出于某种原因对其进行Base64编码。这没有道理。你应该:

  • base64编码加密,即基本上
    返回base64.encode(cipher.doFinal(…)
  • 解密(1)的base64解码,即本质上
    返回cipher.doFinal(base64.decode(…)

  • 我相应地更新了我的代码,但是,我仍然得到和以前一样的错误:考虑到最后一个块没有正确填充,我有一个疏忽,但是,您提供的步骤解决了我的问题。谢谢