浏览代码

秘钥文件解析:读取秘钥文件成json对象,对数据进行解密,导入数据库,获取产品信息、授权期限、授权内容等信息

wangpenghui 1 年之前
父节点
当前提交
ba6adcc3dd
共有 24 个文件被更改,包括 420 次插入0 次删除
  1. 21 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/controller/VppKeyFileController.java
  2. 13 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/LicenseCodesSubclass.java
  3. 14 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/OrdersSubclass.java
  4. 14 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/SubscriptionsSubclass.java
  5. 13 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/VppCompanySubclass.java
  6. 13 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/VppMemberSubclass.java
  7. 12 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/VppRTeamMemberRoleSubclass.java
  8. 13 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/VppTeamSubclass.java
  9. 10 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/OrderService.java
  10. 2 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/SubscriptionService.java
  11. 1 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/VppCompanyService.java
  12. 17 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/VppKeyFileService.java
  13. 2 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/VppLicenseCodeService.java
  14. 2 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/VppRTeamMemberRoleService.java
  15. 2 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/VppTeamService.java
  16. 25 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/OrderServiceImpl.java
  17. 5 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/SubscriptionServiceImpl.java
  18. 5 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/VppCompanyServiceImpl.java
  19. 64 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/VppKeyFileServiceImpl.java
  20. 5 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/VppLicenseCodeServiceImpl.java
  21. 5 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/VppRTeamMemberRoleServiceImpl.java
  22. 5 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/VppTeamServiceImpl.java
  23. 123 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/utils/KeyFileParseUtils.java
  24. 34 0
      pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/utils/RSAUtils.java

+ 21 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/controller/VppKeyFileController.java

@@ -0,0 +1,21 @@
+package cn.kdan.pdf.tech.core.controller;
+
+import cn.kdan.pdf.tech.core.service.VppKeyFileService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author ComPDFKit-WPH 2024/1/2
+ * <p>
+ * KeyFileController
+ */
+@RestController
+@RequestMapping("vppKeyFile")
+@RequiredArgsConstructor
+public class VppKeyFileController {
+
+    private final VppKeyFileService vppKeyFileService;
+
+
+}

+ 13 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/LicenseCodesSubclass.java

@@ -0,0 +1,13 @@
+package cn.kdan.pdf.tech.core.pojo.subclass;
+
+import cn.kdan.pdf.tech.core.model.LicenseCodes;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class LicenseCodesSubclass extends LicenseCodes implements Serializable  {
+
+}

+ 14 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/OrdersSubclass.java

@@ -0,0 +1,14 @@
+package cn.kdan.pdf.tech.core.pojo.subclass;
+
+import cn.kdan.pdf.tech.core.model.Orders;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class OrdersSubclass extends Orders implements Serializable {
+
+}

+ 14 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/SubscriptionsSubclass.java

@@ -0,0 +1,14 @@
+package cn.kdan.pdf.tech.core.pojo.subclass;
+
+import cn.kdan.pdf.tech.core.model.Subscriptions;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class SubscriptionsSubclass extends Subscriptions implements Serializable {
+
+}

+ 13 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/VppCompanySubclass.java

@@ -0,0 +1,13 @@
+package cn.kdan.pdf.tech.core.pojo.subclass;
+
+import cn.kdan.pdf.tech.core.model.VppCompany;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class VppCompanySubclass extends VppCompany implements Serializable {
+
+}

+ 13 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/VppMemberSubclass.java

@@ -0,0 +1,13 @@
+package cn.kdan.pdf.tech.core.pojo.subclass;
+
+import cn.kdan.pdf.tech.core.model.VppMember;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class VppMemberSubclass extends VppMember implements Serializable {
+
+}

+ 12 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/VppRTeamMemberRoleSubclass.java

@@ -0,0 +1,12 @@
+package cn.kdan.pdf.tech.core.pojo.subclass;
+
+import cn.kdan.pdf.tech.core.model.VppRTeamMemberRole;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+
+import java.io.Serializable;
+
+@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class VppRTeamMemberRoleSubclass extends VppRTeamMemberRole implements Serializable {
+
+}

+ 13 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/pojo/subclass/VppTeamSubclass.java

@@ -0,0 +1,13 @@
+package cn.kdan.pdf.tech.core.pojo.subclass;
+
+import cn.kdan.pdf.tech.core.model.VppTeam;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class VppTeamSubclass extends VppTeam implements Serializable {
+
+}

+ 10 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/OrderService.java

@@ -0,0 +1,10 @@
+package cn.kdan.pdf.tech.core.service;
+
+import cn.kdan.pdf.tech.core.model.Orders;
+
+/**
+ * @author ComPDFKit-WPH 2024/1/2
+ */
+public interface OrderService {
+    void insert(Orders order);
+}

