This is an automated email from the ASF dual-hosted git repository.

jiangtian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 36f98a99910 encrypt audit log (#16551)
36f98a99910 is described below

commit 36f98a99910dd6f9513075d525136ec4f6baa395
Author: jintao zhu <[email protected]>
AuthorDate: Sat Oct 11 18:26:24 2025 +0800

    encrypt audit log (#16551)
    
    * encrypt audit log
    
    * update tsfile version
    
    * add Deprecated symbol
    
    * add testOnly symbol
    
    ---------
    
    Co-authored-by: Yongzao <[email protected]>
---
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 11 +++
 .../db/storageengine/dataregion/DataRegion.java    |  9 ++-
 .../constant/CrossCompactionPerformer.java         | 16 ++++
 .../constant/InnerSeqCompactionPerformer.java      | 16 ++++
 .../constant/InnerUnseqCompactionPerformer.java    | 16 ++++
 .../performer/impl/FastCompactionPerformer.java    | 42 ++++++++++-
 .../impl/ReadChunkCompactionPerformer.java         | 48 +++++++++++-
 .../impl/ReadPointCompactionPerformer.java         | 53 ++++++++++++-
 .../RepairUnsortedFileCompactionPerformer.java     | 14 +++-
 .../task/RepairUnsortedFileCompactionTask.java     |  7 +-
 .../task/subtask/ReadPointPerformerSubTask.java    |  8 +-
 ...BatchedFastAlignedSeriesCompactionExecutor.java |  8 +-
 ...edReadChunkAlignedSeriesCompactionExecutor.java |  9 ++-
 .../FirstBatchCompactionAlignedChunkWriter.java    | 51 +++++++++++--
 ...FollowingBatchCompactionAlignedChunkWriter.java | 16 +++-
 .../fast/FastAlignedSeriesCompactionExecutor.java  |  6 +-
 .../FastNonAlignedSeriesCompactionExecutor.java    |  8 +-
 .../readchunk/AlignedSeriesCompactionExecutor.java |  5 +-
 .../ReadChunkAlignedSeriesCompactionExecutor.java  |  4 +-
 .../readchunk/SingleSeriesCompactionExecutor.java  |  9 ++-
 .../utils/writer/AbstractCompactionWriter.java     |  5 ++
 .../writer/AbstractCrossCompactionWriter.java      | 23 +++++-
 .../writer/AbstractInnerCompactionWriter.java      | 30 +++++++-
 .../utils/writer/FastCrossCompactionWriter.java    | 16 +++-
 .../utils/writer/FastInnerCompactionWriter.java    | 20 ++++-
 .../writer/ReadPointCrossCompactionWriter.java     | 14 +++-
 .../writer/ReadPointInnerCompactionWriter.java     | 20 ++++-
 .../writer/RepairUnsortedFileCompactionWriter.java | 12 ++-
 .../compaction/io/CompactionTsFileWriter.java      | 19 ++++-
 .../schedule/CompactionScheduleContext.java        | 23 +++++-
 .../compaction/schedule/CompactionScheduler.java   |  7 +-
 .../utils/CrossSpaceCompactionCandidate.java       |  1 +
 .../compaction/settle/SettleRequestHandler.java    | 13 +++-
 .../compaction/tool/TsFileStatisticReader.java     |  6 +-
 .../dataregion/memtable/AbstractMemTable.java      | 10 ++-
 .../memtable/AbstractWritableMemChunk.java         |  4 +
 .../memtable/AlignedWritableMemChunk.java          | 36 ++++++++-
 .../memtable/AlignedWritableMemChunkGroup.java     |  9 +++
 .../dataregion/memtable/IWritableMemChunk.java     |  3 +
 .../memtable/IWritableMemChunkGroup.java           |  3 +
 .../dataregion/memtable/TsFileProcessor.java       |  7 +-
 .../dataregion/memtable/WritableMemChunk.java      | 25 ++++++-
 .../dataregion/memtable/WritableMemChunkGroup.java | 19 ++++-
 .../dataregion/read/control/FileReaderManager.java | 13 +++-
 .../dataregion/utils/TsFileResourceUtils.java      |  6 +-
 .../file/AbstractTsFileRecoverPerformer.java       | 19 ++++-
 .../iotdb/db/tools/utils/TsFileSequenceScan.java   |  7 +-
 .../org/apache/iotdb/db/utils/EncryptDBUtils.java  | 86 ++++++++++++++++++++++
 48 files changed, 744 insertions(+), 68 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 74a966eacea..4786460bac2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -49,6 +49,7 @@ import org.apache.iotdb.rpc.ZeroCopyRpcTransportFactory;
 
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.common.constant.TsFileConstant;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.enums.CompressionType;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;
@@ -62,9 +63,11 @@ import java.io.IOException;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Pattern;
 
@@ -1176,6 +1179,10 @@ public class IoTDBConfig {
 
   private boolean includeNullValueInWriteThroughputMetric = false;
 
+  private ConcurrentHashMap<String, EncryptParameter> tsFileDBToEncryptMap =
+      new ConcurrentHashMap<>(
+          Collections.singletonMap("root.__audit", new 
EncryptParameter("UNENCRYPTED", null)));
+
   IoTDBConfig() {}
 
   public int getMaxLogEntriesNumPerBatch() {
@@ -4225,4 +4232,8 @@ public class IoTDBConfig {
   public void setPasswordLockTimeMinutes(int passwordLockTimeMinutes) {
     this.passwordLockTimeMinutes = passwordLockTimeMinutes;
   }
+
+  public ConcurrentHashMap<String, EncryptParameter> getTSFileDBToEncryptMap() 
{
+    return tsFileDBToEncryptMap;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
index 133f878ef3a..dfe5e4e9e10 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
@@ -153,6 +153,7 @@ import 
org.apache.iotdb.db.storageengine.rescon.quotas.DataNodeSpaceQuotaManager
 import org.apache.iotdb.db.tools.settle.TsFileAndModSettleTool;
 import org.apache.iotdb.db.utils.CommonUtils;
 import org.apache.iotdb.db.utils.DateTimeUtils;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 import org.apache.iotdb.db.utils.ModificationUtils;
 import org.apache.iotdb.metrics.utils.MetricLevel;
 import org.apache.iotdb.rpc.RpcUtils;
@@ -3087,7 +3088,9 @@ public class DataRegion implements IDataRegionForQuery {
     if (!isCompactionSelecting.compareAndSet(false, true)) {
       return 0;
     }
-    CompactionScheduleContext context = new CompactionScheduleContext();
+    CompactionScheduleContext context =
+        new CompactionScheduleContext(
+            EncryptDBUtils.getFirstEncryptParamFromDatabase(databaseName));
     try {
       List<Long> timePartitions = new 
ArrayList<>(tsFileManager.getTimePartitions());
       // Sort the time partition from largest to smallest
@@ -3140,7 +3143,9 @@ public class DataRegion implements IDataRegionForQuery {
         return 0;
       }
       logger.info("[TTL] {}-{} Start ttl and modification checking.", 
databaseName, dataRegionId);
-      CompactionScheduleContext context = new CompactionScheduleContext();
+      CompactionScheduleContext context =
+          new CompactionScheduleContext(
+              EncryptDBUtils.getFirstEncryptParamFromDatabase(databaseName));
       List<Long> timePartitions = new 
ArrayList<>(tsFileManager.getTimePartitions());
       // Sort the time partition from smallest to largest
       Collections.sort(timePartitions);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/CrossCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/CrossCompactionPerformer.java
index 55289515cf1..2e5ff20f964 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/CrossCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/CrossCompactionPerformer.java
@@ -19,11 +19,14 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.constant;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.IllegalCompactionPerformerException;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ICrossCompactionPerformer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.FastCompactionPerformer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.ReadPointCompactionPerformer;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
+
 public enum CrossCompactionPerformer {
   READ_POINT,
   FAST;
@@ -38,6 +41,7 @@ public enum CrossCompactionPerformer {
         "Illegal compaction performer for cross compaction " + name);
   }
 
+  @TestOnly
   public ICrossCompactionPerformer createInstance() {
     switch (this) {
       case READ_POINT:
@@ -49,4 +53,16 @@ public enum CrossCompactionPerformer {
             "Illegal compaction performer for cross compaction " + this);
     }
   }
+
+  public ICrossCompactionPerformer createInstance(EncryptParameter 
encryptParameter) {
+    switch (this) {
+      case READ_POINT:
+        return new ReadPointCompactionPerformer(encryptParameter);
+      case FAST:
+        return new FastCompactionPerformer(true, encryptParameter);
+      default:
+        throw new IllegalCompactionPerformerException(
+            "Illegal compaction performer for cross compaction " + this);
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerSeqCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerSeqCompactionPerformer.java
index 21215d92e7d..f64597e25d4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerSeqCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerSeqCompactionPerformer.java
@@ -19,11 +19,14 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.constant;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.IllegalCompactionPerformerException;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ISeqCompactionPerformer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.FastCompactionPerformer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.ReadChunkCompactionPerformer;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
+
 public enum InnerSeqCompactionPerformer {
   READ_CHUNK,
   FAST;
@@ -38,6 +41,7 @@ public enum InnerSeqCompactionPerformer {
         "Illegal compaction performer for seq inner compaction " + name);
   }
 
+  @TestOnly
   public ISeqCompactionPerformer createInstance() {
     switch (this) {
       case READ_CHUNK:
@@ -49,4 +53,16 @@ public enum InnerSeqCompactionPerformer {
             "Illegal compaction performer for seq inner compaction " + this);
     }
   }
+
+  public ISeqCompactionPerformer createInstance(EncryptParameter 
encryptParameter) {
+    switch (this) {
+      case READ_CHUNK:
+        return new ReadChunkCompactionPerformer(encryptParameter);
+      case FAST:
+        return new FastCompactionPerformer(false, encryptParameter);
+      default:
+        throw new IllegalCompactionPerformerException(
+            "Illegal compaction performer for seq inner compaction " + this);
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerUnseqCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerUnseqCompactionPerformer.java
index bf6956d8be7..857a5f63924 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerUnseqCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/constant/InnerUnseqCompactionPerformer.java
@@ -19,11 +19,14 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.constant;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.IllegalCompactionPerformerException;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.IUnseqCompactionPerformer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.FastCompactionPerformer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.ReadPointCompactionPerformer;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
+
 public enum InnerUnseqCompactionPerformer {
   READ_POINT,
   FAST;
@@ -38,6 +41,7 @@ public enum InnerUnseqCompactionPerformer {
         "Illegal compaction performer for unseq inner compaction " + name);
   }
 
+  @TestOnly
   public IUnseqCompactionPerformer createInstance() {
     switch (this) {
       case READ_POINT:
@@ -49,4 +53,16 @@ public enum InnerUnseqCompactionPerformer {
             "Illegal compaction performer for unseq inner compaction " + this);
     }
   }
+
+  public IUnseqCompactionPerformer createInstance(EncryptParameter 
encryptParameter) {
+    switch (this) {
+      case READ_POINT:
+        return new ReadPointCompactionPerformer(encryptParameter);
+      case FAST:
+        return new FastCompactionPerformer(false, encryptParameter);
+      default:
+        throw new IllegalCompactionPerformerException(
+            "Illegal compaction performer for unseq inner compaction " + this);
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
index fafba7ac1bd..91184aaec82 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
@@ -22,6 +22,7 @@ package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performe
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PatternTreeMap;
+import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.WriteProcessException;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.CompactionLastTimeCheckFailedException;
@@ -47,6 +48,8 @@ import 
org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import org.apache.iotdb.db.utils.datastructure.PatternTreeMapFactory;
 
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.exception.StopReadTsFileByInterruptException;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.metadata.IDeviceID;
@@ -96,6 +99,9 @@ public class FastCompactionPerformer
 
   private final boolean isCrossCompaction;
 
+  private EncryptParameter encryptParameter;
+
+  @TestOnly
   public FastCompactionPerformer(
       List<TsFileResource> seqFiles,
       List<TsFileResource> unseqFiles,
@@ -109,10 +115,41 @@ public class FastCompactionPerformer
     } else {
       isCrossCompaction = true;
     }
+    this.encryptParameter =
+        new EncryptParameter(
+            TSFileDescriptor.getInstance().getConfig().getEncryptType(),
+            TSFileDescriptor.getInstance().getConfig().getEncryptKey());
+  }
+
+  public FastCompactionPerformer(
+      List<TsFileResource> seqFiles,
+      List<TsFileResource> unseqFiles,
+      List<TsFileResource> targetFiles,
+      EncryptParameter encryptParameter) {
+    this.seqFiles = seqFiles;
+    this.unseqFiles = unseqFiles;
+    this.targetFiles = targetFiles;
+    if (seqFiles.isEmpty() || unseqFiles.isEmpty()) {
+      // inner space compaction
+      isCrossCompaction = false;
+    } else {
+      isCrossCompaction = true;
+    }
+    this.encryptParameter = encryptParameter;
   }
 
+  @TestOnly
   public FastCompactionPerformer(boolean isCrossCompaction) {
     this.isCrossCompaction = isCrossCompaction;
+    this.encryptParameter =
+        new EncryptParameter(
+            TSFileDescriptor.getInstance().getConfig().getEncryptType(),
+            TSFileDescriptor.getInstance().getConfig().getEncryptKey());
+  }
+
+  public FastCompactionPerformer(boolean isCrossCompaction, EncryptParameter 
encryptParameter) {
+    this.isCrossCompaction = isCrossCompaction;
+    this.encryptParameter = encryptParameter;
   }
 
   @Override
@@ -122,8 +159,9 @@ public class FastCompactionPerformer
             new MultiTsFileDeviceIterator(seqFiles, unseqFiles, 
readerCacheMap);
         AbstractCompactionWriter compactionWriter =
             isCrossCompaction
-                ? new FastCrossCompactionWriter(targetFiles, seqFiles, 
readerCacheMap)
-                : new FastInnerCompactionWriter(targetFiles)) {
+                ? new FastCrossCompactionWriter(
+                    targetFiles, seqFiles, readerCacheMap, encryptParameter)
+                : new FastInnerCompactionWriter(targetFiles, 
encryptParameter)) {
       List<Schema> schemas =
           CompactionTableSchemaCollector.collectSchema(
               seqFiles, unseqFiles, readerCacheMap, 
deviceIterator.getDeprecatedTableSchemaMap());
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
index 837978b4ce1..eaed8a7f6eb 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
@@ -21,6 +21,7 @@ package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performe
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.MetadataException;
+import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ISeqCompactionPerformer;
@@ -35,7 +36,10 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.estimato
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.estimator.ReadChunkInnerCompactionEstimator;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata;
@@ -66,21 +70,60 @@ public class ReadChunkCompactionPerformer implements 
ISeqCompactionPerformer {
               * 
IoTDBDescriptor.getInstance().getConfig().getChunkMetadataSizeProportion());
   private Schema schema = null;
 
+  private EncryptParameter firstEncryptParameter;
+
+  @TestOnly
   public ReadChunkCompactionPerformer(List<TsFileResource> sourceFiles, 
TsFileResource targetFile) {
     this(sourceFiles, Collections.singletonList(targetFile));
   }
 
+  public ReadChunkCompactionPerformer(
+      List<TsFileResource> sourceFiles,
+      TsFileResource targetFile,
+      EncryptParameter encryptParameter) {
+    this(sourceFiles, Collections.singletonList(targetFile), encryptParameter);
+  }
+
+  @TestOnly
   public ReadChunkCompactionPerformer(
       List<TsFileResource> sourceFiles, List<TsFileResource> targetFiles) {
     setSourceFiles(sourceFiles);
     setTargetFiles(targetFiles);
+    this.firstEncryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam();
+  }
+
+  public ReadChunkCompactionPerformer(
+      List<TsFileResource> sourceFiles,
+      List<TsFileResource> targetFiles,
+      EncryptParameter encryptParameter) {
+    setSourceFiles(sourceFiles);
+    setTargetFiles(targetFiles);
+    this.firstEncryptParameter = encryptParameter;
   }
 
+  @TestOnly
   public ReadChunkCompactionPerformer(List<TsFileResource> sourceFiles) {
     setSourceFiles(sourceFiles);
+    this.firstEncryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam();
+  }
+
+  public ReadChunkCompactionPerformer(
+      List<TsFileResource> sourceFiles, EncryptParameter encryptParameter) {
+    setSourceFiles(sourceFiles);
+    this.firstEncryptParameter = encryptParameter;
+  }
+
+  @TestOnly
+  public ReadChunkCompactionPerformer() {
+    this.firstEncryptParameter =
+        new EncryptParameter(
+            TSFileDescriptor.getInstance().getConfig().getEncryptType(),
+            TSFileDescriptor.getInstance().getConfig().getEncryptKey());
   }
 
-  public ReadChunkCompactionPerformer() {}
+  public ReadChunkCompactionPerformer(EncryptParameter encryptParameter) {
+    this.firstEncryptParameter = encryptParameter;
+  }
 
   @Override
   public void perform()
@@ -164,7 +207,8 @@ public class ReadChunkCompactionPerformer implements 
ISeqCompactionPerformer {
         new CompactionTsFileWriter(
             targetResources.get(currentTargetFileIndex).getTsFile(),
             memoryBudgetForFileWriter,
-            CompactionType.INNER_SEQ_COMPACTION);
+            CompactionType.INNER_SEQ_COMPACTION,
+            firstEncryptParameter);
     currentWriter.setSchema(CompactionTableSchemaCollector.copySchema(schema));
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java
index ca650f28a75..c58870357d9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.AlignedFullPath;
 import org.apache.iotdb.commons.path.IFullPath;
 import org.apache.iotdb.commons.path.NonAlignedFullPath;
+import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import 
org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ICrossCompactionPerformer;
@@ -43,8 +44,11 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.estimato
 import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
 import 
org.apache.iotdb.db.storageengine.dataregion.read.control.QueryResourceManager;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
 import org.apache.tsfile.common.constant.TsFileConstant;
+import org.apache.tsfile.encrypt.EncryptParameter;
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.read.common.block.TsBlock;
 import org.apache.tsfile.read.reader.IPointReader;
@@ -83,6 +87,9 @@ public class ReadPointCompactionPerformer
 
   protected List<TsFileResource> targetFiles = Collections.emptyList();
 
+  private EncryptParameter encryptParameter;
+
+  @TestOnly
   public ReadPointCompactionPerformer(
       List<TsFileResource> seqFiles,
       List<TsFileResource> unseqFiles,
@@ -90,15 +97,45 @@ public class ReadPointCompactionPerformer
     this.seqFiles = seqFiles;
     this.unseqFiles = unseqFiles;
     this.targetFiles = targetFiles;
+    this.encryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam();
   }
 
+  public ReadPointCompactionPerformer(
+      List<TsFileResource> seqFiles,
+      List<TsFileResource> unseqFiles,
+      List<TsFileResource> targetFiles,
+      EncryptParameter encryptParameter) {
+    this.seqFiles = seqFiles;
+    this.unseqFiles = unseqFiles;
+    this.targetFiles = targetFiles;
+    this.encryptParameter = encryptParameter;
+  }
+
+  @TestOnly
   public ReadPointCompactionPerformer(
       List<TsFileResource> seqFiles, List<TsFileResource> unseqFiles) {
     this.seqFiles = seqFiles;
     this.unseqFiles = unseqFiles;
+    this.encryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam();
   }
 
-  public ReadPointCompactionPerformer() {}
+  public ReadPointCompactionPerformer(
+      List<TsFileResource> seqFiles,
+      List<TsFileResource> unseqFiles,
+      EncryptParameter encryptParameter) {
+    this.seqFiles = seqFiles;
+    this.unseqFiles = unseqFiles;
+    this.encryptParameter = encryptParameter;
+  }
+
+  @TestOnly
+  public ReadPointCompactionPerformer() {
+    this.encryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam();
+  }
+
+  public ReadPointCompactionPerformer(EncryptParameter encryptParameter) {
+    this.encryptParameter = encryptParameter;
+  }
 
   @SuppressWarnings("squid:S2095") // Do not close device iterator
   @Override
@@ -162,6 +199,10 @@ public class ReadPointCompactionPerformer
     this.summary = summary;
   }
 
+  public EncryptParameter getEncryptParameter() {
+    return encryptParameter;
+  }
+
   private void compactAlignedSeries(
       IDeviceID device,
       MultiTsFileDeviceIterator deviceIterator,
@@ -197,7 +238,10 @@ public class ReadPointCompactionPerformer
       measurementSchemas.add(0, timeSchema);
       compactionWriter.startMeasurement(
           TsFileConstant.TIME_COLUMN_ID,
-          new AlignedChunkWriterImpl(measurementSchemas.remove(0), 
measurementSchemas),
+          new AlignedChunkWriterImpl(
+              measurementSchemas.remove(0),
+              measurementSchemas,
+              EncryptUtils.getEncryptParameter(getEncryptParameter())),
           0);
       writeWithReader(compactionWriter, dataBlockReader, device, 0, true);
       compactionWriter.endMeasurement(0);
@@ -307,10 +351,11 @@ public class ReadPointCompactionPerformer
       throws IOException {
     if (!seqFileResources.isEmpty() && !unseqFileResources.isEmpty()) {
       // cross space
-      return new ReadPointCrossCompactionWriter(targetFileResources, 
seqFileResources);
+      return new ReadPointCrossCompactionWriter(
+          targetFileResources, seqFileResources, encryptParameter);
     } else {
       // inner space
-      return new ReadPointInnerCompactionWriter(targetFileResources);
+      return new ReadPointInnerCompactionWriter(targetFileResources, 
encryptParameter);
     }
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java
index 3bdfefbdac2..962957f4f02 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java
@@ -19,6 +19,7 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.AbstractCompactionWriter;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.RepairUnsortedFileCompactionWriter;
@@ -28,6 +29,9 @@ import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ArrayDeviceTimeIndex;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex;
 import org.apache.iotdb.db.storageengine.rescon.memory.TsFileResourceManager;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
+
+import org.apache.tsfile.encrypt.EncryptParameter;
 
 import java.io.IOException;
 import java.nio.file.Files;
@@ -37,8 +41,13 @@ import java.util.List;
 /** Used for fixing files which contains internal unsorted data */
 public class RepairUnsortedFileCompactionPerformer extends 
ReadPointCompactionPerformer {
 
+  @TestOnly
   public RepairUnsortedFileCompactionPerformer() {
-    super();
+    super(EncryptDBUtils.getDefaultFirstEncryptParam());
+  }
+
+  public RepairUnsortedFileCompactionPerformer(EncryptParameter 
encryptParameter) {
+    super(encryptParameter);
   }
 
   @Override
@@ -47,7 +56,8 @@ public class RepairUnsortedFileCompactionPerformer extends 
ReadPointCompactionPe
       List<TsFileResource> unseqFileResources,
       List<TsFileResource> targetFileResources)
       throws IOException {
-    return new RepairUnsortedFileCompactionWriter(targetFileResources.get(0));
+    return new RepairUnsortedFileCompactionWriter(
+        targetFileResources.get(0), getEncryptParameter());
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java
index 8619c4c04f7..fe1957975cf 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java
@@ -32,6 +32,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.generator.TsFileNameGenerator;
 import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
 import java.io.File;
 import java.io.IOException;
@@ -72,7 +73,8 @@ public class RepairUnsortedFileCompactionTask extends 
InnerSpaceCompactionTask {
         tsFileManager,
         Collections.singletonList(sourceFile),
         sequence,
-        new RepairUnsortedFileCompactionPerformer(),
+        new RepairUnsortedFileCompactionPerformer(
+            
EncryptDBUtils.getFirstEncryptParamFromDatabase(tsFileManager.getStorageGroupName())),
         serialId);
     this.sourceFile = sourceFile;
     if (this.sourceFile.getTsFileRepairStatus() != 
TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE) {
@@ -93,7 +95,8 @@ public class RepairUnsortedFileCompactionTask extends 
InnerSpaceCompactionTask {
         tsFileManager,
         Collections.singletonList(sourceFile),
         sequence,
-        new RepairUnsortedFileCompactionPerformer(),
+        new RepairUnsortedFileCompactionPerformer(
+            
EncryptDBUtils.getFirstEncryptParamFromDatabase(tsFileManager.getStorageGroupName())),
         serialId);
     this.sourceFile = sourceFile;
     if (this.sourceFile.getTsFileRepairStatus() != 
TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/subtask/ReadPointPerformerSubTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/subtask/ReadPointPerformerSubTask.java
index 6ab56e68b55..74f72590745 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/subtask/ReadPointPerformerSubTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/subtask/ReadPointPerformerSubTask.java
@@ -26,6 +26,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.rea
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.AbstractCompactionWriter;
 import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
 
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.write.chunk.ChunkWriterImpl;
 import org.apache.tsfile.write.schema.IMeasurementSchema;
@@ -91,7 +92,12 @@ public class ReadPointPerformerSubTask implements 
Callable<Void> {
 
       if (dataBlockReader.hasNextBatch()) {
         compactionWriter.startMeasurement(
-            measurement, new ChunkWriterImpl(measurementSchemas.get(0), true), 
taskId);
+            measurement,
+            new ChunkWriterImpl(
+                measurementSchemas.get(0),
+                true,
+                
EncryptUtils.getEncryptParameter(compactionWriter.getEncryptParameter())),
+            taskId);
         ReadPointCompactionPerformer.writeWithReader(
             compactionWriter, dataBlockReader, device, taskId, false);
         compactionWriter.endMeasurement(taskId);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedFastAlignedSeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedFastAlignedSeriesCompactionExecutor.java
index 636fba8c2ca..0c1f12e9886 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedFastAlignedSeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedFastAlignedSeriesCompactionExecutor.java
@@ -42,6 +42,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import org.apache.iotdb.db.utils.datastructure.PatternTreeMapFactory;
 
 import org.apache.tsfile.common.constant.TsFileConstant;
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata;
 import org.apache.tsfile.file.metadata.ChunkMetadata;
@@ -249,7 +250,9 @@ public class BatchedFastAlignedSeriesCompactionExecutor
         throws PageException, IllegalPathException, IOException, 
WriteProcessException {
       FirstBatchCompactionAlignedChunkWriter 
firstBatchCompactionAlignedChunkWriter =
           new FirstBatchCompactionAlignedChunkWriter(
-              this.measurementSchemas.remove(0), this.measurementSchemas);
+              this.measurementSchemas.remove(0),
+              this.measurementSchemas,
+              
EncryptUtils.getEncryptParameter(compactionWriter.getEncryptParameter()));
 
       
firstBatchCompactionAlignedChunkWriter.registerBeforeFlushChunkWriterCallback(
           chunkWriter -> {
@@ -359,7 +362,8 @@ public class BatchedFastAlignedSeriesCompactionExecutor
           new FollowingBatchCompactionAlignedChunkWriter(
               measurementSchemas.remove(0),
               measurementSchemas,
-              batchCompactionPlan.getCompactChunkPlan(0));
+              batchCompactionPlan.getCompactChunkPlan(0),
+              
EncryptUtils.getEncryptParameter(compactionWriter.getEncryptParameter()));
       flushController =
           new FollowedBatchedCompactionFlushController(
               batchCompactionPlan, followingBatchCompactionAlignedChunkWriter);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedReadChunkAlignedSeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedReadChunkAlignedSeriesCompactionExecutor.java
index e343ea59b92..dc030787566 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedReadChunkAlignedSeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/BatchedReadChunkAlignedSeriesCompactionExecutor.java
@@ -37,6 +37,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.exe
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFileWriter;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata;
 import org.apache.tsfile.file.metadata.ChunkMetadata;
@@ -209,7 +210,8 @@ public class BatchedReadChunkAlignedSeriesCompactionExecutor
 
     @Override
     protected AlignedChunkWriterImpl constructAlignedChunkWriter() {
-      return new FirstBatchCompactionAlignedChunkWriter(timeSchema, 
schemaList);
+      return new FirstBatchCompactionAlignedChunkWriter(
+          timeSchema, schemaList, 
EncryptUtils.getEncryptParameter(writer.getEncryptParameter()));
     }
 
     @Override
@@ -326,7 +328,10 @@ public class 
BatchedReadChunkAlignedSeriesCompactionExecutor
       this.flushController = new 
FollowingBatchReadChunkAlignedSeriesCompactionFlushController();
       this.chunkWriter =
           new FollowingBatchCompactionAlignedChunkWriter(
-              timeSchema, schemaList, 
batchCompactionPlan.getCompactChunkPlan(0));
+              timeSchema,
+              schemaList,
+              batchCompactionPlan.getCompactChunkPlan(0),
+              EncryptUtils.getEncryptParameter(writer.getEncryptParameter()));
     }
 
     @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FirstBatchCompactionAlignedChunkWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FirstBatchCompactionAlignedChunkWriter.java
index 4d074c3c3a6..0109fcda16c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FirstBatchCompactionAlignedChunkWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FirstBatchCompactionAlignedChunkWriter.java
@@ -19,9 +19,13 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.batch.utils;
 
+import org.apache.iotdb.commons.utils.TestOnly;
+
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.encoding.encoder.Encoder;
 import org.apache.tsfile.encoding.encoder.TSEncodingBuilder;
+import org.apache.tsfile.encrypt.EncryptParameter;
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.PageHeader;
@@ -45,13 +49,16 @@ public class FirstBatchCompactionAlignedChunkWriter extends 
AlignedChunkWriterIm
 
   private ChunkWriterFlushCallback beforeChunkWriterFlushCallback;
 
+  @TestOnly
   public FirstBatchCompactionAlignedChunkWriter(VectorMeasurementSchema 
schema) {
+    this.encryptParam = EncryptUtils.getEncryptParameter();
     timeChunkWriter =
         new FirstBatchCompactionTimeChunkWriter(
             schema.getMeasurementName(),
             schema.getCompressor(),
             schema.getTimeTSEncoding(),
-            schema.getTimeEncoder());
+            schema.getTimeEncoder(),
+            encryptParam);
 
     List<String> valueMeasurementIdList = schema.getSubMeasurementsList();
     List<TSDataType> valueTSDataTypeList = 
schema.getSubMeasurementsTSDataTypeList();
@@ -66,21 +73,32 @@ public class FirstBatchCompactionAlignedChunkWriter extends 
AlignedChunkWriterIm
               schema.getCompressor(),
               valueTSDataTypeList.get(i),
               valueTSEncodingList.get(i),
-              valueEncoderList.get(i)));
+              valueEncoderList.get(i),
+              encryptParam));
     }
 
     this.valueIndex = 0;
     this.remainingPointsNumber = 
timeChunkWriter.getRemainingPointNumberForCurrentPage();
   }
 
+  @TestOnly
   public FirstBatchCompactionAlignedChunkWriter(
       IMeasurementSchema timeSchema, List<IMeasurementSchema> valueSchemaList) 
{
+    this(timeSchema, valueSchemaList, EncryptUtils.getEncryptParameter());
+  }
+
+  public FirstBatchCompactionAlignedChunkWriter(
+      IMeasurementSchema timeSchema,
+      List<IMeasurementSchema> valueSchemaList,
+      EncryptParameter param) {
+    this.encryptParam = param;
     timeChunkWriter =
         new FirstBatchCompactionTimeChunkWriter(
             timeSchema.getMeasurementName(),
             timeSchema.getCompressor(),
             timeSchema.getEncodingType(),
-            timeSchema.getTimeEncoder());
+            timeSchema.getTimeEncoder(),
+            param);
 
     valueChunkWriterList = new ArrayList<>(valueSchemaList.size());
     for (int i = 0; i < valueSchemaList.size(); i++) {
@@ -90,14 +108,17 @@ public class FirstBatchCompactionAlignedChunkWriter 
extends AlignedChunkWriterIm
               valueSchemaList.get(i).getCompressor(),
               valueSchemaList.get(i).getType(),
               valueSchemaList.get(i).getEncodingType(),
-              valueSchemaList.get(i).getValueEncoder()));
+              valueSchemaList.get(i).getValueEncoder(),
+              param));
     }
 
     this.valueIndex = 0;
     this.remainingPointsNumber = 
timeChunkWriter.getRemainingPointNumberForCurrentPage();
   }
 
+  @TestOnly
   public FirstBatchCompactionAlignedChunkWriter(List<IMeasurementSchema> 
schemaList) {
+    this.encryptParam = EncryptUtils.getEncryptParameter();
     TSEncoding timeEncoding =
         
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder());
     TSDataType timeType = 
TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType();
@@ -108,7 +129,8 @@ public class FirstBatchCompactionAlignedChunkWriter extends 
AlignedChunkWriterIm
             "",
             timeCompression,
             timeEncoding,
-            
TSEncodingBuilder.getEncodingBuilder(timeEncoding).getEncoder(timeType));
+            
TSEncodingBuilder.getEncodingBuilder(timeEncoding).getEncoder(timeType),
+            encryptParam);
 
     valueChunkWriterList = new ArrayList<>(schemaList.size());
     for (int i = 0; i < schemaList.size(); i++) {
@@ -118,7 +140,8 @@ public class FirstBatchCompactionAlignedChunkWriter extends 
AlignedChunkWriterIm
               schemaList.get(i).getCompressor(),
               schemaList.get(i).getType(),
               schemaList.get(i).getEncodingType(),
-              schemaList.get(i).getValueEncoder()));
+              schemaList.get(i).getValueEncoder(),
+              encryptParam));
     }
 
     this.valueIndex = 0;
