• apk里的data.unity3d贴图文件如何加密?


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 Ae426 2024-04-16 15:35 采纳率: 0% 浏览 3 首页/ 编程语言 / apk里的data.unity3d贴图文件如何加密? javaunity 咨询一下各位,apk里assets文件夹里的data.unity3d贴图文件是否能够进行加密?且在加密过后还可正常运行apk。 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-16 15:35
      关注

      引自免费微信小程序:皆我百晓生

      为了对APK中的Unity3D游戏资源(如data.unity3d文件)进行加密,您可以采用一种名为"提前解密"的方法。这种方法的基本思想是在程序启动时加载加密后的数据,并将其解密到内存中供游戏使用。这样可以增加破解者的难度,但并不能完全阻止他们获取原始数据。

      首先,你需要准备一个加密库。这里我们推荐使用Java的内置加密API,如AES (Advanced Encryption Standard)。以下是加密和解密函数的示例代码:

      import javax.crypto.Cipher;
      import javax.crypto.spec.SecretKeySpec;
      import java.security.Key;
      
      public class AESUtil {
      
          private static final String ALGORITHM = "AES";
          private static final byte[] keyValue = 
              new byte[] { 'T', 'h', 'i', 's', 'I', 's', 'A', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y' };
      
          public static String encrypt(String valueToEnc) throws Exception {
              Key key = generateKey();
              Cipher c = Cipher.getInstance(ALGORITHM);
              c.init(Cipher.ENCRYPT_MODE, key);
              byte[] encValue = c.doFinal(valueToEnc.getBytes());
              String encryptedValue = Base64.getEncoder().encodeToString(encValue);
              return encryptedValue;
          }
      
          public static String decrypt(String encryptedValue) throws Exception {
              Key key = generateKey();
              Cipher c = Cipher.getInstance(ALGORITHM);
              c.init(Cipher.DECRYPT_MODE, key);
              byte[] decordedValue = Base64.getDecoder().decode(encryptedValue);
              byte[] decValue = c.doFinal(decordedValue);
              String decryptedValue = new String(decValue);
              return decryptedValue;
          }
      
          private static Key generateKey() throws Exception {
              Key key = new SecretKeySpec(keyValue, ALGORITHM);
              return key;
          }
      }
      

      接下来,在你的Android项目中,你需要在应用程序启动时执行以下步骤:

      1. 加载并解密data.unity3d文件。
      2. 将解密后的数据保存到内存中,例如使用Bitmap对象(对于图片)或将字节数组转换为其他格式(根据你的具体需求)。
      3. 在游戏中,从内存中读取这些已解密的数据,而不是从磁盘上未解密的文件。

      下面是一个简单的示例,展示如何解密并显示一个图片:

      // 假设你有一个FileInputStream对象,它指向data.unity3d文件
      FileInputStream fis = new FileInputStream("path_to_your_data.unity3d");
      byte[] encryptedData = new byte[(int) fis.length()];
      fis.read(encryptedData);
      
      try {
          // 使用AESUtil类解密数据
          String decryptedData = AESUtil.decrypt(new String(encryptedData));
          
          // 将解密后的字符串转换回字节数组
          byte[] decodedBytes = Base64.getDecoder().decode(decryptedData);
      
          // 创建一个输入流,以便我们可以创建Bitmap
          InputStream is = new ByteArrayInputStream(decodedBytes);
      
          // 解码字节数组为Bitmap
          Bitmap bitmap = BitmapFactory.decodeStream(is);
      
          // 现在你可以将这个Bitmap设置为ImageView或其他需要的地方
          ImageView imageView = findViewById(R.id.your_image_view_id);
          imageView.setImageBitmap(bitmap);
      
      } catch (Exception e) {
          e.printStackTrace();
      } finally {
          try {
              fis.close();
          } catch (IOException ex) {
              ex.printStackTrace();
          }
      }
      

      注意:这种方法并不能提供绝对的安全性,因为攻击者仍然可以通过逆向工程找到解密逻辑。然而,这可以增加破解的复杂性和时间成本,从而提高安全性。此外,你应该考虑使用HTTPS传输数据以保护它们在网络上传输时的安全性。

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-16 15:36
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      针对此问题,我的回答如下:

      1.在APK里的assets文件夹里的data.unity3d贴图文件可以进行加密,但需要注意的是,加密后需要使用相应的解密算法进行解密。

      2.加密方式有很多种,可以使用对称加密算法,如AES、DES等,也可以使用非对称加密算法,如RSA等。

      3.加密后的文件需要在运行时进行解密,可以使用第三方解密库或自己编写解密算法。

      4.加密后的贴图文件需要在代码中进行对应处理,例如在Unity中使用WWW加载时需要在URL中指定解密后的路径或使用自定义的AssetBundle加载方式。

      5.需要对Android系统版本做出限制,只允许在支持加密算法的版本上正常运行加密后的APK。

      6.需要注意处理加密后的文件大小及解密速度对应用性能的影响。

      7.如果需要更高的安全性,可以考虑使用专门的加密方案,如加密芯片、加密硬件等。

      8.如果需要具体实现方案,可以咨询安全专家或加密服务提供商。

      代码示例:

      对称加密:

      private static string AES_KEY = "0123456789abcdef";
      
      public static void encryptFile(string inputFile, string outputFile)
      {
          byte[] key = Encoding.UTF8.GetBytes(AES_KEY);
          byte[] iv = Encoding.UTF8.GetBytes(AES_KEY);
          using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
          {
              aes.Key = key;
              aes.IV = iv;
              using (FileStream fsIn = new FileStream(inputFile, FileMode.Open))
              using (FileStream fsOut = new FileStream(outputFile, FileMode.Create))
              using (ICryptoTransform encryptor = aes.CreateEncryptor())
              using (CryptoStream cs = new CryptoStream(fsOut, encryptor, CryptoStreamMode.Write))
              {
                  fsOut.Write(BitConverter.GetBytes(fsIn.Length), 0, sizeof(Int64));
                  byte[] buffer = new byte[1024 * 1024];
                  int read;
                  while ((read = fsIn.Read(buffer, 0, buffer.Length)) > 0)
                  {
                      cs.Write(buffer, 0, read);
                  }
              }
          }
      }
      
      public static void decryptFile(string inputFile, string outputFile)
      {
          byte[] key = Encoding.UTF8.GetBytes(AES_KEY);
          byte[] iv = Encoding.UTF8.GetBytes(AES_KEY);
          using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
          {
              aes.Key = key;
              aes.IV = iv;
              using (FileStream fsIn = new FileStream(inputFile, FileMode.Open))
              using (FileStream fsOut = new FileStream(outputFile, FileMode.Create))
              using (ICryptoTransform decryptor = aes.CreateDecryptor())
              using (CryptoStream cs = new CryptoStream(fsIn, decryptor, CryptoStreamMode.Read))
              {
                  byte[] lengthBytes = new byte[sizeof(Int64)];
                  fsIn.Read(lengthBytes, 0, lengthBytes.Length);
                  Int64 length = BitConverter.ToInt64(lengthBytes, 0);
                  byte[] buffer = new byte[1024 * 1024];
                  int read;
                  while ((read = cs.Read(buffer, 0, buffer.Length)) > 0)
                  {
                      fsOut.Write(buffer, 0, read);
                  }
                  fsOut.SetLength(length);
              }
          }
      }
      

      非对称加密(RSA):

      private static string RSA_XML_PRIVATE_KEY = "......

      ...

      ...............
      "; private static string RSA_XML_PUBLIC_KEY = "......"; public static void encryptFile(string inputFile, string outputFile) { using (RSA rsa = RSA.Create()) { rsa.FromXmlString(RSA_XML_PUBLIC_KEY); using (FileStream fsIn = new FileStream(inputFile, FileMode.Open)) using (FileStream fsOut = new FileStream(outputFile, FileMode.Create)) { byte[] buffer = new byte[128 - 11]; while (fsIn.Position < fsIn.Length) { int read = fsIn.Read(buffer, 0, buffer.Length); byte[] encrypted = rsa.Encrypt(buffer, RSAEncryptionPadding.Pkcs1); fsOut.Write(encrypted, 0, encrypted.Length); } } } } public static void decryptFile(string inputFile, string outputFile) { using (RSA rsa = RSA.Create()) { rsa.FromXmlString(RSA_XML_PRIVATE_KEY); using (FileStream fsIn = new FileStream(inputFile, FileMode.Open)) using (FileStream fsOut = new FileStream(outputFile, FileMode.Create)) { byte[] buffer = new byte[128]; while (fsIn.Position < fsIn.Length) { int read = fsIn.Read(buffer, 0, buffer.Length); byte[] decrypted = rsa.Decrypt(buffer, RSAEncryptionPadding.Pkcs1); fsOut.Write(decrypted, 0, decrypted.Length); } } } }

      展开全部

      评论
    • GISer Liu 2024-04-16 16:38
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      针对您的问题,我会提供详细的解决思路和方案。
      问题分析: 您想要加密APK中的``` data.unity3d

      ```贴图文件,并确保加密后的文件能够正常运行在APK中。这个问题涉及到文件加密和APK构建的相关知识。
      解决方案: 下面是我提供的解决方案:

      1. 文件加密: 首先,您需要选择一种适合的加密算法对data.unity3d文件进行加密。常见的加密算法有对称加密算法和非对称加密算法。对称加密算法的特点是加解密使用相同的密钥,而非对称加密算法则使用公钥和私钥对。在这种情况下,您可能更倾向于选择对称加密算法,因为您需要在APK中解密这些文件,而密钥需要保持在APK内部,非对称加密算法可能会增加复杂度。
      2. 集成加密解密逻辑: 在您的应用中集成加密解密逻辑。您需要确保APK中有足够的逻辑来解密这些文件,并在应用程序中使用解密后的文件。这意味着您需要在应用程序中添加逻辑来解密文件,并在需要时使用解密后的内容。这可能需要您修改您的应用程序代码,并确保解密过程不会影响应用程序的性能和稳定性。
      3. 测试和调试: 在应用程序中加入文件解密逻辑后,您需要进行充分的测试和调试,确保加密和解密过程都能正常工作,并且解密后的文件能够被正确地使用。您需要在不同的设备上测试您的应用程序,以确保加密和解密过程在各种环境下都能正常运行。
      4. 保护密钥: 您需要确保密钥的安全性,以防止它被恶意获取。您可以采取一些措施来保护密钥,比如将其硬编码到应用程序中,使用代码混淆等方式来防止密钥被轻易获取。
      5. 用户体验考虑: 加密文件可能会增加应用程序的启动时间和内存占用,因此您需要在加密和解密过程中权衡安全性和用户体验。确保加密和解密过程不会对应用程序的性能和响应时间产生明显的影响。
      6. 文档和支持: 最后,您可能需要提供文档和支持,以帮助其他开发人员理解和集成您的加密解密逻辑。您可以编写详细的文档,解释加密和解密过程的细节,并提供示例代码和支持。
        综上所述,这个问题涉及到文件加密和APK构建的多个方面。您需要选择合适的加密算法,集成加密解密逻辑,进行测试和调试,保护密钥,考虑用户体验,并提供文档和支持。希望以上解决方案对您有所帮助。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    动态规划算法
    以太坊学习三: Merkle树和验证
    编程小白的自学笔记十四(python办公自动化创建、复制、移动文件和文件夹)
    大数计算:e^1000/300!
    LabVIEW关于USRPRIO的示例代码
    能不能手写Vue响应式?前端面试进阶
    冥想第六百一十一天
    Java学习笔记------抽象类和抽象方法
    k8s实战入门
    Android系统10 RK3399 init进程启动(三十五) 属性文件介绍和生成过程
  • 原文地址:https://ask.csdn.net/questions/8089395