+ 2 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/SubscriptionService.java

@@ -27,4 +27,6 @@ public interface SubscriptionService {
     PageInfo<SubscriptionResellerVO> pageForReseller(Integer page, Integer pageSize, String code);
 
     Subscriptions getById(String id);
+
+    void insert(Subscriptions subscription);
 }

+ 1 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/VppCompanyService.java

@@ -30,4 +30,5 @@ public interface VppCompanyService {
      */
     List<VppTeamMenberVO> getComponyMenber();
 
+    void insert(VppCompany vppCompany);
 }

+ 17 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/VppKeyFileService.java

@@ -0,0 +1,17 @@
+package cn.kdan.pdf.tech.core.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @author ComPDFKit-WPH 2024/1/2
+ */
+public interface VppKeyFileService {
+
+    /**
+     * 上传密钥文件
+     *
+     * @param keyFile 密钥文件
+     * @param updateOrInit 是否更新或初始化 更新:true, 初始化:false
+     */
+    void parseKeyFile(MultipartFile keyFile, boolean updateOrInit);
+}

+ 2 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/VppLicenseCodeService.java

@@ -161,4 +161,6 @@ public interface VppLicenseCodeService {
      * @param licenseCodeId 序列码id
      */
     void disable(String licenseCodeId);
+
+    void insert(LicenseCodes licenseCode);
 }

+ 2 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/VppRTeamMemberRoleService.java

@@ -178,4 +178,6 @@ public interface VppRTeamMemberRoleService {
      * @return List
      */
     List<VppRTeamMemberRole> listByTeamIdWithoutSuperAdmin(String teamId);
+
+    void insert(VppRTeamMemberRole vppRTeamMemberRole);
 }

+ 2 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/VppTeamService.java

@@ -134,4 +134,6 @@ public interface VppTeamService {
      * @return VppTeam
      */
     VppTeam getDefaultTeam(String memberId);
+
+    void insert(VppTeam vppTeam);
 }

+ 25 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/OrderServiceImpl.java

@@ -0,0 +1,25 @@
+package cn.kdan.pdf.tech.core.service.impl;
+
+import cn.kdan.pdf.tech.core.mapper.OrdersMapper;
+import cn.kdan.pdf.tech.core.mapper.ext.ExtVppSubscriptionMapper;
+import cn.kdan.pdf.tech.core.model.Orders;
+import cn.kdan.pdf.tech.core.service.OrderService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author ComPDFKit-WPH 2024/1/2
+ */
+@Slf4j
+@Service
+public class OrderServiceImpl implements OrderService {
+
+    @Autowired
+    private OrdersMapper orderMapper;
+
+    @Override
+    public void insert(Orders order) {
+        orderMapper.insert(order);
+    }
+}

+ 5 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/SubscriptionServiceImpl.java

@@ -106,5 +106,10 @@ public class SubscriptionServiceImpl implements SubscriptionService {
         return vppSubscriptionMapper.selectByPrimaryKey(id);
     }
 
+    @Override
+    public void insert(Subscriptions subscription) {
+        vppSubscriptionMapper.insert(subscription);
+    }
+
 
 }

+ 5 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/VppCompanyServiceImpl.java

@@ -68,4 +68,9 @@ public class VppCompanyServiceImpl implements VppCompanyService {
         }
         return vppTeamMenberVOList;
     }
+
+    @Override
+    public void insert(VppCompany vppCompany) {
+        vppCompanyMapper.insert(vppCompany);
+    }
 }

+ 64 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/VppKeyFileServiceImpl.java