@@ -154,7 +177,21 @@ public class FirstBatchCompactionAlignedChunkWriter 
extends AlignedChunkWriterIm
         CompressionType compressionType,
         TSEncoding encodingType,
         Encoder timeEncoder) {
-      super(measurementId, compressionType, encodingType, timeEncoder);
+      super(
+          measurementId,
+          compressionType,
+          encodingType,
+          timeEncoder,
+          EncryptUtils.getEncryptParameter());
+    }
+
+    public FirstBatchCompactionTimeChunkWriter(
+        String measurementId,
+        CompressionType compressionType,
+        TSEncoding encodingType,
+        Encoder timeEncoder,
+        EncryptParameter encryptParam) {
+      super(measurementId, compressionType, encodingType, timeEncoder, 
encryptParam);
     }
 
     @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FollowingBatchCompactionAlignedChunkWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FollowingBatchCompactionAlignedChunkWriter.java
index a00a568d7b3..85813d2cd4d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FollowingBatchCompactionAlignedChunkWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/batch/utils/FollowingBatchCompactionAlignedChunkWriter.java
@@ -19,8 +19,11 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.batch.utils;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.BatchCompactionCannotAlignedException;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.PageHeader;
@@ -43,10 +46,20 @@ public class FollowingBatchCompactionAlignedChunkWriter 
extends AlignedChunkWrit
   private CompactChunkPlan compactChunkPlan;
   private ChunkWriterFlushCallback afterChunkWriterFlushCallback;
 
