Gradle AES 加密脚本

Gradle script for AES encryption

对于 Android 应用程序,我想在使用 gradle 构建时 obfuscate/encrypt 服务器 public 密钥。

现在我正在使用 Base64 进行混淆,但我需要额外的 AES

task encryptKeys {
    doFirst {

        //Encrypt the server key


        // Load key
        byte[] key = new File('project/keys/server.crt.der').bytes

        // Encode key twice
        String encoded = key.encodeBase64().toString();
        encoded = encoded.bytes.encodeBase64().toString();

        //TODO AES ENCRYPTION HERE

        // Save key
        new File('project/src/main/assets/server.crt.der').bytes = encoded.getBytes()

稍后在运行时使用此密钥时,我会像这样解密它

public static String decrypt(byte[] cipherText) throws Exception{
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
      SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
      cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(IV.getBytes("UTF-8")));
      return new String(cipher.doFinal(cipherText),"UTF-8");
}

在 gradle 脚本中使用 AES 加密我的密钥的正确方法是什么? Google 帮不了我。这是完全可能的还是我需要找到其他解决方案?

在 java 中有类似的 SO question here 用于使用 AES 加密字符串。

我已将其采用到下面的 gradle 脚本中。

它将使用密钥 KEY 加密 SERVERKEY 字符串(在您的版本中从外部源加载)。我没有安装 BouncyCastle,所以我使用了 SunJCE,但我将它保留为参数,以便您可以轻松更改它。

这个简单案例的输出是文件 "obf.enc"。 decIt 任务也将解密并打印出来以表明它是对称工作的。

你最困难的部分显然是你的 KEY 用于加密的事实嵌入在你的应用程序中(因此我在评论中提出问题),所以这只是通过默默无闻的安全性,但如果这对应用程序来说足够好,就这样吧。

import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec
import javax.crypto.Cipher

ext {
    KEY = "mysecretkey".padRight(16).getBytes("UTF-8")
    SERVERKEY = "serverkey"
    IV = "1234".padRight(16).getBytes("UTF-8")
    PROVIDER = "SunJCE"
}

task encIt << {
    SecretKeySpec key = new SecretKeySpec(KEY, "AES")
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", PROVIDER)
    cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(IV))
    def encBytes = cipher.doFinal(SERVERKEY.bytes)
    def out = file('obf.enc')
    out.delete()
    out << encBytes
}

task decIt << {
    def cipherText = file('obf.enc').bytes
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", PROVIDER)
    SecretKeySpec key = new SecretKeySpec(KEY, "AES")
    cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(IV))
    println new String(cipher.doFinal(cipherText), "UTF-8")
}