@@ -0,0 +1,64 @@
+package cn.kdan.pdf.tech.core.service.impl;
+
+import cn.kdan.pdf.tech.core.model.*;
+import cn.kdan.pdf.tech.core.service.*;
+import cn.kdan.pdf.tech.core.utils.KeyFileParseUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.InputStream;
+import java.util.List;
+
+/**
+ * @author ComPDFKit-WPH 2024/1/2
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class VppKeyFileServiceImpl implements VppKeyFileService {
+
+    private final VppCompanyService vppCompanyService;
+    private final VppMemberService vppMemberService;
+    private final VppTeamService vppTeamService;
+    private final VppRTeamMemberRoleService vppRTeamMemberRoleService;
+    private final OrderService orderService;
+    private final SubscriptionService subscriptionService;
+    private final VppLicenseCodeService licenseService;
+
+    @Transactional
+    @Override
+    public void parseKeyFile(MultipartFile keyFile, boolean updateOrInit) {
+        KeyFileParseUtils.FileContent fileContent;
+        try (InputStream inputStream = keyFile.getInputStream()) {
+            fileContent = KeyFileParseUtils.parseKeyFile(inputStream, updateOrInit);
+        } catch (Exception e) {
+            log.error("解析key文件失败, ".concat(e.getMessage()), e);
+            throw new RuntimeException("The key file signature is invalid.");
+        }
+        if (!updateOrInit) {
+            VppCompany vppCompany = fileContent.getVppCompany();
+            VppMember vppMember = fileContent.getVppMember();
+            VppTeam vppTeam = fileContent.getVppTeam();
+            VppRTeamMemberRole vppRTeamMemberRole = fileContent.getVppRTeamMemberRole();
+
+            vppCompanyService.insert(vppCompany);
+            vppMemberService.insert(vppMember);
+            vppTeamService.insert(vppTeam);
+            vppRTeamMemberRoleService.insert(vppRTeamMemberRole);
+        }
+
+        Orders order = fileContent.getOrders();
+        Subscriptions subscription = fileContent.getSubscriptions();
+        List<? extends LicenseCodes> licenseCodes = fileContent.getLicenseCodesList();
+        orderService.insert(order);
+        subscriptionService.insert(subscription);
+
+        for (LicenseCodes licenseCode : licenseCodes) {
+            licenseService.insert(licenseCode);
+        }
+    }
+
+}

+ 5 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/VppLicenseCodeServiceImpl.java

@@ -601,4 +601,9 @@ public class VppLicenseCodeServiceImpl implements VppLicenseCodeService {
         // 解绑激活设备
         vppDeviceService.unBindByMemberId(null, Collections.singletonList(code.getCdkey()));
     }
+
+    @Override
+    public void insert(LicenseCodes licenseCode) {
+        licenseCodeMapper.insert(licenseCode);
+    }
 }

+ 5 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/VppRTeamMemberRoleServiceImpl.java

@@ -597,5 +597,10 @@ public class VppRTeamMemberRoleServiceImpl implements VppRTeamMemberRoleService
         return vppRTeamMemberRoleMapper.selectByExample(example);
     }
 
+    @Override
+    public void insert(VppRTeamMemberRole vppRTeamMemberRole) {
+        vppRTeamMemberRoleMapper.insert(vppRTeamMemberRole);
+    }
+
 
 }

+ 5 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/service/impl/VppTeamServiceImpl.java

@@ -934,4 +934,9 @@ public class VppTeamServiceImpl implements VppTeamService {
         return vppTeamMapper.selectByExample(example).get(0);
     }
 
+    @Override
+    public void insert(VppTeam vppTeam) {
+        vppTeamMapper.insert(vppTeam);
+    }
+
 }

+ 123 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/utils/KeyFileParseUtils.java

@@ -0,0 +1,123 @@
+package cn.kdan.pdf.tech.core.utils;
+
+import cn.kdan.pdf.tech.core.model.*;
+import cn.kdan.pdf.tech.core.pojo.subclass.*;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import exception.BackendRuntimeException;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import utils.JsonUtils;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Objects;
+import java.util.Properties;
+
+/**
+ * @author ComPDFKit-WPH 2024/1/2
+ * <p>
+ * 密钥文件解析工具类
+ */
+@Slf4j
+public class KeyFileParseUtils {
+
+    /**
+     * 读取文件配置
+     * <p>
+     * 不会释放流资源
+     *
+     * @param is           文件流
+     * @param updateOrInit 是否更新或初始化 更新:true, 初始化:false
+     * @return 解析只后得信息
+     * @throws Exception 异常
+     */
+    public static FileContent parseKeyFile(InputStream is, boolean updateOrInit) throws Exception {
+        // 读取数据
+        Properties properties = new Properties();
+        properties.load(is);
+
+        // 验证签名合法性
+        String signJsonStr = new RSAUtils().decryptSplit(properties.getProperty("Sign"));
+        String serverID = properties.getProperty("ServerID");
+        String licenseDate = properties.getProperty("LicenseDate");
+        String expireDate = properties.getProperty("ExpireDate");
+        String users = properties.getProperty("Users");
+        Sign sign = JsonUtils.jsonStringToBean(signJsonStr, Sign.class);
+        if (!(Objects.deepEquals(sign.getServerID(),serverID)
+                && Objects.deepEquals(sign.getLicenseDate(),licenseDate)
+                && Objects.deepEquals(sign.getExpireDate(),expireDate)
+                && Objects.deepEquals(sign.getUsers(),users))) {
+            throw new BackendRuntimeException("The key file signature is invalid.");
+        }
+        FileContent fileContent = new FileContent();
+        // 是否是更新?
+        if (!updateOrInit) {
+            // 获取只有Init时才有的字段
+            String companyJsonStr = new RSAUtils().decryptSplit(properties.getProperty("Company"));
+            String memberJsonStr = new RSAUtils().decryptSplit(properties.getProperty("Member"));
+            String teamJsonStr = new RSAUtils().decryptSplit(properties.getProperty("Team"));
+            String relationJsonStr = new RSAUtils().decryptSplit(properties.getProperty("Relation"));
+            // json 转换
+            VppCompany vppCompany = JsonUtils.jsonStringToBean(companyJsonStr, VppCompanySubclass.class);
+            VppMember vppMember = JsonUtils.jsonStringToBean(memberJsonStr, VppMemberSubclass.class);
+            VppTeam vppTeam =  JsonUtils.jsonStringToBean(teamJsonStr, VppTeamSubclass.class);
+            VppRTeamMemberRole vppRTeamMemberRole = JsonUtils.jsonStringToBean(relationJsonStr, VppRTeamMemberRoleSubclass.class);
+            fileContent.setVppCompany(vppCompany);
+            fileContent.setVppMember(vppMember);
+            fileContent.setVppTeam(vppTeam);
+            fileContent.setVppRTeamMemberRole(vppRTeamMemberRole);
+        }
+        // 获取通用数据
+        String orderJsonStr = new RSAUtils().decryptSplit(properties.getProperty("Order"));
+        String subscriptionJsonStr = new RSAUtils().decryptSplit(properties.getProperty("Subscription"));
+        String licenseJsonStr = new RSAUtils().decryptSplit(properties.getProperty("License"));
+        // json 转换
+        Orders order = JsonUtils.jsonStringToBean(orderJsonStr, OrdersSubclass.class);
+        Subscriptions subscription = JsonUtils.jsonStringToBean(subscriptionJsonStr, SubscriptionsSubclass.class);
+        List<LicenseCodesSubclass> licenseCodesList = JsonUtils.jsonStringToList(licenseJsonStr, LicenseCodesSubclass.class);
+        fileContent.setOrders(order);
+        fileContent.setSubscriptions(subscription);
+        fileContent.setLicenseCodesList(licenseCodesList);
+        // 返回数据
+        return fileContent;
+    }
+
+    @Data
+    static
+    class Sign {
+        @JsonProperty("ServerID")
+        private String serverID;
+        @JsonProperty("LicenseDate")
+        private String licenseDate;
+        @JsonProperty("ExpireDate")
+        private String expireDate;
+        @JsonProperty("Users")
+        private String users;
+    }
+
+    @Data
+    public
+    static
+    class FileContent {
+        private VppCompany vppCompany;
+        private VppMember vppMember;
+        private VppTeam vppTeam;
+        private VppRTeamMemberRole vppRTeamMemberRole;
+        private Orders orders;
+        private Subscriptions subscriptions;
+        private List<? extends LicenseCodes> licenseCodesList;
+    }
+
+
+    public static void main(String[] args) {
+        try (InputStream is = new FileInputStream("pengjanyon@kdanmobile.com1704179596.txt")) {
+            FileContent o = parseKeyFile(is, false);
+            System.out.println(o);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+
+}

+ 34 - 0
pdf-tech-core/src/main/java/cn/kdan/pdf/tech/core/utils/RSAUtils.java

@@ -11,6 +11,9 @@ import java.nio.charset.StandardCharsets;
 import java.security.*;
 import java.security.spec.PKCS8EncodedKeySpec;
 import java.security.spec.X509EncodedKeySpec;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * @author tangxiangan
@@ -209,4 +212,35 @@ public class RSAUtils {
         System.out.println(new String(plainData));  // 结果打印: 你好, World!
     }
 
+    public String decryptSplit(String data) throws Exception {
+        PrivateKey privateKey = RSAUtils.getPrivateKey(IOUtils.readFile(this.getClass().getClassLoader().getResourceAsStream("privateKey.txt")));
+
+        int partLen = 2048 / 8;
+        byte[] base64Decoded = java.util.Base64.getDecoder().decode(data);
+        List<byte[]> parts = splitArray(base64Decoded, partLen);
+
+        StringBuilder decrypted = new StringBuilder();
+        for (byte[] part : parts) {
+            String str = new String(RSAUtils.decrypt(part, privateKey), StandardCharsets.UTF_8);
+            decrypted.append(str);
+        }
+        return decrypted.toString();
+    }
+
+    // Function to split the byte array into parts of given length
+    private static List<byte[]> splitArray(byte[] array, int partLen) {
+        List<byte[]> parts = new ArrayList<>();
+        int offset = 0;
+
+        while (offset < array.length) {
+            int length = Math.min(partLen, array.length - offset);
+            byte[] part = Arrays.copyOfRange(array, offset, offset + length);
+            parts.add(part);
+            offset += length;
+        }
+
+        return parts;
+    }
+
+
 }