+  @TestOnly
   public FollowingBatchCompactionAlignedChunkWriter(
       IMeasurementSchema timeSchema,
       List<IMeasurementSchema> valueSchemaList,
       CompactChunkPlan compactChunkPlan) {
+    this(timeSchema, valueSchemaList, compactChunkPlan, 
EncryptUtils.getEncryptParameter());
+  }
+
+  public FollowingBatchCompactionAlignedChunkWriter(
+      IMeasurementSchema timeSchema,
+      List<IMeasurementSchema> valueSchemaList,
+      CompactChunkPlan compactChunkPlan,
+      EncryptParameter encryptParameter) {
+    this.encryptParam = encryptParameter;
     timeChunkWriter = new FollowingBatchCompactionTimeChunkWriter();
 
     valueChunkWriterList = new ArrayList<>(valueSchemaList.size());
@@ -57,7 +70,8 @@ public class FollowingBatchCompactionAlignedChunkWriter 
extends AlignedChunkWrit
               valueSchemaList.get(i).getCompressor(),
               valueSchemaList.get(i).getType(),
               valueSchemaList.get(i).getEncodingType(),
-              valueSchemaList.get(i).getValueEncoder()));
+              valueSchemaList.get(i).getValueEncoder(),
+              encryptParameter));
     }
     this.valueIndex = 0;
     this.compactChunkPlan = compactChunkPlan;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
