用于 AES 加密的 Gradle 脚本

MrJ*_*rJM 3 encryption groovy android gradle android-gradle-plugin

对于 Android 应用程序,我想在使用 gradle 构建时混淆/加密服务器公钥。

现在我正在使用 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()
Run Code Online (Sandbox Code Playgroud)

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

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");
}
Run Code Online (Sandbox Code Playgroud)

在 gradle 脚本中使用 AES 加密我的密钥的正确方法是什么?谷歌帮不了我。这是可能的,还是我需要找到另一种解决方案?

Mar*_*her 5

这里有一个类似的问题,用于在 Java 中使用 AES 加密字符串。

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

它将SERVERKEY使用密钥加密字符串(在您的版本中从外部源加载它)KEY。我没有安装 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")
}
Run Code Online (Sandbox Code Playgroud)