在Java/grails中使用AES 128加密字符串

在Java/grails中使用AES 128加密字符串,java,grails,encryption,aes,Java,Grails,Encryption,Aes,我想在Java/Grails中使用AES 128加密3个字符串,并使用下面的代码,但我得到了错误“加密时出错”,有人能告诉我我的代码有什么问题,如何修复它吗。提前感谢Stackoverflow String url = "https://someurl.com" String token = createToken(bookNumber, invNumber, cusNumber) url += '?ref=' + token class AesEncryptor { st

我想在Java/Grails中使用AES 128加密3个字符串,并使用下面的代码,但我得到了错误“加密时出错”,有人能告诉我我的代码有什么问题,如何修复它吗。提前感谢Stackoverflow

 String url = "https://someurl.com"

 String token = createToken(bookNumber, invNumber, cusNumber)

 url += '?ref=' + token

class AesEncryptor {

    static byte[] encrypt(String clearText) {
            byte[] encrypted = null
            try {
                byte[] iv = new byte[16]
                Arrays.fill(iv, (byte) 0)

                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING")
                encrypted = cipher.doFinal(clearText.getBytes("UTF-8"))
            }
            catch (Exception e) {
                log.error "An error occurred when encrypting", e
            }
            encrypted
        }



    /**
         * Creates a token.
         * @return
         */
        static String createToken(final String bookNumber, final String invNumber, final String cusNumber) {
            String data =  bookNumber + invNumber + cusNumber
            String token = URLEncoder.encode(Base64.encodeBase64String(encrypt(data)), "UTF-8")
            token
        }
}
我得到的错误是:

java.lang.IllegalStateException: Cipher not initialized
    at javax.crypto.Cipher.checkCipherState(Cipher.java:1672)
    at javax.crypto.Cipher.doFinal(Cipher.java:2079)
    at javax.crypto.Cipher$doFinal$1.call(Unknown Source)

代码中缺少cipher.init方法调用。检查下面的代码

public byte[] encrypt(byte[] data, byte[] key) {
  Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"));
  return cipher.doFinal(data);
}

对于decrypt,必须将模式更改为Cipher.decrypt_模式,这是我得到的:java.lang.IllegalStateException:Cipher未在javax.crypto.Cipher.checkCipherState(Cipher.java:1672)在javax.crypto.Cipher.doFinal(Cipher.java:2079)在javax.crypto.Cipher$doFinal$1初始化。call(未知源代码)这对我有用,谢谢,但是是否总是需要钥匙参数?是,钥匙是必需的。没有密钥解密是不可能的。