index 7ad78814c5f..4e71c03d25f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
@@ -40,6 +40,7 @@ import org.apache.iotdb.db.utils.ModificationUtils;
 import org.apache.iotdb.db.utils.datastructure.PatternTreeMapFactory;
 
 import org.apache.tsfile.common.constant.TsFileConstant;
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.ChunkHeader;
 import org.apache.tsfile.file.header.PageHeader;
@@ -106,7 +107,10 @@ public class FastAlignedSeriesCompactionExecutor extends 
SeriesCompactionExecuto
       throws PageException, IllegalPathException, IOException, 
WriteProcessException {
     compactionWriter.startMeasurement(
         TsFileConstant.TIME_COLUMN_ID,
-        new AlignedChunkWriterImpl(measurementSchemas.remove(0), 
measurementSchemas),
+        new AlignedChunkWriterImpl(
+            measurementSchemas.remove(0),
+            measurementSchemas,
+            
EncryptUtils.getEncryptParameter(compactionWriter.getEncryptParameter())),
         subTaskId);
     compactFiles();
     compactionWriter.endMeasurement(subTaskId);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
index e2be4be0cc2..b07407c7db6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
@@ -35,6 +35,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import org.apache.iotdb.db.utils.ModificationUtils;
 import org.apache.iotdb.db.utils.datastructure.PatternTreeMapFactory;
 
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.ChunkHeader;
 import org.apache.tsfile.file.header.PageHeader;
@@ -207,7 +208,12 @@ public class FastNonAlignedSeriesCompactionExecutor 
extends SeriesCompactionExec
               header.getEncodingType(),
               header.getCompressionType());
       compactionWriter.startMeasurement(
-          schema.getMeasurementName(), new ChunkWriterImpl(schema, true), 
subTaskId);
+          schema.getMeasurementName(),
+          new ChunkWriterImpl(
+              schema,
+              true,
+              
EncryptUtils.getEncryptParameter(compactionWriter.getEncryptParameter())),
+          subTaskId);
       hasStartMeasurement = true;
       seriesCompressionType = header.getCompressionType();
       seriesTSEncoding = header.getEncodingType();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/AlignedSeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/AlignedSeriesCompactionExecutor.java
index 1abef8e85d6..af836c3919e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/AlignedSeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/AlignedSeriesCompactionExecutor.java
@@ -26,6 +26,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFi
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFileWriter;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.file.header.ChunkHeader;
 import org.apache.tsfile.file.metadata.AlignedChunkMetadata;
 import org.apache.tsfile.file.metadata.ChunkMetadata;
@@ -82,7 +83,9 @@ public class AlignedSeriesCompactionExecutor {
     this.writer = writer;
     this.targetResource = targetResource;
     schemaList = 
collectSchemaFromAlignedChunkMetadataList(readerAndChunkMetadataList);
-    chunkWriter = new AlignedChunkWriterImpl(schemaList);
+    chunkWriter =
+        new AlignedChunkWriterImpl(
+            schemaList, 
EncryptUtils.getEncryptParameter(writer.getEncryptParameter()));
     this.summary = summary;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/ReadChunkAlignedSeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/ReadChunkAlignedSeriesCompactionExecutor.java
index e6891199bb4..928c0cdbc6b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/ReadChunkAlignedSeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/ReadChunkAlignedSeriesCompactionExecutor.java
@@ -35,6 +35,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.encoding.decoder.Decoder;
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.ChunkHeader;
@@ -193,7 +194,8 @@ public class ReadChunkAlignedSeriesCompactionExecutor {
   }
 
   protected AlignedChunkWriterImpl constructAlignedChunkWriter() {
-    return new AlignedChunkWriterImpl(timeSchema, schemaList);
+    return new AlignedChunkWriterImpl(
+        timeSchema, schemaList, 
EncryptUtils.getEncryptParameter(writer.getEncryptParameter()));
   }
 
   public void execute() throws IOException, PageException {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/SingleSeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/SingleSeriesCompactionExecutor.java
index 69ce89d5af3..b09adb17bba 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/SingleSeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/readchunk/SingleSeriesCompactionExecutor.java
@@ -25,6 +25,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.Comp
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFileWriter;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.file.header.ChunkHeader;
 import org.apache.tsfile.file.metadata.ChunkMetadata;
 import org.apache.tsfile.file.metadata.IDeviceID;
@@ -86,7 +87,9 @@ public class SingleSeriesCompactionExecutor {
     this.readerAndChunkMetadataList = readerAndChunkMetadataList;
     this.fileWriter = fileWriter;
     this.schema = measurementSchema;
-    this.chunkWriter = new ChunkWriterImpl(this.schema);
+    this.chunkWriter =
+        new ChunkWriterImpl(
+            this.schema, 
EncryptUtils.getEncryptParameter(fileWriter.getEncryptParameter()));
     this.cachedChunk = null;
     this.cachedChunkMetadata = null;
     this.targetResource = targetResource;
@@ -175,7 +178,9 @@ public class SingleSeriesCompactionExecutor {
             chunkHeader.getDataType(),
             chunkHeader.getEncodingType(),
             chunkHeader.getCompressionType());
-    this.chunkWriter = new ChunkWriterImpl(this.schema);
+    this.chunkWriter =
+        new ChunkWriterImpl(
+            this.schema, 
EncryptUtils.getEncryptParameter(fileWriter.getEncryptParameter()));
   }
 
   private long getChunkSize(Chunk chunk) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCompactionWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCompactionWriter.java
index 5e794746894..3458f9870d4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCompactionWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCompactionWriter.java
@@ -28,6 +28,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.wri
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFileWriter;
 import org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.PageHeader;
 import org.apache.tsfile.file.metadata.ChunkMetadata;
@@ -102,6 +103,8 @@ public abstract class AbstractCompactionWriter implements 
AutoCloseable {
 
   protected ModEntry ttlDeletionForCurrentDevice;
 
+  private EncryptParameter encryptParameter;
+
   public abstract void startChunkGroup(IDeviceID deviceId, boolean isAlign) 
throws IOException;
 
   public abstract void endChunkGroup() throws IOException;
@@ -185,6 +188,8 @@ public abstract class AbstractCompactionWriter implements 
AutoCloseable {
     chunkPointNumArray[subTaskId] = 0;
   }
 
+  public abstract EncryptParameter getEncryptParameter();
+
   public abstract boolean flushNonAlignedChunk(
       Chunk chunk, ChunkMetadata chunkMetadata, int subTaskId) throws 
IOException;
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCrossCompactionWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCrossCompactionWriter.java
index e66ee1b697c..f970ad65e56 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCrossCompactionWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractCrossCompactionWriter.java
@@ -19,6 +19,7 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFileWriter;
@@ -26,7 +27,9 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.constant
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex;
 import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.TimeseriesMetadata;
 import org.apache.tsfile.read.TimeValuePair;
@@ -68,13 +71,25 @@ public abstract class AbstractCrossCompactionWriter extends 
AbstractCompactionWr
 
   protected List<TsFileResource> targetResources;
 
+  private final EncryptParameter encryptParameter;
+
+  @TestOnly
   protected AbstractCrossCompactionWriter(
       List<TsFileResource> targetResources, List<TsFileResource> 
seqFileResources)
       throws IOException {
+    this(targetResources, seqFileResources, 
EncryptDBUtils.getDefaultFirstEncryptParam());
+  }
+
+  protected AbstractCrossCompactionWriter(
+      List<TsFileResource> targetResources,
+      List<TsFileResource> seqFileResources,
+      EncryptParameter encryptParameter)
+      throws IOException {
     currentDeviceEndTime = new long[seqFileResources.size()];
     isCurrentDeviceExistedInSourceSeqFiles = new 
boolean[seqFileResources.size()];
     isEmptyFile = new boolean[seqFileResources.size()];
     isDeviceExistedInTargetFiles = new boolean[targetResources.size()];
+    this.encryptParameter = encryptParameter;
     long memorySizeForEachWriter =
         (long)
             ((double) SystemInfo.getInstance().getMemorySizeForCompaction()
@@ -86,7 +101,8 @@ public abstract class AbstractCrossCompactionWriter extends 
AbstractCompactionWr
           new CompactionTsFileWriter(
               targetResources.get(i).getTsFile(),
               memorySizeForEachWriter,
-              CompactionType.CROSS_COMPACTION));
+              CompactionType.CROSS_COMPACTION,
+              this.encryptParameter));
       isEmptyFile[i] = true;
     }
     this.seqTsFileResources = seqFileResources;
@@ -257,4 +273,9 @@ public abstract class AbstractCrossCompactionWriter extends 
AbstractCompactionWr
   }
 
   protected abstract TsFileSequenceReader getFileReader(TsFileResource 
resource) throws IOException;
+
+  @Override
+  public EncryptParameter getEncryptParameter() {
+    return encryptParameter;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractInnerCompactionWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractInnerCompactionWriter.java
index 9d5e6f49825..6573bb7e96e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractInnerCompactionWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/AbstractInnerCompactionWriter.java
@@ -19,6 +19,7 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionTableSchemaCollector;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils;
@@ -26,7 +27,9 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.io.CompactionTsFi
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.constant.CompactionType;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.read.TimeValuePair;
 import org.apache.tsfile.read.common.block.TsBlock;
@@ -42,6 +45,7 @@ public abstract class AbstractInnerCompactionWriter extends 
AbstractCompactionWr
   protected int currentFileIndex;
   protected long endedFileSize = 0;
   protected List<Schema> schemas;
+  protected EncryptParameter encryptParameter;
 
   protected final long memoryBudgetForFileWriter =
       (long)
@@ -49,12 +53,28 @@ public abstract class AbstractInnerCompactionWriter extends 
AbstractCompactionWr
               / 
IoTDBDescriptor.getInstance().getConfig().getCompactionThreadCount()
               * 
IoTDBDescriptor.getInstance().getConfig().getChunkMetadataSizeProportion());
 
+  @TestOnly
   protected AbstractInnerCompactionWriter(TsFileResource targetFileResource) {
-    this(Collections.singletonList(targetFileResource));
+    this(
+        Collections.singletonList(targetFileResource),
+        EncryptDBUtils.getDefaultFirstEncryptParam());
   }
 
+  protected AbstractInnerCompactionWriter(
+      TsFileResource targetFileResource, EncryptParameter encryptParameter) {
+    this(Collections.singletonList(targetFileResource), encryptParameter);
+  }
+
+  @Deprecated
   protected AbstractInnerCompactionWriter(List<TsFileResource> 
targetFileResources) {
     this.targetResources = targetFileResources;
+    this.encryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam();
+  }
+
+  protected AbstractInnerCompactionWriter(
+      List<TsFileResource> targetFileResources, EncryptParameter 
encryptParameter) {
+    this.targetResources = targetFileResources;
+    this.encryptParameter = encryptParameter;
   }
 
   @Override
@@ -99,7 +119,8 @@ public abstract class AbstractInnerCompactionWriter extends 
AbstractCompactionWr
             memoryBudgetForFileWriter,
             targetResources.get(currentFileIndex).isSeq()
                 ? CompactionType.INNER_SEQ_COMPACTION
-                : CompactionType.INNER_UNSEQ_COMPACTION);
+                : CompactionType.INNER_UNSEQ_COMPACTION,
+            encryptParameter);
     
fileWriter.setSchema(CompactionTableSchemaCollector.copySchema(schemas.get(0)));
   }
 
@@ -161,4 +182,9 @@ public abstract class AbstractInnerCompactionWriter extends 
AbstractCompactionWr
   public long getWriterSize() throws IOException {
     return endedFileSize + (fileWriter == null ? 0 : fileWriter.getPos());
   }
+
+  @Override
+  public EncryptParameter getEncryptParameter() {
+    return encryptParameter;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastCrossCompactionWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastCrossCompactionWriter.java
index 69a169168aa..59a87b4211c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastCrossCompactionWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastCrossCompactionWriter.java
@@ -19,11 +19,14 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.AlignedPageElement;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.ChunkMetadataElement;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.flushcontroller.AbstractCompactionFlushController;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.PageHeader;
 import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata;
@@ -44,12 +47,23 @@ public class FastCrossCompactionWriter extends 
AbstractCrossCompactionWriter {
   // Only used for fast compaction performer
   protected Map<TsFileResource, TsFileSequenceReader> readerMap;
 
+  @TestOnly
   public FastCrossCompactionWriter(
       List<TsFileResource> targetResources,
       List<TsFileResource> seqSourceResources,
       Map<TsFileResource, TsFileSequenceReader> readerMap)
       throws IOException {
-    super(targetResources, seqSourceResources);
+    super(targetResources, seqSourceResources, 
EncryptDBUtils.getDefaultFirstEncryptParam());
+    this.readerMap = readerMap;
+  }
+
+  public FastCrossCompactionWriter(
+      List<TsFileResource> targetResources,
+      List<TsFileResource> seqSourceResources,
+      Map<TsFileResource, TsFileSequenceReader> readerMap,
+      EncryptParameter encryptParameter)
+      throws IOException {
+    super(targetResources, seqSourceResources, encryptParameter);
     this.readerMap = readerMap;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastInnerCompactionWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastInnerCompactionWriter.java
index 18ca215ef64..922c3a7822b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastInnerCompactionWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/FastInnerCompactionWriter.java
@@ -19,11 +19,14 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.AlignedPageElement;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.ChunkMetadataElement;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.flushcontroller.AbstractCompactionFlushController;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.PageHeader;
 import org.apache.tsfile.file.metadata.AbstractAlignedChunkMetadata;
@@ -40,12 +43,25 @@ import java.util.List;
 
 public class FastInnerCompactionWriter extends AbstractInnerCompactionWriter {
 
+  @TestOnly
   public FastInnerCompactionWriter(TsFileResource targetFileResource) throws 
IOException {
-    super(targetFileResource);
+    super(targetFileResource, EncryptDBUtils.getDefaultFirstEncryptParam());
   }
 
+  public FastInnerCompactionWriter(
+      TsFileResource targetFileResource, EncryptParameter encryptParameter) 
throws IOException {
+    super(targetFileResource, encryptParameter);
+  }
+
+  @TestOnly
   public FastInnerCompactionWriter(List<TsFileResource> targetFileResources) 
throws IOException {
-    super(targetFileResources);
+    super(targetFileResources, EncryptDBUtils.getDefaultFirstEncryptParam());
+  }
+
+  public FastInnerCompactionWriter(
+      List<TsFileResource> targetFileResources, EncryptParameter 
encryptParameter)
+      throws IOException {
+    super(targetFileResources, encryptParameter);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointCrossCompactionWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointCrossCompactionWriter.java
index ce596e6dca4..6810df4d1a3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointCrossCompactionWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointCrossCompactionWriter.java
@@ -19,13 +19,16 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.AlignedPageElement;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.ChunkMetadataElement;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.flushcontroller.AbstractCompactionFlushController;
 import 
org.apache.iotdb.db.storageengine.dataregion.read.control.FileReaderManager;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
 import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.file.header.PageHeader;
 import org.apache.tsfile.file.metadata.ChunkMetadata;
 import org.apache.tsfile.read.TsFileSequenceReader;
@@ -40,10 +43,19 @@ import java.util.List;
 
 public class ReadPointCrossCompactionWriter extends 
AbstractCrossCompactionWriter {
 
+  @TestOnly
   public ReadPointCrossCompactionWriter(
       List<TsFileResource> targetResources, List<TsFileResource> 
seqFileResources)
       throws IOException {
-    super(targetResources, seqFileResources);
+    super(targetResources, seqFileResources, 
EncryptDBUtils.getDefaultFirstEncryptParam());
+  }
+
+  public ReadPointCrossCompactionWriter(
+      List<TsFileResource> targetResources,
+      List<TsFileResource> seqFileResources,
+      EncryptParameter encryptParameter)
+      throws IOException {
+    super(targetResources, seqFileResources, encryptParameter);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointInnerCompactionWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointInnerCompactionWriter.java
index bff091c6a6f..806e708b5fe 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointInnerCompactionWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/ReadPointInnerCompactionWriter.java
@@ -19,12 +19,15 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.AlignedPageElement;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.fast.element.ChunkMetadataElement;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.flushcontroller.AbstractCompactionFlushController;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
 import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.PageHeader;
 import org.apache.tsfile.file.metadata.ChunkMetadata;
@@ -38,13 +41,26 @@ import java.nio.ByteBuffer;
 import java.util.List;
 
 public class ReadPointInnerCompactionWriter extends 
AbstractInnerCompactionWriter {
+  @TestOnly
   public ReadPointInnerCompactionWriter(TsFileResource targetFileResource) 
throws IOException {
-    super(targetFileResource);
+    super(targetFileResource, EncryptDBUtils.getDefaultFirstEncryptParam());
   }
 
+  public ReadPointInnerCompactionWriter(
+      TsFileResource targetFileResource, EncryptParameter encryptParameter) 
throws IOException {
+    super(targetFileResource, encryptParameter);
+  }
+
+  @TestOnly
   public ReadPointInnerCompactionWriter(List<TsFileResource> 
targetFileResources)
       throws IOException {
-    super(targetFileResources);
+    super(targetFileResources, EncryptDBUtils.getDefaultFirstEncryptParam());
+  }
+
+  public ReadPointInnerCompactionWriter(
+      List<TsFileResource> targetFileResources, EncryptParameter 
encryptParameter)
+      throws IOException {
+    super(targetFileResources, encryptParameter);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/RepairUnsortedFileCompactionWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/RepairUnsortedFileCompactionWriter.java
index 5d46eb50ab9..15d59be8d68 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/RepairUnsortedFileCompactionWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/writer/RepairUnsortedFileCompactionWriter.java
@@ -19,8 +19,11 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.read.TimeValuePair;
 import org.apache.tsfile.read.common.block.TsBlock;
 import org.apache.tsfile.read.reader.IPointReader;
@@ -36,8 +39,15 @@ import java.util.List;
 public class RepairUnsortedFileCompactionWriter extends 
ReadPointInnerCompactionWriter {
   private List<TimeValuePair>[] dataOfCurrentSeriesArr;
 
+  @TestOnly
   public RepairUnsortedFileCompactionWriter(TsFileResource targetFileResource) 
throws IOException {
-    super(targetFileResource);
+    super(targetFileResource, EncryptDBUtils.getDefaultFirstEncryptParam());
+    dataOfCurrentSeriesArr = new ArrayList[subTaskNum];
+  }
+
+  public RepairUnsortedFileCompactionWriter(
+      TsFileResource targetFileResource, EncryptParameter encryptParameter) 
throws IOException {
+    super(targetFileResource, encryptParameter);
     dataOfCurrentSeriesArr = new ArrayList[subTaskNum];
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
index 4f0ae737704..1f822e3b934 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
@@ -19,11 +19,14 @@
 
 package org.apache.iotdb.db.storageengine.dataregion.compaction.io;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.service.metrics.CompactionMetrics;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.CompactionTaskManager;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.constant.CompactionIoDataType;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.constant.CompactionType;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.enums.ColumnCategory;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.ChunkMetadata;
@@ -52,15 +55,29 @@ public class CompactionTsFileWriter extends TsFileIOWriter {
   private boolean isEmptyTargetFile = true;
   private IDeviceID currentDeviceId;
 
+  private EncryptParameter firstEncryptParameter;
+
+  @TestOnly
   public CompactionTsFileWriter(File file, long maxMetadataSize, 
CompactionType type)
       throws IOException {
-    super(file, maxMetadataSize);
+    this(file, maxMetadataSize, type, 
EncryptDBUtils.getDefaultFirstEncryptParam());
+  }
+
+  public CompactionTsFileWriter(
+      File file, long maxMetadataSize, CompactionType type, EncryptParameter 
encryptParameter)
+      throws IOException {
+    super(file, maxMetadataSize, encryptParameter);
+    this.firstEncryptParameter = encryptParameter;
     this.type = type;
     super.out =
         new CompactionTsFileOutput(
             super.out, 
CompactionTaskManager.getInstance().getMergeWriteRateLimiter());
   }
 
+  public EncryptParameter getEncryptParameter() {
+    return firstEncryptParameter;
+  }
+
   public void markStartingWritingAligned() {
     isWritingAligned = true;
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleContext.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleContext.java
index 1f01cac0b25..2bfc515c5dc 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleContext.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduleContext.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.storageengine.dataregion.compaction.schedule;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.service.metrics.CompactionMetrics;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.constant.CompactionTaskType;
@@ -29,6 +30,9 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.Abst
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.SettleCompactionTask;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ArrayDeviceTimeIndex;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
+
+import org.apache.tsfile.encrypt.EncryptParameter;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -53,9 +57,19 @@ public class CompactionScheduleContext {
 
   private final Set<Long> timePartitionsDelayInsertionSelection;
 
+  private EncryptParameter encryptParameter;
+
+  @TestOnly
   public CompactionScheduleContext() {
     this.partitionFileDeviceInfoCache = new HashMap<>();
     this.timePartitionsDelayInsertionSelection = new HashSet<>();
+    this.encryptParameter = EncryptDBUtils.getDefaultFirstEncryptParam();
+  }
+
+  public CompactionScheduleContext(EncryptParameter encryptParameter) {
+    this.partitionFileDeviceInfoCache = new HashMap<>();
+    this.timePartitionsDelayInsertionSelection = new HashSet<>();
+    this.encryptParameter = encryptParameter;
   }
 
   public void delayInsertionSelection(long timePartitionId) {
@@ -177,7 +191,7 @@ public class CompactionScheduleContext {
     return IoTDBDescriptor.getInstance()
         .getConfig()
         .getInnerSeqCompactionPerformer()
-        .createInstance();
+        .createInstance(encryptParameter);
   }
 
   public IUnseqCompactionPerformer getUnseqCompactionPerformer() {
@@ -185,11 +199,14 @@ public class CompactionScheduleContext {
         IoTDBDescriptor.getInstance()
             .getConfig()
             .getInnerUnseqCompactionPerformer()
-            .createInstance();
+            .createInstance(encryptParameter);
     return unseqCompactionPerformer;
   }
 
   public ICrossCompactionPerformer getCrossCompactionPerformer() {
-    return 
IoTDBDescriptor.getInstance().getConfig().getCrossCompactionPerformer().createInstance();
+    return IoTDBDescriptor.getInstance()
+        .getConfig()
+        .getCrossCompactionPerformer()
+        .createInstance(encryptParameter);
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduler.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduler.java
index 96a6d095f08..cafb3bbae19 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduler.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/CompactionScheduler.java
@@ -37,6 +37,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.utils.Cr
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.utils.InsertionCrossCompactionTaskResource;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileManager;
 import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -124,7 +125,11 @@ public class CompactionScheduler {
   @TestOnly
   public static void scheduleCompaction(TsFileManager tsFileManager, long 
timePartition)
       throws InterruptedException {
-    scheduleCompaction(tsFileManager, timePartition, new 
CompactionScheduleContext());
+    scheduleCompaction(
+        tsFileManager,
+        timePartition,
+        new CompactionScheduleContext(
+            
EncryptDBUtils.getFirstEncryptParamFromDatabase(tsFileManager.getStorageGroupName())));
   }
 
   public static int tryToSubmitInnerSpaceCompactionTask(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java
index 52b9d5269b1..1f08cb406c2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java
@@ -51,6 +51,7 @@ public class CrossSpaceCompactionCandidate {
     init(seqFiles, unseqFiles, new CompactionScheduleContext());
   }
 
+  @TestOnly
   public CrossSpaceCompactionCandidate(
       List<TsFileResource> seqFiles, List<TsFileResource> unseqFiles, long 
ttlLowerBound) {
     this(seqFiles, unseqFiles, ttlLowerBound, new CompactionScheduleContext());
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/settle/SettleRequestHandler.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/settle/SettleRequestHandler.java
index 29b9bc2b06e..470d82cfc49 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/settle/SettleRequestHandler.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/settle/SettleRequestHandler.java
@@ -37,6 +37,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceList;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.generator.TsFileNameGenerator;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 
@@ -272,8 +273,16 @@ public class SettleRequestHandler {
     private TSStatus submitCompactionTask(List<TsFileResource> 
tsFileResources) {
       ICompactionPerformer performer =
           hasSeqFiles
-              ? config.getInnerSeqCompactionPerformer().createInstance()
-              : config.getInnerUnseqCompactionPerformer().createInstance();
+              ? config
+                  .getInnerSeqCompactionPerformer()
+                  .createInstance(
+                      EncryptDBUtils.getFirstEncryptParamFromDatabase(
+                          tsFileManager.getStorageGroupName()))
+              : config
+                  .getInnerUnseqCompactionPerformer()
+                  .createInstance(
+                      EncryptDBUtils.getFirstEncryptParamFromDatabase(
+                          tsFileManager.getStorageGroupName()));
       AbstractCompactionTask task =
           new InnerSpaceCompactionTask(
               targetConsistentSettleInfo.timePartitionId,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/TsFileStatisticReader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/TsFileStatisticReader.java
index fccfb318985..d932d6c2c70 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/TsFileStatisticReader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tool/TsFileStatisticReader.java
@@ -19,6 +19,8 @@
 
 package org.apache.iotdb.db.storageengine.dataregion.compaction.tool;
 
+import org.apache.iotdb.db.utils.EncryptDBUtils;
+
 import org.apache.tsfile.file.metadata.ChunkMetadata;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.read.TsFileDeviceIterator;
@@ -37,7 +39,9 @@ public class TsFileStatisticReader implements Closeable {
   private final TsFileSequenceReader reader;
 
   public TsFileStatisticReader(String filePath) throws IOException {
-    reader = new TsFileSequenceReader(filePath);
+    reader =
+        new TsFileSequenceReader(
+            filePath, 
EncryptDBUtils.getFirstEncryptParamFromTSFilePath(filePath));
   }
 
   public List<ChunkGroupStatistics> getChunkGroupStatisticsList() throws 
IOException {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java
index f2f4d5e2943..92803984cee 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java
@@ -42,6 +42,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.read.filescan.impl.MemAligne
 import 
org.apache.iotdb.db.storageengine.dataregion.read.filescan.impl.MemChunkHandleImpl;
 import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
 import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 import org.apache.iotdb.db.utils.MemUtils;
 import org.apache.iotdb.db.utils.ModificationUtils;
 
@@ -156,7 +157,11 @@ public abstract class AbstractMemTable implements 
IMemTable {
   private IWritableMemChunkGroup createMemChunkGroupIfNotExistAndGet(
       IDeviceID deviceId, List<IMeasurementSchema> schemaList) {
     IWritableMemChunkGroup memChunkGroup =
-        memTableMap.computeIfAbsent(deviceId, k -> new 
WritableMemChunkGroup());
+        memTableMap.computeIfAbsent(
+            deviceId,
+            k ->
+                new WritableMemChunkGroup(
+                    
EncryptDBUtils.getSecondEncryptParamFromDatabase(database)));
     for (IMeasurementSchema schema : schemaList) {
       if (schema != null && 
!memChunkGroup.contains(schema.getMeasurementName())) {
         seriesNumber++;
@@ -1050,5 +1055,8 @@ public abstract class AbstractMemTable implements 
IMemTable {
   public void setDatabaseAndDataRegionId(String database, String dataRegionId) 
{
     this.database = database;
     this.dataRegionId = dataRegionId;
+    for (IWritableMemChunkGroup memChunkGroup : memTableMap.values()) {
+      
memChunkGroup.setEncryptParameter(EncryptDBUtils.getSecondEncryptParamFromDatabase(database));
+    }
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractWritableMemChunk.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractWritableMemChunk.java
index 268a9213b3c..d1dd692303d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractWritableMemChunk.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractWritableMemChunk.java
@@ -28,6 +28,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferVie
 import org.apache.iotdb.db.utils.datastructure.BatchEncodeInfo;
 import org.apache.iotdb.db.utils.datastructure.TVList;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.utils.Binary;
 import org.apache.tsfile.utils.BitMap;
@@ -227,4 +228,7 @@ public abstract class AbstractWritableMemChunk implements 
IWritableMemChunk {
 
   @Override
   public abstract int serializedSize();
+
+  @Override
+  public abstract void setEncryptParameter(EncryptParameter encryptParameter);
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java
index d41ef855d36..f81238bef71 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java
@@ -30,6 +30,8 @@ import 
org.apache.iotdb.db.utils.datastructure.MemPointIterator;
 import org.apache.iotdb.db.utils.datastructure.MemPointIteratorFactory;
 import org.apache.iotdb.db.utils.datastructure.TVList;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.read.common.TimeRange;
 import org.apache.tsfile.utils.Binary;
@@ -71,7 +73,16 @@ public class AlignedWritableMemChunk extends 
AbstractWritableMemChunk {
 
   private static final String UNSUPPORTED_TYPE = "Unsupported data type:";
 
+  private EncryptParameter encryptParameter;
+
   public AlignedWritableMemChunk(List<IMeasurementSchema> schemaList, boolean 
isTableModel) {
+    this(schemaList, isTableModel, EncryptUtils.getEncryptParameter());
+  }
+
+  public AlignedWritableMemChunk(
+      List<IMeasurementSchema> schemaList,
+      boolean isTableModel,
+      EncryptParameter encryptParameter) {
     this.measurementIndexMap = new LinkedHashMap<>();
     this.dataTypes = new ArrayList<>();
     this.schemaList = schemaList;
@@ -82,10 +93,19 @@ public class AlignedWritableMemChunk extends 
AbstractWritableMemChunk {
     this.list = AlignedTVList.newAlignedList(dataTypes);
     this.sortedList = new ArrayList<>();
     this.ignoreAllNullRows = !isTableModel;
+    this.encryptParameter = encryptParameter;
   }
 
   private AlignedWritableMemChunk(
       List<IMeasurementSchema> schemaList, AlignedTVList list, boolean 
isTableModel) {
+    this(schemaList, list, isTableModel, EncryptUtils.getEncryptParameter());
+  }
+
+  private AlignedWritableMemChunk(
+      List<IMeasurementSchema> schemaList,
+      AlignedTVList list,
+      boolean isTableModel,
+      EncryptParameter encryptParameter) {
     this.measurementIndexMap = new LinkedHashMap<>();
     this.schemaList = schemaList;
     for (int i = 0; i < schemaList.size(); i++) {
@@ -95,6 +115,7 @@ public class AlignedWritableMemChunk extends 
AbstractWritableMemChunk {
     this.dataTypes = list.getTsDataTypes();
     this.sortedList = new ArrayList<>();
     this.ignoreAllNullRows = !isTableModel;
+    this.encryptParameter = encryptParameter;
   }
 
   public Set<String> getAllMeasurements() {
@@ -430,7 +451,7 @@ public class AlignedWritableMemChunk extends 
AbstractWritableMemChunk {
 
   @Override
   public IChunkWriter createIChunkWriter() {
-    return new AlignedChunkWriterImpl(schemaList);
+    return new AlignedChunkWriterImpl(schemaList, encryptParameter);
   }
 
   @SuppressWarnings({"squid:S6541", "squid:S3776"})
@@ -508,7 +529,8 @@ public class AlignedWritableMemChunk extends 
AbstractWritableMemChunk {
     List<TSDataType> dataTypes = list.getTsDataTypes();
     Pair<Long, Integer>[] lastValidPointIndexForTimeDupCheck = new 
Pair[dataTypes.size()];
     for (List<Integer> pageRange : chunkRange) {
-      AlignedChunkWriterImpl alignedChunkWriter = new 
AlignedChunkWriterImpl(schemaList);
+      AlignedChunkWriterImpl alignedChunkWriter =
+          new AlignedChunkWriterImpl(schemaList, encryptParameter);
       for (int pageNum = 0; pageNum < pageRange.size() / 2; pageNum += 1) {
         for (int columnIndex = 0; columnIndex < dataTypes.size(); 
columnIndex++) {
           // Pair of Time and Index
@@ -645,7 +667,8 @@ public class AlignedWritableMemChunk extends 
AbstractWritableMemChunk {
       return;
     }
 
-    AlignedChunkWriterImpl alignedChunkWriter = new 
AlignedChunkWriterImpl(schemaList);
+    AlignedChunkWriterImpl alignedChunkWriter =
+        new AlignedChunkWriterImpl(schemaList, encryptParameter);
 
     // create MergeSortAlignedTVListIterator.
     List<AlignedTVList> alignedTvLists = new ArrayList<>(sortedList);
@@ -674,7 +697,7 @@ public class AlignedWritableMemChunk extends 
AbstractWritableMemChunk {
         } catch (InterruptedException e) {
           Thread.currentThread().interrupt();
         }
-        alignedChunkWriter = new AlignedChunkWriterImpl(schemaList);
+        alignedChunkWriter = new AlignedChunkWriterImpl(schemaList, 
encryptParameter);
         encodeInfo.reset();
       }
     }
@@ -860,4 +883,9 @@ public class AlignedWritableMemChunk extends 
AbstractWritableMemChunk {
     }
     return avgPointSizeOfLargestColumn;
   }
+
+  @Override
+  public void setEncryptParameter(EncryptParameter encryptParameter) {
+    this.encryptParameter = encryptParameter;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunkGroup.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunkGroup.java
index 36acdedf9bc..ec73e7d9c43 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunkGroup.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunkGroup.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry;
 import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.utils.BitMap;
 import org.apache.tsfile.utils.Pair;
 import org.apache.tsfile.write.schema.IMeasurementSchema;
@@ -41,6 +42,8 @@ public class AlignedWritableMemChunkGroup implements 
IWritableMemChunkGroup {
 
   private AlignedWritableMemChunk memChunk;
 
+  private EncryptParameter encryptParameter;
+
   public AlignedWritableMemChunkGroup(List<IMeasurementSchema> schemaList, 
boolean isTableModel) {
     memChunk = new AlignedWritableMemChunk(schemaList, isTableModel);
   }
@@ -161,6 +164,12 @@ public class AlignedWritableMemChunkGroup implements 
IWritableMemChunkGroup {
     memChunk.serializeToWAL(buffer);
   }
 
+  @Override
+  public void setEncryptParameter(EncryptParameter encryptParameter) {
+    this.encryptParameter = encryptParameter;
+    memChunk.setEncryptParameter(encryptParameter);
+  }
+
   protected static AlignedWritableMemChunkGroup deserialize(
       DataInputStream stream, boolean isTableModel) throws IOException {
     AlignedWritableMemChunkGroup memChunkGroup = new 
AlignedWritableMemChunkGroup();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunk.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunk.java
index 13f09a05d8a..635e06da4b7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunk.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunk.java
@@ -23,6 +23,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.WALEntryValue;
 import org.apache.iotdb.db.utils.datastructure.BatchEncodeInfo;
 import org.apache.iotdb.db.utils.datastructure.TVList;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.utils.Binary;
 import org.apache.tsfile.utils.BitMap;
@@ -127,4 +128,6 @@ public interface IWritableMemChunk extends WALEntryValue {
   TVList getWorkingTVList();
 
   void setWorkingTVList(TVList list);
+
+  void setEncryptParameter(EncryptParameter encryptParameter);
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunkGroup.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunkGroup.java
index 62bf7700218..9e61d7aba92 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunkGroup.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/IWritableMemChunkGroup.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry;
 import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.WALEntryValue;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.utils.BitMap;
 import org.apache.tsfile.write.schema.IMeasurementSchema;
 
@@ -59,4 +60,6 @@ public interface IWritableMemChunkGroup extends WALEntryValue 
{
   IWritableMemChunk getWritableMemChunk(String measurement);
 
   long getMaxTime();
+
+  void setEncryptParameter(EncryptParameter encryptParameter);
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java
index 6909b3903dc..62756f4620b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java
@@ -73,6 +73,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.wal.utils.listener.WALFlushL
 import org.apache.iotdb.db.storageengine.rescon.memory.MemTableManager;
 import org.apache.iotdb.db.storageengine.rescon.memory.PrimitiveArrayManager;
 import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 import org.apache.iotdb.db.utils.MemUtils;
 import org.apache.iotdb.db.utils.ModificationUtils;
 import org.apache.iotdb.db.utils.datastructure.AlignedTVList;
@@ -224,7 +225,11 @@ public class TsFileProcessor {
     this.sequence = sequence;
     this.tsFileResource = new TsFileResource(tsfile, this);
     this.dataRegionInfo = dataRegionInfo;
-    this.writer = new RestorableTsFileIOWriter(tsfile);
+    this.writer =
+        new RestorableTsFileIOWriter(
+            tsfile,
+            EncryptDBUtils.getFirstEncryptParamFromDatabase(
+                dataRegionInfo.getDataRegion().getDatabaseName()));
     this.updateLatestFlushTimeCallback = updateLatestFlushTimeCallback;
     this.walNode =
         WALManager.getInstance()
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunk.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunk.java
index 1f4078dfc7d..ebf23154d15 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunk.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunk.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.storageengine.dataregion.memtable;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
@@ -29,6 +30,8 @@ import 
org.apache.iotdb.db.utils.datastructure.MemPointIterator;
 import org.apache.iotdb.db.utils.datastructure.MemPointIteratorFactory;
 import org.apache.iotdb.db.utils.datastructure.TVList;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.read.TimeValuePair;
 import org.apache.tsfile.read.common.TimeRange;
@@ -65,13 +68,26 @@ public class WritableMemChunk extends 
AbstractWritableMemChunk {
   private static final IoTDBConfig CONFIG = 
IoTDBDescriptor.getInstance().getConfig();
   private final int TVLIST_SORT_THRESHOLD = CONFIG.getTvListSortThreshold();
 
+  private EncryptParameter encryptParameter;
+
+  @TestOnly
   public WritableMemChunk(IMeasurementSchema schema) {
     this.schema = schema;
     this.list = TVList.newList(schema.getType());
     this.sortedList = new ArrayList<>();
+    this.encryptParameter = EncryptUtils.getEncryptParameter();
+  }
+
+  public WritableMemChunk(IMeasurementSchema schema, EncryptParameter 
encryptParameter) {
+    this.schema = schema;
+    this.list = TVList.newList(schema.getType());
+    this.sortedList = new ArrayList<>();
+    this.encryptParameter = encryptParameter;
   }
 
-  private WritableMemChunk() {}
+  private WritableMemChunk() {
+    this.encryptParameter = EncryptUtils.getEncryptParameter();
+  }
 
   protected void handoverTvList() {
     if (!list.isSorted()) {
@@ -330,7 +346,7 @@ public class WritableMemChunk extends 
AbstractWritableMemChunk {
 
   @Override
   public ChunkWriterImpl createIChunkWriter() {
-    return new ChunkWriterImpl(schema);
+    return new ChunkWriterImpl(schema, encryptParameter);
   }
 
   @Override
@@ -594,4 +610,9 @@ public class WritableMemChunk extends 
AbstractWritableMemChunk {
     Arrays.sort(filteredTimestamps);
     return filteredTimestamps;
   }
+
+  @Override
+  public void setEncryptParameter(EncryptParameter encryptParameter) {
+    this.encryptParameter = encryptParameter;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
index 56f69a447f6..07c76039ed0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
@@ -24,6 +24,8 @@ import 
org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry;
 import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
 import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
+import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.utils.BitMap;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 import org.apache.tsfile.write.schema.IMeasurementSchema;
@@ -39,9 +41,16 @@ import java.util.Map.Entry;
 public class WritableMemChunkGroup implements IWritableMemChunkGroup {
 
   private Map<String, IWritableMemChunk> memChunkMap;
+  private EncryptParameter encryptParameter;
 
   public WritableMemChunkGroup() {
     memChunkMap = new HashMap<>();
+    encryptParameter = EncryptUtils.getEncryptParameter();
+  }
+
+  public WritableMemChunkGroup(EncryptParameter encryptParameter) {
+    memChunkMap = new HashMap<>();
+    this.encryptParameter = encryptParameter;
   }
 
   @Override
@@ -70,7 +79,7 @@ public class WritableMemChunkGroup implements 
IWritableMemChunkGroup {
 
   private IWritableMemChunk createMemChunkIfNotExistAndGet(IMeasurementSchema 
schema) {
     return memChunkMap.computeIfAbsent(
-        schema.getMeasurementName(), k -> new WritableMemChunk(schema));
+        schema.getMeasurementName(), k -> new WritableMemChunk(schema, 
encryptParameter));
   }
 
   @Override
@@ -183,6 +192,14 @@ public class WritableMemChunkGroup implements 
IWritableMemChunkGroup {
     }
   }
 
+  @Override
+  public void setEncryptParameter(EncryptParameter encryptParameter) {
+    this.encryptParameter = encryptParameter;
+    for (IWritableMemChunk memChunk : memChunkMap.values()) {
+      memChunk.setEncryptParameter(encryptParameter);
+    }
+  }
+
   public static WritableMemChunkGroup deserialize(DataInputStream stream) 
throws IOException {
     WritableMemChunkGroup memChunkGroup = new WritableMemChunkGroup();
     int memChunkMapSize = stream.readInt();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/control/FileReaderManager.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/control/FileReaderManager.java
index 738f0038e5b..6df6866109d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/control/FileReaderManager.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/control/FileReaderManager.java
@@ -22,6 +22,7 @@ package 
org.apache.iotdb.db.storageengine.dataregion.read.control;
 import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileID;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
 import org.apache.tsfile.read.TsFileSequenceReader;
 import org.apache.tsfile.read.UnClosedTsFileReader;
@@ -148,10 +149,18 @@ public class FileReaderManager {
       TsFileSequenceReader tsFileReader = null;
       // check if the file is old version
       if (!isClosed) {
-        tsFileReader = new UnClosedTsFileReader(filePath, ioSizeRecorder);
+        tsFileReader =
+            new UnClosedTsFileReader(
+                filePath,
+                EncryptDBUtils.getFirstEncryptParamFromTSFilePath(filePath),
+                ioSizeRecorder);
       } else {
         // already do the version check in TsFileSequenceReader's constructor
-        tsFileReader = new TsFileSequenceReader(filePath, ioSizeRecorder);
+        tsFileReader =
+            new TsFileSequenceReader(
+                filePath,
+                ioSizeRecorder,
+                EncryptDBUtils.getFirstEncryptParamFromTSFilePath(filePath));
       }
       readerMap.put(tsFileID, tsFileReader);
       return tsFileReader;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileResourceUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileResourceUtils.java
index 875aaaec17a..ed1dba06350 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileResourceUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/TsFileResourceUtils.java
@@ -26,6 +26,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ArrayDeviceTimeIndex;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
 import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
@@ -130,7 +131,10 @@ public class TsFileResourceUtils {
   }
 
   public static boolean validateTsFileDataCorrectness(TsFileResource resource) 
{
-    try (TsFileSequenceReader reader = new 
TsFileSequenceReader(resource.getTsFilePath())) {
+    try (TsFileSequenceReader reader =
+        new TsFileSequenceReader(
+            resource.getTsFilePath(),
+            
EncryptDBUtils.getFirstEncryptParamFromTSFilePath(resource.getTsFilePath()))) {
       if (!reader.isComplete()) {
         logger.error("{} {} illegal tsfile", resource.getTsFilePath(), 
VALIDATE_FAILED);
         return false;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/AbstractTsFileRecoverPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/AbstractTsFileRecoverPerformer.java
index 73621a5208e..aec0151d80e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/AbstractTsFileRecoverPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/AbstractTsFileRecoverPerformer.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.exception.DataRegionException;
 import org.apache.iotdb.db.pipe.agent.PipeDataNodeAgent;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import org.apache.iotdb.db.storageengine.dataregion.utils.TsFileResourceUtils;
+import org.apache.iotdb.db.utils.EncryptDBUtils;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.tsfile.common.conf.TSFileConfig;
@@ -79,11 +80,15 @@ public abstract class AbstractTsFileRecoverPerformer 
implements Closeable {
       return;
     }
 
-    writer = new RestorableTsFileIOWriter(tsFile);
+    writer =
+        new RestorableTsFileIOWriter(
+            tsFile, 
EncryptDBUtils.getFirstEncryptParamFromTSFilePath(tsFile.getAbsolutePath()));
     if (writer.hasCrashed()) {
       byte versionNumber;
       try (TsFileSequenceReader sequenceReader =
-          new TsFileSequenceReader(tsFile.getAbsolutePath())) {
+          new TsFileSequenceReader(
+              tsFile.getAbsolutePath(),
+              
EncryptDBUtils.getFirstEncryptParamFromTSFilePath(tsFile.getAbsolutePath()))) {
         versionNumber = sequenceReader.readVersionNumber();
       } catch (NotCompatibleTsFileException e) {
         versionNumber = -1;
@@ -93,7 +98,10 @@ public abstract class AbstractTsFileRecoverPerformer 
implements Closeable {
         // cannot rewrite a file with V3 header, delete it first
         writer.close();
         tsFile.delete();
-        writer = new RestorableTsFileIOWriter(tsFile);
+        writer =
+            new RestorableTsFileIOWriter(
+                tsFile,
+                
EncryptDBUtils.getFirstEncryptParamFromTSFilePath(tsFile.getAbsolutePath()));
       }
     } else {
       reconstructResourceFile();
@@ -114,7 +122,10 @@ public abstract class AbstractTsFileRecoverPerformer 
implements Closeable {
 
   protected void reconstructResourceFile() throws IOException {
     try (TsFileSequenceReader reader =
-        new 
TsFileSequenceReader(tsFileResource.getTsFile().getAbsolutePath())) {
+        new TsFileSequenceReader(
+            tsFileResource.getTsFile().getAbsolutePath(),
+            EncryptDBUtils.getFirstEncryptParamFromTSFilePath(
+                tsFileResource.getTsFile().getAbsolutePath()))) {
       TsFileResourceUtils.updateTsFileResource(reader, tsFileResource);
     }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/utils/TsFileSequenceScan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/utils/TsFileSequenceScan.java
index eddb7a0e80c..a260a6e5339 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/utils/TsFileSequenceScan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/utils/TsFileSequenceScan.java
@@ -18,6 +18,8 @@
  */
 package org.apache.iotdb.db.tools.utils;
 
+import org.apache.iotdb.db.utils.EncryptDBUtils;
+
 import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.file.MetaMarker;
 import org.apache.tsfile.file.header.ChunkGroupHeader;
@@ -118,7 +120,10 @@ public abstract class TsFileSequenceScan {
 
   @SuppressWarnings("java:S1181")
   public void scanTsFile(File tsFile) {
-    try (TsFileSequenceReader r = new 
TsFileSequenceReader(tsFile.getAbsolutePath())) {
+    try (TsFileSequenceReader r =
+        new TsFileSequenceReader(
+            tsFile.getAbsolutePath(),
+            
EncryptDBUtils.getFirstEncryptParamFromTSFilePath(tsFile.getAbsolutePath()))) {
       this.reader = r;
       boolean shouldScan = onFileOpen(tsFile);
       if (!shouldScan) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/EncryptDBUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/EncryptDBUtils.java
new file mode 100644
index 00000000000..52396d149eb
--- /dev/null
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/EncryptDBUtils.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.utils;
+
+import org.apache.iotdb.db.conf.IoTDBConfig;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+
+import org.apache.tsfile.common.conf.TSFileConfig;
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.encrypt.EncryptParameter;
+import org.apache.tsfile.encrypt.EncryptUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+
+public class EncryptDBUtils {
+
+  private static final IoTDBConfig conf = 
IoTDBDescriptor.getInstance().getConfig();
+  private static final TSFileConfig tsFileConfig = 
TSFileDescriptor.getInstance().getConfig();
+
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(EncryptDBUtils.class);
+
+  private static volatile EncryptParameter defaultFirstEncryptParam;
+
+  public static EncryptParameter getFirstEncryptParamFromDatabase(String 
database) {
+    if (database == null || database.isEmpty()) {
+      return new EncryptParameter(tsFileConfig.getEncryptType(), 
tsFileConfig.getEncryptKey());
+    }
+    for (Map.Entry<String, EncryptParameter> entry : 
conf.getTSFileDBToEncryptMap().entrySet()) {
+      if (database.trim().equals(entry.getKey().trim())) {
+        return entry.getValue();
+      }
+    }
+    return getDefaultFirstEncryptParam();
+  }
+
+  public static EncryptParameter getSecondEncryptParamFromDatabase(String 
database) {
+    return 
EncryptUtils.getEncryptParameter(getFirstEncryptParamFromDatabase(database));
+  }
+
+  public static EncryptParameter getFirstEncryptParamFromTSFilePath(String 
tsFilePath) {
+    if (tsFilePath == null || tsFilePath.isEmpty()) {
+      return new EncryptParameter(tsFileConfig.getEncryptType(), 
tsFileConfig.getEncryptKey());
+    }
+    // Use system-specific file separator
+    String separator = java.io.File.separator;
+    String[] pathSegments = tsFilePath.split(separator.equals("\\") ? "\\\\" : 
separator);
+    for (int i = pathSegments.length - 1; i >= 0; i--) {
+      if ("sequence".equals(pathSegments[i]) || 
"unsequence".equals(pathSegments[i])) {
+        if (i + 1 < pathSegments.length) {
+          return getFirstEncryptParamFromDatabase(pathSegments[i + 1]);
+        }
+      }
+    }
+    return getDefaultFirstEncryptParam();
+  }
+
+  public static EncryptParameter getDefaultFirstEncryptParam() {
+    if (defaultFirstEncryptParam == null) {
+      synchronized (EncryptDBUtils.class) {
+        if (defaultFirstEncryptParam == null) {
+          defaultFirstEncryptParam =
+              new EncryptParameter(tsFileConfig.getEncryptType(), 
tsFileConfig.getEncryptKey());
+        }
+      }
+    }
+    return defaultFirstEncryptParam;
+  }
+}

Reply via email to