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

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


The following commit(s) were added to refs/heads/iotdb by this push:
     new 06e5edd9 Use reflection method to generate encrypt instances (#233)
06e5edd9 is described below

commit 06e5edd98c5f8294cca1cc3e7e5ebccfda68d418
Author: jintao zhu <[email protected]>
AuthorDate: Fri Oct 25 14:34:00 2024 +0800

    Use reflection method to generate encrypt instances (#233)
    
    * code review
    
    * use reflection
    
    * use reflection
    
    * spotless apply
    
    * add error information
    
    * DEBUGGING
    
    * code review
    
    * delete debugging codes
    
    * default unencrypted
    
    * review modify
    
    * delete debugging codes
    
    ---------
    
    Co-authored-by: zhujt <[email protected]>
    (cherry picked from commit 53f86c2764ff9712e937e762d0464dc286a88d52)
---
 .../apache/tsfile/common/conf/TSFileConfig.java    |  18 +-
 .../encrypt/{SM4_Context.java => AES128.java}      |  22 +-
 .../org/apache/tsfile/encrypt/AES128Decryptor.java |  84 ++++++
 .../org/apache/tsfile/encrypt/AES128Encryptor.java |  84 ++++++
 .../org/apache/tsfile/encrypt/EncryptUtils.java    | 113 +++++--
 .../java/org/apache/tsfile/encrypt/IDecryptor.java | 138 ++-------
 .../encrypt/{SM4_Context.java => IEncrypt.java}    |  17 +-
 .../java/org/apache/tsfile/encrypt/IEncryptor.java | 141 ++-------
 .../encrypt/{SM4_Context.java => NoDecryptor.java} |  27 +-
 .../encrypt/{SM4_Context.java => NoEncryptor.java} |  27 +-
 .../main/java/org/apache/tsfile/encrypt/SM4.java   | 326 ---------------------
 .../java/org/apache/tsfile/encrypt/SM4Utils.java   |  90 ------
 .../encrypt/{SM4_Context.java => UNENCRYPTED.java} |  27 +-
 .../tsfile/file/metadata/TsFileMetadata.java       |  12 +-
 .../tsfile/file/metadata/enums/EncryptionType.java |   2 +-
 .../apache/tsfile/read/TsFileSequenceReader.java   |  25 +-
 .../java/org/apache/tsfile/read/common/Chunk.java  |   4 +-
 .../tsfile/read/reader/chunk/ChunkReader.java      |   6 +-
 .../tsfile/read/reader/page/LazyLoadPageData.java  |   6 +-
 .../java/org/apache/tsfile/write/TsFileWriter.java |   9 +-
 .../write/chunk/AlignedChunkGroupWriterImpl.java   |   5 +-
 .../tsfile/write/chunk/AlignedChunkWriterImpl.java |   6 +-
 .../apache/tsfile/write/chunk/ChunkWriterImpl.java |   2 +-
 .../chunk/NonAlignedChunkGroupWriterImpl.java      |   2 +-
 .../apache/tsfile/write/chunk/TimeChunkWriter.java |   2 +-
 .../tsfile/write/chunk/ValueChunkWriter.java       |   2 +-
 .../org/apache/tsfile/write/page/PageWriter.java   |   2 +-
 .../apache/tsfile/write/page/TimePageWriter.java   |   2 +-
 .../apache/tsfile/write/page/ValuePageWriter.java  |   2 +-
 .../apache/tsfile/write/writer/TsFileIOWriter.java |  26 +-
 .../java/org/apache/tsfile/encrypt/AES128Test.java |  21 +-
 .../tsfile/encrypt/AES128TsFileReadWriteTest.java  |   4 +-
 .../tsfile/encrypt/AES128TsFileWriteTest.java      |   4 +-
 .../org/apache/tsfile/encrypt/EncryptTest.java     |  61 ++--
 .../java/org/apache/tsfile/encrypt/SM4128Test.java |  76 -----
 .../tsfile/encrypt/SM4128TsFileReadWriteTest.java  | 265 -----------------
 .../tsfile/encrypt/SM4128TsFileWriteTest.java      | 291 ------------------
 37 files changed, 496 insertions(+), 1455 deletions(-)

diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java 
b/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
index 40fd6c37..a368a042 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
@@ -22,7 +22,6 @@ package org.apache.tsfile.common.conf;
 import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.enums.CompressionType;
-import org.apache.tsfile.file.metadata.enums.EncryptionType;
 import org.apache.tsfile.fileSystem.FSType;
 import org.apache.tsfile.utils.FSUtils;
 
@@ -144,8 +143,11 @@ public class TSFileConfig implements Serializable {
   /** encryptKey, this should be 16 bytes String. */
   private String encryptKey = "abcdefghijklmnop";
 
-  /** default encryptType is "UNENCRYPTED", TsFile supports UNENCRYPTED, 
SM4128 or AES128. */
-  private EncryptionType encryptType = EncryptionType.UNENCRYPTED;
+  /**
+   * default encryptType is "org.apache.tsfile.encrypt.UNENCRYPTED", TsFile 
supports UNENCRYPTED or
+   * AES128.
+   */
+  private String encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
 
   /** Line count threshold for checking page memory occupied size. */
   private int pageCheckSizeThreshold = 100;
@@ -234,12 +236,12 @@ public class TSFileConfig implements Serializable {
     this.encryptFlag = Boolean.parseBoolean(encryptFlag);
   }
 
-  public EncryptionType getEncryptType() {
+  public String getEncryptType() {
     return this.encryptType;
   }
 
   public void setEncryptType(String encryptType) {
-    this.encryptType = EncryptionType.valueOf(encryptType);
+    this.encryptType = encryptType;
   }
 
   public String getEncryptKey() {
@@ -254,12 +256,6 @@ public class TSFileConfig implements Serializable {
     if (!encryptFlag) {
       return;
     }
-    if (encryptKeyPath == null) {
-      throw new RuntimeException("encrypt key path is null");
-    }
-    if (encryptKeyPath.isEmpty()) {
-      throw new RuntimeException("encrypt key path is empty");
-    }
     this.encryptKey = EncryptUtils.getEncryptKeyFromPath(encryptKeyPath);
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128.java
similarity index 74%
copy from java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
copy to java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128.java
index 53749ccb..b69eea8e 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128.java
@@ -16,19 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.tsfile.encrypt;
 
-public class SM4_Context {
-  public int mode;
+public class AES128 implements IEncrypt {
+
+  private final byte[] key;
 
-  public long[] sk;
+  public AES128(byte[] key) {
+    this.key = key;
+  }
 
-  public boolean isPadding;
+  @Override
+  public IEncryptor getEncryptor() {
+    return new AES128Encryptor(key);
+  }
 
-  public SM4_Context() {
-    this.mode = 1;
-    this.isPadding = false;
-    this.sk = new long[32];
+  @Override
+  public IDecryptor getDecryptor() {
+    return new AES128Decryptor(key);
   }
 }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Decryptor.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Decryptor.java
new file mode 100644
index 00000000..768f9afc
--- /dev/null
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Decryptor.java
@@ -0,0 +1,84 @@
+/*
+ * 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.tsfile.encrypt;
+
+import org.apache.tsfile.exception.encrypt.EncryptException;
+import org.apache.tsfile.exception.encrypt.EncryptKeyLengthNotMatchException;
+import org.apache.tsfile.file.metadata.enums.EncryptionType;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+public class AES128Decryptor implements IDecryptor {
+  private final Cipher AES;
+
+  private final SecretKeySpec secretKeySpec;
+
+  private final IvParameterSpec ivParameterSpec;
+
+  AES128Decryptor(byte[] key) {
+    if (key.length != 16) {
+      throw new EncryptKeyLengthNotMatchException(16, key.length);
+    }
+    secretKeySpec = new SecretKeySpec(key, "AES");
+    // Create IV parameter
+    ivParameterSpec = new IvParameterSpec(key);
+    try {
+      // Create Cipher instance and initialize it for encryption in CTR mode 
without padding
+      this.AES = Cipher.getInstance("AES/CTR/NoPadding");
+      AES.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
+    } catch (InvalidAlgorithmParameterException
+        | NoSuchPaddingException
+        | NoSuchAlgorithmException
+        | InvalidKeyException e) {
+      throw new EncryptException("AES128Decryptor init failed ", e);
+    }
+  }
+
+  @Override
+  public byte[] decrypt(byte[] data) {
+    try {
+      return AES.doFinal(data);
+    } catch (IllegalBlockSizeException | BadPaddingException e) {
+      throw new EncryptException("AES128Decryptor decrypt failed ", e);
+    }
+  }
+
+  @Override
+  public byte[] decrypt(byte[] data, int offset, int size) {
+    try {
+      return AES.doFinal(data, offset, size);
+    } catch (IllegalBlockSizeException | BadPaddingException e) {
+      throw new EncryptException("AES128Decryptor decrypt failed ", e);
+    }
+  }
+
+  @Override
+  public EncryptionType getEncryptionType() {
+    return EncryptionType.AES128;
+  }
+}
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Encryptor.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Encryptor.java
new file mode 100644
index 00000000..b4d8c2a7
--- /dev/null
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Encryptor.java
@@ -0,0 +1,84 @@
+/*
+ * 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.tsfile.encrypt;
+
+import org.apache.tsfile.exception.encrypt.EncryptException;
+import org.apache.tsfile.exception.encrypt.EncryptKeyLengthNotMatchException;
+import org.apache.tsfile.file.metadata.enums.EncryptionType;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+public class AES128Encryptor implements IEncryptor {
+  private final Cipher AES;
+
+  private final SecretKeySpec secretKeySpec;
+
+  private final IvParameterSpec ivParameterSpec;
+
+  AES128Encryptor(byte[] key) {
+    if (key.length != 16) {
+      throw new EncryptKeyLengthNotMatchException(16, key.length);
+    }
+    secretKeySpec = new SecretKeySpec(key, "AES");
+    // Create IV parameter
+    ivParameterSpec = new IvParameterSpec(key);
+    try {
+      // Create Cipher instance and initialize it for encryption in CTR mode 
without padding
+      this.AES = Cipher.getInstance("AES/CTR/NoPadding");
+      AES.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
+    } catch (InvalidAlgorithmParameterException
+        | NoSuchPaddingException
+        | NoSuchAlgorithmException
+        | InvalidKeyException e) {
+      throw new EncryptException("AES128Encryptor init failed ", e);
+    }
+  }
+
+  @Override
+  public byte[] encrypt(byte[] data) {
+    try {
+      return AES.doFinal(data);
+    } catch (IllegalBlockSizeException | BadPaddingException e) {
+      throw new EncryptException("AES128Encryptor encrypt failed ", e);
+    }
+  }
+
+  @Override
+  public byte[] encrypt(byte[] data, int offset, int size) {
+    try {
+      return AES.doFinal(data, offset, size);
+    } catch (IllegalBlockSizeException | BadPaddingException e) {
+      throw new EncryptException("AES128Encryptor encrypt failed ", e);
+    }
+  }
+
+  @Override
+  public EncryptionType getEncryptionType() {
+    return EncryptionType.AES128;
+  }
+}
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java
index 87ed1381..034eb40c 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java
@@ -18,24 +18,42 @@
  */
 package org.apache.tsfile.encrypt;
 
+import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.exception.encrypt.EncryptException;
-import org.apache.tsfile.file.metadata.enums.EncryptionType;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.security.MessageDigest;
 
 public class EncryptUtils {
 
+  private static final Logger logger = 
LoggerFactory.getLogger(EncryptUtils.class);
+
+  private static final String defaultKey = "abcdefghijklmnop";
+
   public static String normalKeyStr = getNormalKeyStr();
 
-  public static IEncryptor encryptor = getDefaultEncryptor();
+  public static IEncrypt encrypt = getEncrypt();
 
-  public static IDecryptor decryptor = getDefaultDecryptor();
+  public static IEncryptor encryptor = encrypt.getEncryptor();
+
+  public static IDecryptor decryptor = encrypt.getDecryptor();
 
   public static String getEncryptKeyFromPath(String path) {
+    if (path == null) {
+      logger.error("encrypt key path is null, use the default key");
+      return defaultKey;
+    }
+    if (path.isEmpty()) {
+      logger.error("encrypt key path is empty, use the default key");
+      return defaultKey;
+    }
     try (BufferedReader br = new BufferedReader(new FileReader(path))) {
       StringBuilder sb = new StringBuilder();
       String line;
@@ -50,7 +68,7 @@ public class EncryptUtils {
       }
       return sb.toString();
     } catch (IOException e) {
-      throw new RuntimeException(e);
+      throw new EncryptException("Read main encrypt key error", e);
     }
   }
 
@@ -84,6 +102,12 @@ public class EncryptUtils {
       md.update("IoTDB is the best".getBytes());
       
md.update(TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes());
       byte[] data_key = md.digest();
+      data_key =
+          IEncryptor.getEncryptor(
+                  TSFileDescriptor.getInstance().getConfig().getEncryptType(),
+                  
TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes())
+              .encrypt(data_key);
+
       StringBuilder valueStr = new StringBuilder();
 
       for (byte b : data_key) {
@@ -99,8 +123,33 @@ public class EncryptUtils {
     }
   }
 
-  public static IEncryptor getDefaultEncryptor() {
-    EncryptionType encryptType;
+  public static String getNormalKeyStr(TSFileConfig conf) {
+    try {
+      MessageDigest md = MessageDigest.getInstance("MD5");
+      md.update("IoTDB is the best".getBytes());
+      md.update(conf.getEncryptKey().getBytes());
+      byte[] data_key = md.digest();
+      data_key =
+          IEncryptor.getEncryptor(conf.getEncryptType(), 
conf.getEncryptKey().getBytes())
+              .encrypt(data_key);
+
+      StringBuilder valueStr = new StringBuilder();
+
+      for (byte b : data_key) {
+        valueStr.append(b).append(",");
+      }
+
+      valueStr.deleteCharAt(valueStr.length() - 1);
+      String str = valueStr.toString();
+
+      return str;
+    } catch (Exception e) {
+      throw new EncryptException("md5 function not found while using md5 to 
generate data key", e);
+    }
+  }
+
+  public static IEncrypt getEncrypt() {
+    String encryptType;
     byte[] dataEncryptKey;
     if (TSFileDescriptor.getInstance().getConfig().getEncryptFlag()) {
       encryptType = 
TSFileDescriptor.getInstance().getConfig().getEncryptType();
@@ -109,37 +158,61 @@ public class EncryptUtils {
         md.update("IoTDB is the best".getBytes());
         
md.update(TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes());
         dataEncryptKey = md.digest();
-      } catch (Exception e1) {
-        throw new EncryptException("md5 function not found while using md5 to 
generate data key");
+      } catch (Exception e) {
+        throw new EncryptException(
+            "md5 function not found while using md5 to generate data key", e);
       }
     } else {
-      encryptType = EncryptionType.UNENCRYPTED;
+      encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
       dataEncryptKey = null;
     }
-    return IEncryptor.getEncryptor(encryptType, dataEncryptKey);
+    try {
+      Class<?> encryptTypeClass = Class.forName(encryptType);
+      java.lang.reflect.Constructor<?> constructor =
+          encryptTypeClass.getDeclaredConstructor(byte[].class);
+      return ((IEncrypt) constructor.newInstance(dataEncryptKey));
+    } catch (ClassNotFoundException e) {
+      throw new EncryptException("Get encryptor class failed: " + encryptType, 
e);
+    } catch (NoSuchMethodException e) {
+      throw new EncryptException("Get constructor for encryptor failed: " + 
encryptType, e);
+    } catch (InvocationTargetException | InstantiationException | 
IllegalAccessException e) {
+      throw new EncryptException("New encryptor instance failed: " + 
encryptType, e);
+    }
   }
 
-  public static IDecryptor getDefaultDecryptor() {
-    EncryptionType encryptType;
+  public static IEncrypt getEncrypt(TSFileConfig conf) {
+    String encryptType;
     byte[] dataEncryptKey;
-    if (TSFileDescriptor.getInstance().getConfig().getEncryptFlag()) {
-      encryptType = 
TSFileDescriptor.getInstance().getConfig().getEncryptType();
+    if (conf.getEncryptFlag()) {
+      encryptType = conf.getEncryptType();
       try {
         MessageDigest md = MessageDigest.getInstance("MD5");
         md.update("IoTDB is the best".getBytes());
-        
md.update(TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes());
+        md.update(conf.getEncryptKey().getBytes());
         dataEncryptKey = md.digest();
-      } catch (Exception e1) {
-        throw new EncryptException("md5 function not found while using md5 to 
generate data key");
+      } catch (Exception e) {
+        throw new EncryptException(
+            "md5 function not found while using md5 to generate data key", e);
       }
     } else {
-      encryptType = EncryptionType.UNENCRYPTED;
+      encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
       dataEncryptKey = null;
     }
-    return IDecryptor.getDecryptor(encryptType, dataEncryptKey);
+    try {
+      Class<?> encryptTypeClass = Class.forName(encryptType);
+      java.lang.reflect.Constructor<?> constructor =
+          encryptTypeClass.getDeclaredConstructor(byte[].class);
+      return ((IEncrypt) constructor.newInstance(dataEncryptKey));
+    } catch (ClassNotFoundException e) {
+      throw new EncryptException("Get encryptor class failed: " + encryptType, 
e);
+    } catch (NoSuchMethodException e) {
+      throw new EncryptException("Get constructor for encryptor failed: " + 
encryptType, e);
+    } catch (InvocationTargetException | InstantiationException | 
IllegalAccessException e) {
+      throw new EncryptException("New encryptor instance failed: " + 
encryptType, e);
+    }
   }
 
-  public static byte[] getKeyFromStr(String str) {
+  public static byte[] getSecondKeyFromStr(String str) {
     String[] strArray = str.split(",");
     byte[] key = new byte[strArray.length];
     for (int i = 0; i < strArray.length; i++) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java
index 0707ba3b..a7be7b73 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java
@@ -20,47 +20,34 @@
 package org.apache.tsfile.encrypt;
 
 import org.apache.tsfile.exception.encrypt.EncryptException;
-import org.apache.tsfile.exception.encrypt.EncryptKeyLengthNotMatchException;
 import org.apache.tsfile.file.metadata.enums.EncryptionType;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
+import java.lang.reflect.InvocationTargetException;
 
 /** encrypt data according to tsfileconfig. */
 public interface IDecryptor {
 
   static final Logger logger = LoggerFactory.getLogger(IDecryptor.class);
 
-  static IDecryptor getDecryptor(String name, byte[] key) {
-    return getDecryptor(EncryptionType.valueOf(name), key);
-  }
-
-  static IDecryptor getDecryptor(EncryptionType name, byte[] key) {
-    if (name == null) {
-      return new NoDecryptor();
-    }
-    switch (name) {
-      case UNENCRYPTED:
-        return new NoDecryptor();
-      case SM4128:
-        return new SM4128Decryptor(key);
-      case AES128:
-        return new AES128Decryptor(key);
-      default:
-        logger.warn("Unknown encryption type: {}", name);
-        return new NoDecryptor();
+  static IDecryptor getDecryptor(String type, byte[] key) {
+    try {
+      if (IEncrypt.encryptMap.containsKey(type)) {
+        return ((IEncrypt) 
IEncrypt.encryptMap.get(type).newInstance(key)).getDecryptor();
+      }
+      Class<?> encryptClass = Class.forName(type);
+      java.lang.reflect.Constructor<?> constructor =
+          encryptClass.getDeclaredConstructor(byte[].class);
+      IEncrypt.encryptMap.put(type, constructor);
+      return ((IEncrypt) constructor.newInstance(key)).getDecryptor();
+    } catch (ClassNotFoundException e) {
+      throw new EncryptException("Get decryptor class failed: " + type, e);
+    } catch (NoSuchMethodException e) {
+      throw new EncryptException("Get constructor for decryptor failed: " + 
type, e);
+    } catch (InvocationTargetException | InstantiationException | 
IllegalAccessException e) {
+      throw new EncryptException("New decryptor instance failed: " + type, e);
     }
   }
 
@@ -69,95 +56,4 @@ public interface IDecryptor {
   byte[] decrypt(byte[] data, int offset, int size);
 
   EncryptionType getEncryptionType();
-
-  class NoDecryptor implements IDecryptor {
-
-    @Override
-    public byte[] decrypt(byte[] data) {
-      return data;
-    }
-
-    @Override
-    public byte[] decrypt(byte[] data, int offset, int size) {
-      return Arrays.copyOfRange(data, offset, offset + size);
-    }
-
-    @Override
-    public EncryptionType getEncryptionType() {
-      return EncryptionType.UNENCRYPTED;
-    }
-  }
-
-  class SM4128Decryptor implements IDecryptor {
-
-    private final SM4Utils sm4;
-
-    SM4128Decryptor(byte[] key) {
-      if (key.length != 16) {
-        throw new EncryptKeyLengthNotMatchException(16, key.length);
-      }
-      this.sm4 = new SM4Utils(key, key);
-    }
-
-    @Override
-    public byte[] decrypt(byte[] data) {
-      return sm4.cryptData_CTR(data);
-    }
-
-    @Override
-    public byte[] decrypt(byte[] data, int offset, int size) {
-      return decrypt(Arrays.copyOfRange(data, offset, offset + size));
-    }
-
-    @Override
-    public EncryptionType getEncryptionType() {
-      return EncryptionType.SM4128;
-    }
-  }
-
-  class AES128Decryptor implements IDecryptor {
-    private final Cipher AES;
-
-    AES128Decryptor(byte[] key) {
-      if (key.length != 16) {
-        throw new EncryptKeyLengthNotMatchException(16, key.length);
-      }
-      SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
-      // Create IV parameter
-      IvParameterSpec ivParameterSpec = new IvParameterSpec(key);
-      try {
-        // Create Cipher instance and initialize it for encryption in CTR mode 
without padding
-        this.AES = Cipher.getInstance("AES/CTR/NoPadding");
-        AES.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
-      } catch (InvalidAlgorithmParameterException
-          | NoSuchPaddingException
-          | NoSuchAlgorithmException
-          | InvalidKeyException e) {
-        throw new EncryptException("AES128Decryptor init failed ", e);
-      }
-    }
-
-    @Override
-    public byte[] decrypt(byte[] data) {
-      try {
-        return AES.doFinal(data);
-      } catch (IllegalBlockSizeException | BadPaddingException e) {
-        throw new EncryptException("AES128Decryptor decrypt failed ", e);
-      }
-    }
-
-    @Override
-    public byte[] decrypt(byte[] data, int offset, int size) {
-      try {
-        return AES.doFinal(data, offset, size);
-      } catch (IllegalBlockSizeException | BadPaddingException e) {
-        throw new EncryptException("AES128Decryptor decrypt failed ", e);
-      }
-    }
-
-    @Override
-    public EncryptionType getEncryptionType() {
-      return EncryptionType.AES128;
-    }
-  }
 }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncrypt.java
similarity index 77%
copy from java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
copy to java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncrypt.java
index 53749ccb..24b691d2 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncrypt.java
@@ -16,19 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.tsfile.encrypt;
 
-public class SM4_Context {
-  public int mode;
+import java.util.concurrent.ConcurrentHashMap;
+
+public interface IEncrypt {
 
-  public long[] sk;
+  static ConcurrentHashMap<String, java.lang.reflect.Constructor<?>> 
encryptMap =
+      new ConcurrentHashMap<>();
 
-  public boolean isPadding;
+  IDecryptor getDecryptor();
 
-  public SM4_Context() {
-    this.mode = 1;
-    this.isPadding = false;
-    this.sk = new long[32];
-  }
+  IEncryptor getEncryptor();
 }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java
index 1c21d37d..d26ab9dc 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java
@@ -20,48 +20,34 @@
 package org.apache.tsfile.encrypt;
 
 import org.apache.tsfile.exception.encrypt.EncryptException;
-import org.apache.tsfile.exception.encrypt.EncryptKeyLengthNotMatchException;
 import org.apache.tsfile.file.metadata.enums.EncryptionType;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
+import java.lang.reflect.InvocationTargetException;
 
 /** encrypt data according to tsfileconfig. */
 public interface IEncryptor {
 
-  Logger logger = LoggerFactory.getLogger(IEncryptor.class);
-
-  static IEncryptor getEncryptor(String name, byte[] key) {
-    return getEncryptor(EncryptionType.valueOf(name), key);
-  }
+  static final Logger logger = LoggerFactory.getLogger(IEncryptor.class);
 
-  static IEncryptor getEncryptor(EncryptionType name, byte[] key) {
-    if (name == null) {
-      return new NoEncryptor();
-    }
-    switch (name) {
-      case SM4128:
-        return new SM4128Encryptor(key);
-      case AES128:
-        return new AES128Encryptor(key);
-      case UNENCRYPTED:
-        return new NoEncryptor();
-      default:
-        // log a warning
-        logger.warn("Unknown encryption type: {}", name);
-        return new NoEncryptor();
+  static IEncryptor getEncryptor(String type, byte[] key) {
+    try {
+      if (IEncrypt.encryptMap.containsKey(type)) {
+        return ((IEncrypt) 
IEncrypt.encryptMap.get(type).newInstance(key)).getEncryptor();
+      }
+      Class<?> encryptClass = Class.forName(type);
+      java.lang.reflect.Constructor<?> constructor =
+          encryptClass.getDeclaredConstructor(byte[].class);
+      IEncrypt.encryptMap.put(type, constructor);
+      return ((IEncrypt) constructor.newInstance(key)).getEncryptor();
+    } catch (ClassNotFoundException e) {
+      throw new EncryptException("Get encryptor class failed: " + type, e);
+    } catch (NoSuchMethodException e) {
+      throw new EncryptException("Get constructor for encryptor failed: " + 
type, e);
+    } catch (InvocationTargetException | InstantiationException | 
IllegalAccessException e) {
+      throw new EncryptException("New encryptor instance failed: " + type, e);
     }
   }
 
@@ -70,95 +56,4 @@ public interface IEncryptor {
   byte[] encrypt(byte[] data, int offset, int size);
 
   EncryptionType getEncryptionType();
-
-  class NoEncryptor implements IEncryptor {
-
-    @Override
-    public byte[] encrypt(byte[] data) {
-      return data;
-    }
-
-    @Override
-    public byte[] encrypt(byte[] data, int offset, int size) {
-      return Arrays.copyOfRange(data, offset, offset + size);
-    }
-
-    @Override
-    public EncryptionType getEncryptionType() {
-      return EncryptionType.UNENCRYPTED;
-    }
-  }
-
-  class SM4128Encryptor implements IEncryptor {
-
-    private final SM4Utils sm4;
-
-    SM4128Encryptor(byte[] key) {
-      if (key.length != 16) {
-        throw new EncryptKeyLengthNotMatchException(16, key.length);
-      }
-      this.sm4 = new SM4Utils(key, key);
-    }
-
-    @Override
-    public byte[] encrypt(byte[] data) {
-      return sm4.cryptData_CTR(data);
-    }
-
-    @Override
-    public byte[] encrypt(byte[] data, int offset, int size) {
-      return encrypt(Arrays.copyOfRange(data, offset, offset + size));
-    }
-
-    @Override
-    public EncryptionType getEncryptionType() {
-      return EncryptionType.SM4128;
-    }
-  }
-
-  class AES128Encryptor implements IEncryptor {
-    private final Cipher AES;
-
-    AES128Encryptor(byte[] key) {
-      if (key.length != 16) {
-        throw new EncryptKeyLengthNotMatchException(16, key.length);
-      }
-      SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
-      // Create IV parameter
-      IvParameterSpec ivParameterSpec = new IvParameterSpec(key);
-      try {
-        // Create Cipher instance and initialize it for encryption in CTR mode 
without padding
-        this.AES = Cipher.getInstance("AES/CTR/NoPadding");
-        AES.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
-      } catch (InvalidAlgorithmParameterException
-          | NoSuchPaddingException
-          | NoSuchAlgorithmException
-          | InvalidKeyException e) {
-        throw new EncryptException("AES128Encryptor init failed ", e);
-      }
-    }
-
-    @Override
-    public byte[] encrypt(byte[] data) {
-      try {
-        return AES.doFinal(data);
-      } catch (IllegalBlockSizeException | BadPaddingException e) {
-        throw new EncryptException("AES128Encryptor encrypt failed ", e);
-      }
-    }
-
-    @Override
-    public byte[] encrypt(byte[] data, int offset, int size) {
-      try {
-        return AES.doFinal(data, offset, size);
-      } catch (IllegalBlockSizeException | BadPaddingException e) {
-        throw new EncryptException("AES128Encryptor encrypt failed ", e);
-      }
-    }
-
-    @Override
-    public EncryptionType getEncryptionType() {
-      return EncryptionType.AES128;
-    }
-  }
 }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoDecryptor.java
similarity index 64%
copy from java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
copy to java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoDecryptor.java
index 53749ccb..ac743f9c 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoDecryptor.java
@@ -16,19 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.tsfile.encrypt;
 
-public class SM4_Context {
-  public int mode;
+import org.apache.tsfile.file.metadata.enums.EncryptionType;
+
+import java.util.Arrays;
+
+public class NoDecryptor implements IDecryptor {
 
-  public long[] sk;
+  NoDecryptor(byte[] key) {}
 
-  public boolean isPadding;
+  @Override
+  public byte[] decrypt(byte[] data) {
+    return data;
+  }
+
+  @Override
+  public byte[] decrypt(byte[] data, int offset, int size) {
+    return Arrays.copyOfRange(data, offset, offset + size);
+  }
 
-  public SM4_Context() {
-    this.mode = 1;
-    this.isPadding = false;
-    this.sk = new long[32];
+  @Override
+  public EncryptionType getEncryptionType() {
+    return EncryptionType.UNENCRYPTED;
   }
 }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoEncryptor.java
similarity index 64%
copy from java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
copy to java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoEncryptor.java
index 53749ccb..45dea8fe 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoEncryptor.java
@@ -16,19 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.tsfile.encrypt;
 
-public class SM4_Context {
-  public int mode;
+import org.apache.tsfile.file.metadata.enums.EncryptionType;
+
+import java.util.Arrays;
+
+public class NoEncryptor implements IEncryptor {
 
-  public long[] sk;
+  NoEncryptor(byte[] key) {}
 
-  public boolean isPadding;
+  @Override
+  public byte[] encrypt(byte[] data) {
+    return data;
+  }
+
+  @Override
+  public byte[] encrypt(byte[] data, int offset, int size) {
+    return Arrays.copyOfRange(data, offset, offset + size);
+  }
 
-  public SM4_Context() {
-    this.mode = 1;
-    this.isPadding = false;
-    this.sk = new long[32];
+  @Override
+  public EncryptionType getEncryptionType() {
+    return EncryptionType.UNENCRYPTED;
   }
 }
diff --git a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4.java
deleted file mode 100644
index fa453289..00000000
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * 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.tsfile.encrypt;
-
-import org.apache.tsfile.exception.encrypt.EncryptException;
-import org.apache.tsfile.exception.encrypt.EncryptKeyLengthNotMatchException;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-public class SM4 {
-  public static final int SM4_ENCRYPT = 1;
-
-  public static final int SM4_DECRYPT = 0;
-
-  private long GET_ULONG_BE(byte[] b, int i) {
-    long n =
-        (long) (b[i] & 0xff) << 24
-            | (long) ((b[i + 1] & 0xff) << 16)
-            | (long) ((b[i + 2] & 0xff) << 8)
-            | (long) (b[i + 3] & 0xff) & 0xffffffffL;
-    return n;
-  }
-
-  private void PUT_ULONG_BE(long n, byte[] b, int i) {
-    b[i] = (byte) (int) (0xFF & n >> 24);
-    b[i + 1] = (byte) (int) (0xFF & n >> 16);
-    b[i + 2] = (byte) (int) (0xFF & n >> 8);
-    b[i + 3] = (byte) (int) (0xFF & n);
-  }
-
-  private long SHL(long x, int n) {
-    return (x & 0xFFFFFFFF) << n;
-  }
-
-  private long ROTL(long x, int n) {
-    return SHL(x, n) | x >> (32 - n);
-  }
-
-  private void SWAP(long[] sk, int i) {
-    long t = sk[i];
-    sk[i] = sk[(31 - i)];
-    sk[(31 - i)] = t;
-  }
-
-  public static final byte[] SboxTable =
-      EncryptUtils.hexStringToByteArray(
-          
"D690E9FECCE13DB716B614C228FB2C052B679A762ABE04C3AA441326498606999C4250F491EF987A33540B43EDCFAC62E4B31CA9C908E89580DF94FA758F3FA64707A7FCF37317BA83593C19E6854FA8686B81B27164DA8BF8EB0F4B70569D351E240E5E6358D1A225227C3B01217887D40046579FD327524C3602E7A0C4C89EEABF8AD240C738B5A3F7F2CEF96115A1E0AE5DA49B341A55AD933230F58CB1E31DF6E22E8266CA60C02923AB0D534E6FD5DB3745DEFD8E2F03FF6A726D6C5B518D1BAF92BBDDBC7F11D95C411F105AD80AC13188A5CD7BBD2D74D012B8E5B4B08969974A0C96777E65B9F109C56EC6841
 [...]
-
-  public static final int[] FK = {0xa3b1bac6, 0x56aa3350, 0x677d9197, 
0xb27022dc};
-
-  public static final int[] CK = {
-    0x00070e15,
-    0x1c232a31,
-    0x383f464d,
-    0x545b6269,
-    0x70777e85,
-    0x8c939aa1,
-    0xa8afb6bd,
-    0xc4cbd2d9,
-    0xe0e7eef5,
-    0xfc030a11,
-    0x181f262d,
-    0x343b4249,
-    0x50575e65,
-    0x6c737a81,
-    0x888f969d,
-    0xa4abb2b9,
-    0xc0c7ced5,
-    0xdce3eaf1,
-    0xf8ff060d,
-    0x141b2229,
-    0x30373e45,
-    0x4c535a61,
-    0x686f767d,
-    0x848b9299,
-    0xa0a7aeb5,
-    0xbcc3cad1,
-    0xd8dfe6ed,
-    0xf4fb0209,
-    0x10171e25,
-    0x2c333a41,
-    0x484f565d,
-    0x646b7279
-  };
-
-  private byte sm4Sbox(byte inch) {
-    int i = inch & 0xFF;
-    byte retVal = SboxTable[i];
-    return retVal;
-  }
-
-  private long sm4Lt(long ka) {
-    long bb = 0L;
-    long c = 0L;
-    byte[] a = new byte[4];
-    byte[] b = new byte[4];
-    PUT_ULONG_BE(ka, a, 0);
-    b[0] = sm4Sbox(a[0]);
-    b[1] = sm4Sbox(a[1]);
-    b[2] = sm4Sbox(a[2]);
-    b[3] = sm4Sbox(a[3]);
-    bb = GET_ULONG_BE(b, 0);
-    c = bb ^ ROTL(bb, 2) ^ ROTL(bb, 10) ^ ROTL(bb, 18) ^ ROTL(bb, 24);
-    return c;
-  }
-
-  private long sm4F(long x0, long x1, long x2, long x3, long rk) {
-    return x0 ^ sm4Lt(x1 ^ x2 ^ x3 ^ rk);
-  }
-
-  private long sm4CalciRK(long ka) {
-    long bb = 0L;
-    long rk = 0L;
-    byte[] a = new byte[4];
-    byte[] b = new byte[4];
-    PUT_ULONG_BE(ka, a, 0);
-    b[0] = sm4Sbox(a[0]);
-    b[1] = sm4Sbox(a[1]);
-    b[2] = sm4Sbox(a[2]);
-    b[3] = sm4Sbox(a[3]);
-    bb = GET_ULONG_BE(b, 0);
-    rk = bb ^ ROTL(bb, 13) ^ ROTL(bb, 23);
-    return rk;
-  }
-
-  private void sm4_setkey(long[] SK, byte[] key) {
-    long[] MK = new long[4];
-    long[] k = new long[36];
-    int i = 0;
-    MK[0] = GET_ULONG_BE(key, 0);
-    MK[1] = GET_ULONG_BE(key, 4);
-    MK[2] = GET_ULONG_BE(key, 8);
-    MK[3] = GET_ULONG_BE(key, 12);
-    k[0] = MK[0] ^ (long) FK[0];
-    k[1] = MK[1] ^ (long) FK[1];
-    k[2] = MK[2] ^ (long) FK[2];
-    k[3] = MK[3] ^ (long) FK[3];
-    for (; i < 32; i++) {
-      k[(i + 4)] = (k[i] ^ sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ 
(long) CK[i]));
-      SK[i] = k[(i + 4)];
-    }
-  }
-
-  private void sm4_one_round(long[] sk, byte[] input, byte[] output) {
-    int i = 0;
-    long[] ulbuf = new long[36];
-    ulbuf[0] = GET_ULONG_BE(input, 0);
-    ulbuf[1] = GET_ULONG_BE(input, 4);
-    ulbuf[2] = GET_ULONG_BE(input, 8);
-    ulbuf[3] = GET_ULONG_BE(input, 12);
-    while (i < 32) {
-      ulbuf[(i + 4)] = sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i 
+ 3)], sk[i]);
-      i++;
-    }
-    PUT_ULONG_BE(ulbuf[35], output, 0);
-    PUT_ULONG_BE(ulbuf[34], output, 4);
-    PUT_ULONG_BE(ulbuf[33], output, 8);
-    PUT_ULONG_BE(ulbuf[32], output, 12);
-  }
-
-  private byte[] padding(byte[] input, int mode) {
-    if (input == null) {
-      return null;
-    }
-
-    byte[] ret = (byte[]) null;
-    if (mode == SM4_ENCRYPT) {
-      int p = 16 - input.length % 16;
-      ret = new byte[input.length + p];
-      System.arraycopy(input, 0, ret, 0, input.length);
-      for (int i = 0; i < p; i++) {
-        ret[input.length + i] = (byte) p;
-      }
-    } else {
-      int p = input[input.length - 1];
-      ret = new byte[input.length - p];
-      System.arraycopy(input, 0, ret, 0, input.length - p);
-    }
-    return ret;
-  }
-
-  public void sm4_setkey_enc(SM4_Context ctx, byte[] key) {
-    if (ctx == null) {
-      throw new EncryptException("sm4 ctx is null!");
-    }
-
-    if (key == null) {
-      throw new EncryptException("sm4 key null error!");
-    }
-    if (key.length != 16) {
-      throw new EncryptKeyLengthNotMatchException(key.length, 16);
-    }
-
-    ctx.mode = SM4_ENCRYPT;
-    sm4_setkey(ctx.sk, key);
-  }
-
-  public void sm4_setkey_dec(SM4_Context ctx, byte[] key) {
-    if (ctx == null) {
-      throw new EncryptException("sm4 ctx is null!");
-    }
-
-    if (key == null) {
-      throw new EncryptException("sm4 key null error!");
-    }
-    if (key.length != 16) {
-      throw new EncryptKeyLengthNotMatchException(key.length, 16);
-    }
-
-    int i = 0;
-    ctx.mode = SM4_DECRYPT;
-    sm4_setkey(ctx.sk, key);
-    for (i = 0; i < 16; i++) {
-      SWAP(ctx.sk, i);
-    }
-  }
-
-  public byte[] sm4_crypt_ecb(SM4_Context ctx, byte[] input) {
-    try {
-      if (input == null) {
-        throw new EncryptException("sm4 input is null!");
-      }
-      if ((ctx.isPadding) && (ctx.mode == SM4_ENCRYPT)) {
-        input = padding(input, SM4_ENCRYPT);
-      }
-
-      int length = input.length;
-      ByteArrayInputStream bins = new ByteArrayInputStream(input);
-      ByteArrayOutputStream bous = new ByteArrayOutputStream();
-      for (; length > 0; length -= 16) {
-        byte[] in = new byte[16];
-        byte[] out = new byte[16];
-        bins.read(in);
-        sm4_one_round(ctx.sk, in, out);
-        bous.write(out);
-      }
-
-      byte[] output = bous.toByteArray();
-      if (ctx.isPadding && ctx.mode == SM4_DECRYPT) {
-        output = padding(output, SM4_DECRYPT);
-      }
-      bins.close();
-      bous.close();
-      return output;
-    } catch (IOException e) {
-      throw new EncryptException("sm4 crypt error");
-    }
-  }
-
-  public byte[] sm4_crypt_cbc(SM4_Context ctx, byte[] iv, byte[] input) throws 
Exception {
-    if (iv == null || iv.length != 16) {
-      throw new EncryptException("iv error!");
-    }
-
-    if (input == null) {
-      throw new EncryptException("input is null!");
-    }
-
-    if (ctx.isPadding && ctx.mode == SM4_ENCRYPT) {
-      input = padding(input, SM4_ENCRYPT);
-    }
-
-    int i = 0;
-    int length = input.length;
-    ByteArrayInputStream bins = new ByteArrayInputStream(input);
-    ByteArrayOutputStream bous = new ByteArrayOutputStream();
-    if (ctx.mode == SM4_ENCRYPT) {
-      for (; length > 0; length -= 16) {
-        byte[] in = new byte[16];
-        byte[] out = new byte[16];
-        byte[] out1 = new byte[16];
-
-        bins.read(in);
-        for (i = 0; i < 16; i++) {
-          out[i] = ((byte) (in[i] ^ iv[i]));
-        }
-        sm4_one_round(ctx.sk, out, out1);
-        System.arraycopy(out1, 0, iv, 0, 16);
-        bous.write(out1);
-      }
-    } else {
-      byte[] temp = new byte[16];
-      for (; length > 0; length -= 16) {
-        byte[] in = new byte[16];
-        byte[] out = new byte[16];
-        byte[] out1 = new byte[16];
-
-        bins.read(in);
-        System.arraycopy(in, 0, temp, 0, 16);
-        sm4_one_round(ctx.sk, in, out);
-        for (i = 0; i < 16; i++) {
-          out1[i] = ((byte) (out[i] ^ iv[i]));
-        }
-        System.arraycopy(temp, 0, iv, 0, 16);
-        bous.write(out1);
-      }
-    }
-
-    byte[] output = bous.toByteArray();
-    if (ctx.isPadding && ctx.mode == SM4_DECRYPT) {
-      output = padding(output, SM4_DECRYPT);
-    }
-    bins.close();
-    bous.close();
-    return output;
-  }
-}
diff --git a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4Utils.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4Utils.java
deleted file mode 100644
index 8735275e..00000000
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4Utils.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.tsfile.encrypt;
-
-import java.util.Arrays;
-
-public class SM4Utils {
-  public byte[] getSecretKey() {
-    return secretKey;
-  }
-
-  public void setSecretKey(byte[] secretKey) {
-    this.secretKey = secretKey;
-  }
-
-  private byte[] secretKey;
-
-  public byte[] getIv() {
-    return iv;
-  }
-
-  public void setIv(String iv) {
-    this.iv = iv.getBytes();
-  }
-
-  private byte[] iv;
-
-  private SM4_Context ctx;
-
-  private SM4 sm4;
-
-  public SM4Utils(byte[] key, byte[] iv) {
-    this.secretKey = key;
-    this.iv = iv;
-    this.ctx = new SM4_Context();
-    sm4 = new SM4();
-    sm4.sm4_setkey_enc(ctx, secretKey);
-  }
-
-  public byte[] cryptData_CTR(byte[] data) {
-    byte[] keyBytes = secretKey;
-    byte[] pivBytes = iv;
-    byte[] result = new byte[data.length];
-    byte[] ivBytes = Arrays.copyOfRange(pivBytes, 0, 16);
-    int begin_iv = 0;
-    for (int i = 0; i < 4; i++) {
-      begin_iv = (begin_iv << 8) | (ivBytes[i] & 0xFF);
-    }
-    int group_num = data.length / 16;
-    for (int i = 0; i < group_num; i++) {
-      ivBytes[0] = (byte) ((begin_iv >>> 24) & 0xFF);
-      ivBytes[1] = (byte) ((begin_iv >>> 16) & 0xFF);
-      ivBytes[2] = (byte) ((begin_iv >>> 8) & 0xFF);
-      ivBytes[3] = (byte) (begin_iv & 0xFF);
-      byte[] encrypted = sm4.sm4_crypt_ecb(ctx, ivBytes);
-      for (int j = 0; j < 16; j++) {
-        result[16 * i + j] = (byte) (data[16 * i + j] ^ encrypted[j]);
-      }
-      begin_iv++;
-    }
-    if (data.length % 16 != 0) {
-      ivBytes[0] = (byte) ((begin_iv >>> 24) & 0xFF);
-      ivBytes[1] = (byte) ((begin_iv >>> 16) & 0xFF);
-      ivBytes[2] = (byte) ((begin_iv >>> 8) & 0xFF);
-      ivBytes[3] = (byte) (begin_iv & 0xFF);
-      byte[] encrypted = sm4.sm4_crypt_ecb(ctx, ivBytes);
-      for (int j = 0; j < data.length % 16; j++) {
-        result[16 * group_num + j] = (byte) (data[16 * group_num + j] ^ 
encrypted[j]);
-      }
-    }
-    return result;
-  }
-}
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/UNENCRYPTED.java
similarity index 66%
rename from java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
rename to java/tsfile/src/main/java/org/apache/tsfile/encrypt/UNENCRYPTED.java
index 53749ccb..e909b062 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/UNENCRYPTED.java
@@ -16,19 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.tsfile.encrypt;
 
-public class SM4_Context {
-  public int mode;
+public class UNENCRYPTED implements IEncrypt {
+  private byte[] key;
+
+  private final IEncryptor encryptor;
 
-  public long[] sk;
+  private final IDecryptor decryptor;
 
-  public boolean isPadding;
+  public UNENCRYPTED(byte[] key) {
+    this.key = key;
+    encryptor = new NoEncryptor(key);
+    decryptor = new NoDecryptor(key);
+  }
+
+  @Override
+  public IEncryptor getEncryptor() {
+    return encryptor;
+  }
 
-  public SM4_Context() {
-    this.mode = 1;
-    this.isPadding = false;
-    this.sk = new long[32];
+  @Override
+  public IDecryptor getDecryptor() {
+    return decryptor;
   }
 }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
index bcf5d134..e57c9cff 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
@@ -117,10 +117,10 @@ public class TsFileMetadata {
       // if the file is not encrypted, set the default value(for compatible 
reason)
       if (!propertiesMap.containsKey("encryptLevel") || 
propertiesMap.get("encryptLevel") == null) {
         propertiesMap.put("encryptLevel", "0");
-        propertiesMap.put("encryptType", "UNENCRYPTED");
+        propertiesMap.put("encryptType", 
"org.apache.tsfile.encrypt.UNENCRYPTED");
         propertiesMap.put("encryptKey", "");
       } else if (propertiesMap.get("encryptLevel").equals("0")) {
-        propertiesMap.put("encryptType", "UNENCRYPTED");
+        propertiesMap.put("encryptType", 
"org.apache.tsfile.encrypt.UNENCRYPTED");
         propertiesMap.put("encryptKey", "");
       } else if (propertiesMap.get("encryptLevel").equals("1")) {
         if (!propertiesMap.containsKey("encryptType")) {
@@ -133,7 +133,7 @@ public class TsFileMetadata {
           throw new EncryptException("TsfileMetadata null encryptKey while 
encryptLevel is 1");
         }
         String str = propertiesMap.get("encryptKey");
-        fileMetaData.dataEncryptKey = EncryptUtils.getKeyFromStr(str);
+        fileMetaData.dataEncryptKey = EncryptUtils.getSecondKeyFromStr(str);
         fileMetaData.encryptType = propertiesMap.get("encryptType");
       } else if (propertiesMap.get("encryptLevel").equals("2")) {
         if (!propertiesMap.containsKey("encryptType")) {
@@ -150,7 +150,7 @@ public class TsFileMetadata {
                 TSFileDescriptor.getInstance().getConfig().getEncryptType(),
                 
TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes());
         String str = propertiesMap.get("encryptKey");
-        fileMetaData.dataEncryptKey = 
decryptor.decrypt(EncryptUtils.getKeyFromStr(str));
+        fileMetaData.dataEncryptKey = 
decryptor.decrypt(EncryptUtils.getSecondKeyFromStr(str));
         fileMetaData.encryptType = propertiesMap.get("encryptType");
       } else {
         throw new EncryptException(
@@ -164,14 +164,14 @@ public class TsFileMetadata {
 
   public IEncryptor getIEncryptor() {
     if (dataEncryptKey == null) {
-      return IEncryptor.getEncryptor("UNENCRYPTED", null);
+      return IEncryptor.getEncryptor("org.apache.tsfile.encrypt.UNENCRYPTED", 
null);
     }
     return IEncryptor.getEncryptor(encryptType, dataEncryptKey);
   }
 
   public IDecryptor getIDecryptor() {
     if (dataEncryptKey == null) {
-      return IDecryptor.getDecryptor("UNENCRYPTED", null);
+      return IDecryptor.getDecryptor("org.apache.tsfile.encrypt.UNENCRYPTED", 
null);
     }
     return IDecryptor.getDecryptor(encryptType, dataEncryptKey);
   }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/enums/EncryptionType.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/enums/EncryptionType.java
index 0e1625dc..f28d4812 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/enums/EncryptionType.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/enums/EncryptionType.java
@@ -73,7 +73,7 @@ public enum EncryptionType {
   /**
    * get extension.
    *
-   * @return extension (string type), for example: SM4128、AES128
+   * @return extension (string type), for example: UNENCRYPTED、AES128
    */
   public String getExtension() {
     return extensionName;
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java 
b/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
index 5af148f0..e341363b 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
@@ -381,7 +381,7 @@ public class TsFileSequenceReader implements AutoCloseable {
       readFileMetadata();
     } catch (Exception e) {
       logger.error("Something error happened while reading file metadata of 
file {}", file, e);
-      return EncryptUtils.decryptor;
+      return EncryptUtils.encrypt.getDecryptor();
     }
     return tsFileMetaData.getIDecryptor();
   }
@@ -1732,12 +1732,23 @@ public class TsFileSequenceReader implements 
AutoCloseable {
     }
     IUnCompressor unCompressor = 
IUnCompressor.getUnCompressor(compressionType);
     ByteBuffer uncompressedBuffer = ByteBuffer.allocate(uncompressedSize);
-    unCompressor.uncompress(
-        buffer.array(),
-        buffer.arrayOffset() + buffer.position(),
-        buffer.remaining(),
-        uncompressedBuffer.array(),
-        0);
+    try {
+      unCompressor.uncompress(
+          buffer.array(),
+          buffer.arrayOffset() + buffer.position(),
+          buffer.remaining(),
+          uncompressedBuffer.array(),
+          0);
+    } catch (Exception e) {
+      throw new IOException(
+          "Uncompress error! uncompress size: "
+              + uncompressedSize
+              + "compressed size: "
+              + buffer.remaining()
+              + e.getMessage(),
+          e);
+    }
+
     return uncompressedBuffer;
   }
 
diff --git a/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java 
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
index 18709abc..e338ae06 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
@@ -60,7 +60,7 @@ public class Chunk {
     this.chunkData = buffer;
     this.deleteIntervalList = deleteIntervalList;
     this.chunkStatistic = chunkStatistic;
-    this.decryptor = EncryptUtils.decryptor;
+    this.decryptor = EncryptUtils.encrypt.getDecryptor();
   }
 
   public Chunk(
@@ -79,7 +79,7 @@ public class Chunk {
   public Chunk(ChunkHeader header, ByteBuffer buffer) {
     this.chunkHeader = header;
     this.chunkData = buffer;
-    this.decryptor = EncryptUtils.decryptor;
+    this.decryptor = EncryptUtils.encrypt.getDecryptor();
   }
 
   public Chunk(ChunkHeader header, ByteBuffer buffer, IDecryptor decryptor) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
index 87d3c585..0a76e2d9 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
@@ -187,7 +187,8 @@ public class ChunkReader extends AbstractChunkReader {
               + pageHeader.getCompressedSize()
               + "page header: "
               + pageHeader
-              + e.getMessage());
+              + e.getMessage(),
+          e);
     }
     compressedPageData.position(compressedPageData.position() + 
compressedPageBodyLength);
     return ByteBuffer.wrap(uncompressedPageData);
@@ -217,7 +218,8 @@ public class ChunkReader extends AbstractChunkReader {
               + pageHeader.getCompressedSize()
               + "page header: "
               + pageHeader
-              + e.getMessage());
+              + e.getMessage(),
+          e);
     }
     compressedPageData.position(compressedPageData.position() + 
compressedPageBodyLength);
     return ByteBuffer.wrap(uncompressedPageData);
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
index 481e8812..301d4f0d 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
@@ -41,7 +41,7 @@ public class LazyLoadPageData {
     this.chunkData = data;
     this.pageDataOffset = offset;
     this.unCompressor = unCompressor;
-    this.decryptor = EncryptUtils.decryptor;
+    this.decryptor = EncryptUtils.encrypt.getDecryptor();
   }
 
   public LazyLoadPageData(
@@ -55,9 +55,9 @@ public class LazyLoadPageData {
   public ByteBuffer uncompressPageData(PageHeader pageHeader) throws 
IOException {
     int compressedPageBodyLength = pageHeader.getCompressedSize();
     byte[] uncompressedPageData = new byte[pageHeader.getUncompressedSize()];
+    byte[] decryptedPageData =
+        decryptor.decrypt(chunkData, pageDataOffset, compressedPageBodyLength);
     try {
-      byte[] decryptedPageData =
-          decryptor.decrypt(chunkData, pageDataOffset, 
compressedPageBodyLength);
       unCompressor.uncompress(
           decryptedPageData, 0, compressedPageBodyLength, 
uncompressedPageData, 0);
     } catch (Exception e) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
index 1733b005..532b01b9 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
@@ -29,7 +29,6 @@ import org.apache.tsfile.exception.write.NoTableException;
 import org.apache.tsfile.exception.write.WriteProcessException;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.TableSchema;
-import org.apache.tsfile.file.metadata.enums.EncryptionType;
 import org.apache.tsfile.read.common.Path;
 import org.apache.tsfile.utils.MeasurementGroup;
 import org.apache.tsfile.utils.Pair;
@@ -185,7 +184,7 @@ public class TsFileWriter implements AutoCloseable {
     String encryptLevel;
     byte[] encryptKey;
     byte[] dataEncryptKey;
-    EncryptionType encryptType;
+    String encryptType;
     if (config.getEncryptFlag()) {
       encryptLevel = "2";
       encryptType = config.getEncryptType();
@@ -202,7 +201,7 @@ public class TsFileWriter implements AutoCloseable {
       }
     } else {
       encryptLevel = "0";
-      encryptType = EncryptionType.UNENCRYPTED;
+      encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
       encryptKey = null;
       dataEncryptKey = null;
     }
@@ -217,9 +216,9 @@ public class TsFileWriter implements AutoCloseable {
       valueStr.deleteCharAt(valueStr.length() - 1);
       String str = valueStr.toString();
 
-      fileWriter.setEncryptParam(encryptLevel, encryptType.getExtension(), 
str);
+      fileWriter.setEncryptParam(encryptLevel, encryptType, str);
     } else {
-      fileWriter.setEncryptParam(encryptLevel, encryptType.getExtension(), "");
+      fileWriter.setEncryptParam(encryptLevel, encryptType, "");
     }
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
index 5ffba51b..0c3bb701 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
@@ -72,7 +72,7 @@ public class AlignedChunkGroupWriterImpl implements 
IChunkGroupWriter {
         
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder());
     TSDataType timeType = 
TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType();
     Encoder encoder = 
TSEncodingBuilder.getEncodingBuilder(tsEncoding).getEncoder(timeType);
-    this.encryptor = EncryptUtils.encryptor;
+    this.encryptor = EncryptUtils.encrypt.getEncryptor();
     timeChunkWriter = new TimeChunkWriter(timeMeasurementId, compressionType, 
tsEncoding, encoder);
   }
 
@@ -86,7 +86,8 @@ public class AlignedChunkGroupWriterImpl implements 
IChunkGroupWriter {
     Encoder encoder = 
TSEncodingBuilder.getEncodingBuilder(tsEncoding).getEncoder(timeType);
     this.encryptor = encryptor;
     timeChunkWriter =
-        new TimeChunkWriter(timeMeasurementId, compressionType, tsEncoding, 
encoder, encryptor);
+        new TimeChunkWriter(
+            timeMeasurementId, compressionType, tsEncoding, encoder, 
this.encryptor);
   }
 
   @Override
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
index 87fe088a..96385f33 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
@@ -57,7 +57,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter {
 
   // TestOnly
   public AlignedChunkWriterImpl(VectorMeasurementSchema schema) {
-    this.encryptor = EncryptUtils.encryptor;
+    this.encryptor = EncryptUtils.encrypt.getEncryptor();
     timeChunkWriter =
         new TimeChunkWriter(
             schema.getMeasurementId(),
@@ -127,7 +127,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
    */
   public AlignedChunkWriterImpl(
       IMeasurementSchema timeSchema, List<IMeasurementSchema> valueSchemaList) 
{
-    this.encryptor = EncryptUtils.encryptor;
+    this.encryptor = EncryptUtils.encrypt.getEncryptor();
     timeChunkWriter =
         new TimeChunkWriter(
             timeSchema.getMeasurementId(),
@@ -189,7 +189,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
    * @param schemaList value schema list
    */
   public AlignedChunkWriterImpl(List<IMeasurementSchema> schemaList) {
-    this.encryptor = EncryptUtils.encryptor;
+    this.encryptor = EncryptUtils.encrypt.getEncryptor();
     TSEncoding timeEncoding =
         
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder());
     TSDataType timeType = 
TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType();
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java
index e04c7f54..09fa15f2 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java
@@ -103,7 +103,7 @@ public class ChunkWriterImpl implements IChunkWriter {
   public ChunkWriterImpl(IMeasurementSchema schema) {
     this.measurementSchema = schema;
     this.compressor = ICompressor.getCompressor(schema.getCompressor());
-    this.encryptor = EncryptUtils.encryptor;
+    this.encryptor = EncryptUtils.encrypt.getEncryptor();
     this.pageBuffer = new PublicBAOS();
 
     this.pageSizeThreshold = 
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
index 7bbacfe8..c719dd83 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
@@ -60,7 +60,7 @@ public class NonAlignedChunkGroupWriterImpl implements 
IChunkGroupWriter {
 
   public NonAlignedChunkGroupWriterImpl(IDeviceID deviceId) {
     this.deviceId = deviceId;
-    this.encryptor = EncryptUtils.encryptor;
+    this.encryptor = EncryptUtils.encrypt.getEncryptor();
   }
 
   public NonAlignedChunkGroupWriterImpl(IDeviceID deviceId, IEncryptor 
encryptor) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java
index 4f04efb3..32e6fbe1 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java
@@ -94,7 +94,7 @@ public class TimeChunkWriter {
     this.measurementId = measurementId;
     this.encodingType = encodingType;
     this.compressionType = compressionType;
-    this.encryptor = EncryptUtils.encryptor;
+    this.encryptor = EncryptUtils.encrypt.getEncryptor();
     this.pageBuffer = new PublicBAOS();
 
     this.pageSizeThreshold = 
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java
index 9ea908b2..87f5b635 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java
@@ -97,7 +97,7 @@ public class ValueChunkWriter {
     this.encodingType = encodingType;
     this.dataType = dataType;
     this.compressionType = compressionType;
-    this.encryptor = EncryptUtils.encryptor;
+    this.encryptor = EncryptUtils.encrypt.getEncryptor();
     this.pageBuffer = new PublicBAOS();
     this.pageSizeThreshold = 
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
     this.maxNumberOfPointsInPage =
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java
index c89d019f..75ebbd66 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java
@@ -80,7 +80,7 @@ public class PageWriter {
     this.valueOut = new PublicBAOS();
     this.timeEncoder = timeEncoder;
     this.valueEncoder = valueEncoder;
-    this.encryptor = EncryptUtils.encryptor;
+    this.encryptor = EncryptUtils.encrypt.getEncryptor();
   }
 
   public PageWriter(IEncryptor encryptor) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java
index 5faea9d9..3b45b403 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java
@@ -63,7 +63,7 @@ public class TimePageWriter {
     this.timeEncoder = timeEncoder;
     this.statistics = new TimeStatistics();
     this.compressor = compressor;
-    this.encryptor = EncryptUtils.encryptor;
+    this.encryptor = EncryptUtils.encrypt.getEncryptor();
   }
 
   public TimePageWriter(Encoder timeEncoder, ICompressor compressor, 
IEncryptor encryptor) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java
index 1daed419..629ed51b 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java
@@ -76,7 +76,7 @@ public class ValuePageWriter {
     this.valueEncoder = valueEncoder;
     this.statistics = Statistics.getStatsByType(dataType);
     this.compressor = compressor;
-    this.encryptor = EncryptUtils.encryptor;
+    this.encryptor = EncryptUtils.encrypt.getEncryptor();
   }
 
   public ValuePageWriter(
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
index 0de54052..672fbb8e 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
@@ -125,14 +125,24 @@ public class TsFileIOWriter implements AutoCloseable {
 
   private boolean generateTableSchema = false;
 
-  protected String encryptLevel = "0";
+  protected String encryptLevel;
 
-  protected String encryptType = "UNENCRYPTED";
+  protected String encryptType;
 
-  protected String encryptKey = null;
+  protected String encryptKey;
 
   /** empty construct function. */
-  protected TsFileIOWriter() {}
+  protected TsFileIOWriter() {
+    if (TS_FILE_CONFIG.getEncryptFlag()) {
+      this.encryptLevel = "2";
+      this.encryptType = TS_FILE_CONFIG.getEncryptType();
+      this.encryptKey = EncryptUtils.normalKeyStr;
+    } else {
+      this.encryptLevel = "0";
+      this.encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
+      this.encryptKey = null;
+    }
+  }
 
   /**
    * for writing a new tsfile.
@@ -153,11 +163,11 @@ public class TsFileIOWriter implements AutoCloseable {
     }
     if (conf.getEncryptFlag()) {
       this.encryptLevel = "2";
-      this.encryptType = conf.getEncryptType().getExtension();
+      this.encryptType = conf.getEncryptType();
       this.encryptKey = EncryptUtils.normalKeyStr;
     } else {
       this.encryptLevel = "0";
-      this.encryptType = "UNENCRYPTED";
+      this.encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
       this.encryptKey = null;
     }
     startFile();
@@ -172,11 +182,11 @@ public class TsFileIOWriter implements AutoCloseable {
     this.out = output;
     if (TS_FILE_CONFIG.getEncryptFlag()) {
       this.encryptLevel = "2";
-      this.encryptType = TS_FILE_CONFIG.getEncryptType().getExtension();
+      this.encryptType = TS_FILE_CONFIG.getEncryptType();
       this.encryptKey = EncryptUtils.normalKeyStr;
     } else {
       this.encryptLevel = "0";
-      this.encryptType = "UNENCRYPTED";
+      this.encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
       this.encryptKey = null;
     }
     startFile();
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128Test.java 
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128Test.java
index c0d91571..21d8d804 100644
--- a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128Test.java
+++ b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128Test.java
@@ -49,11 +49,11 @@ public class AES128Test {
     String input = randomString(2000000);
     byte[] unencrypted = input.getBytes(StandardCharsets.UTF_8);
     long time = System.currentTimeMillis();
-    IEncryptor encryptor = new 
IEncryptor.AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
+    IEncryptor encryptor = new 
AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
     byte[] encrypted = encryptor.encrypt(unencrypted);
     System.out.println("encryption time cost:" + (System.currentTimeMillis() - 
time));
     time = System.currentTimeMillis();
-    IDecryptor decryptor = new 
IDecryptor.AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+    IDecryptor decryptor = new 
AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
     byte[] decrypted = decryptor.decrypt(encrypted);
     System.out.println("decryption time cost:" + (System.currentTimeMillis() - 
time));
     Assert.assertArrayEquals(unencrypted, decrypted);
@@ -64,13 +64,26 @@ public class AES128Test {
     String input = randomString(500000);
     byte[] unencrypted = input.getBytes(StandardCharsets.UTF_8);
     long time = System.currentTimeMillis();
-    IEncryptor encryptor = new 
IEncryptor.AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
+    IEncryptor encryptor = new 
AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
     byte[] encrypted = encryptor.encrypt(unencrypted, 0, unencrypted.length);
     System.out.println("encryption time cost:" + (System.currentTimeMillis() - 
time));
     time = System.currentTimeMillis();
-    IDecryptor decryptor = new 
IDecryptor.AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+    IDecryptor decryptor = new 
AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
     byte[] decrypted = decryptor.decrypt(encrypted, 0, encrypted.length);
     System.out.println("decryption time cost:" + (System.currentTimeMillis() - 
time));
     Assert.assertArrayEquals(unencrypted, decrypted);
   }
+
+  @Test
+  public void testBytes3() throws IOException {
+    byte[] unencrypted = new byte[71];
+    long time = System.currentTimeMillis();
+    IEncryptor encryptor = new 
AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
+    byte[] encrypted = encryptor.encrypt(unencrypted, 0, 35);
+    System.out.println("encryption time cost:" + (System.currentTimeMillis() - 
time));
+    time = System.currentTimeMillis();
+    IDecryptor decryptor = new 
AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+    byte[] decrypted = decryptor.decrypt(encrypted);
+    System.out.println("decryption time cost:" + (System.currentTimeMillis() - 
time));
+  }
 }
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
index bc1d1220..116cfd4f 100644
--- 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
+++ 
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
@@ -66,7 +66,7 @@ public class AES128TsFileReadWriteTest {
   @Before
   public void setUp() {
     conf.setEncryptFlag("true");
-    conf.setEncryptType("AES128");
+    conf.setEncryptType("org.apache.tsfile.encrypt.AES128");
     conf.setEncryptKey("thisisourtestkey");
     f = new File(path);
     if (f.exists()) {
@@ -80,7 +80,7 @@ public class AES128TsFileReadWriteTest {
   @After
   public void tearDown() {
     conf.setEncryptKey("abcdefghijklmnop");
-    conf.setEncryptType("UNENCRYPTED");
+    conf.setEncryptType("org.apache.tsfile.encrypt.UNENCRYPTED");
     conf.setEncryptFlag("false");
     f = new File(path);
     if (f.exists()) {
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileWriteTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileWriteTest.java
index 640f355b..181f8767 100644
--- 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileWriteTest.java
+++ 
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileWriteTest.java
@@ -86,7 +86,7 @@ public class AES128TsFileWriteTest {
     prePageCheckThres = conf.getPageCheckSizeThreshold();
     conf.setPageCheckSizeThreshold(0);
     conf.setEncryptFlag("true");
-    conf.setEncryptType("AES128");
+    conf.setEncryptType("org.apache.tsfile.encrypt.AES128");
     conf.setEncryptKey("thisisourtestkey");
 
     try {
@@ -139,7 +139,7 @@ public class AES128TsFileWriteTest {
     conf.setPageSizeInByte(prePageSize);
     conf.setPageCheckSizeThreshold(prePageCheckThres);
     conf.setEncryptKey("abcdefghijklmnop");
-    conf.setEncryptType("UNENCRYPTED");
+    conf.setEncryptType("org.apache.tsfile.encrypt.UNENCRYPTED");
     conf.setEncryptFlag("false");
     File file = new File(inputDataFile);
     if (file.exists()) {
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/EncryptTest.java 
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/EncryptTest.java
index 95448726..dd2a6845 100644
--- a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/EncryptTest.java
+++ b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/EncryptTest.java
@@ -43,8 +43,8 @@ public class EncryptTest {
 
   @Test
   public void NoEncryptorTest() throws IOException {
-    IEncryptor encryptor = new IEncryptor.NoEncryptor();
-    IDecryptor decryptor = new IDecryptor.NoDecryptor();
+    IEncryptor encryptor = new 
NoEncryptor(key.getBytes(StandardCharsets.UTF_8));
+    IDecryptor decryptor = new 
NoDecryptor(key.getBytes(StandardCharsets.UTF_8));
     byte[] encrypted = 
encryptor.encrypt(inputString.getBytes(StandardCharsets.UTF_8));
     byte[] decrypted = decryptor.decrypt(encrypted);
 
@@ -53,9 +53,9 @@ public class EncryptTest {
   }
 
   @Test
-  public void SM4128Test() throws IOException {
-    IEncryptor encryptor = new 
IEncryptor.SM4128Encryptor(key.getBytes(StandardCharsets.UTF_8));
-    IDecryptor decryptor = new 
IDecryptor.SM4128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+  public void AES128Test() throws IOException {
+    IEncryptor encryptor = new 
AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
+    IDecryptor decryptor = new 
AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
     byte[] encrypted = 
encryptor.encrypt(inputString.getBytes(StandardCharsets.UTF_8));
     byte[] decrypted = decryptor.decrypt(encrypted);
 
@@ -64,11 +64,11 @@ public class EncryptTest {
   }
 
   @Test
-  public void SM4128Test1() throws IOException {
+  public void AES128Test1() throws IOException {
     PublicBAOS out = new PublicBAOS();
     out.write(inputString.getBytes(StandardCharsets.UTF_8));
-    IEncryptor encryptor = new 
IEncryptor.SM4128Encryptor(key.getBytes(StandardCharsets.UTF_8));
-    IDecryptor decryptor = new 
IDecryptor.SM4128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+    IEncryptor encryptor = new 
AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
+    IDecryptor decryptor = new 
AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
     byte[] encrypted = encryptor.encrypt(out.getBuf(), 0, out.size());
     byte[] decrypted = decryptor.decrypt(encrypted);
 
@@ -77,9 +77,13 @@ public class EncryptTest {
   }
 
   @Test
-  public void AES128Test() throws IOException {
-    IEncryptor encryptor = new 
IEncryptor.AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
-    IDecryptor decryptor = new 
IDecryptor.AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+  public void AES128Test3() throws IOException {
+    IEncryptor encryptor =
+        IEncryptor.getEncryptor(
+            "org.apache.tsfile.encrypt.AES128", 
key.getBytes(StandardCharsets.UTF_8));
+    IDecryptor decryptor =
+        IDecryptor.getDecryptor(
+            "org.apache.tsfile.encrypt.AES128", 
key.getBytes(StandardCharsets.UTF_8));
     byte[] encrypted = 
encryptor.encrypt(inputString.getBytes(StandardCharsets.UTF_8));
     byte[] decrypted = decryptor.decrypt(encrypted);
 
@@ -87,35 +91,28 @@ public class EncryptTest {
     assertEquals(inputString, result);
   }
 
-  @Test
-  public void AES128Test1() throws IOException {
-    PublicBAOS out = new PublicBAOS();
-    out.write(inputString.getBytes(StandardCharsets.UTF_8));
-    IEncryptor encryptor = new 
IEncryptor.AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
-    IDecryptor decryptor = new 
IDecryptor.AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
-    byte[] encrypted = encryptor.encrypt(out.getBuf(), 0, out.size());
-    byte[] decrypted = decryptor.decrypt(encrypted);
-
-    String result = new String(decrypted, StandardCharsets.UTF_8);
-    assertEquals(inputString, result);
-  }
-
   @Test
   public void GetEncryptorTest() {
-    IEncryptor encryptor = IEncryptor.getEncryptor("AES128", 
key.getBytes(StandardCharsets.UTF_8));
+    IEncryptor encryptor =
+        IEncryptor.getEncryptor(
+            "org.apache.tsfile.encrypt.AES128", 
key.getBytes(StandardCharsets.UTF_8));
     assertEquals(encryptor.getEncryptionType(), EncryptionType.AES128);
     IEncryptor encryptor2 =
-        IEncryptor.getEncryptor(EncryptionType.AES128, 
key.getBytes(StandardCharsets.UTF_8));
-    assertEquals(encryptor2.getEncryptionType(), EncryptionType.AES128);
+        IEncryptor.getEncryptor(
+            "org.apache.tsfile.encrypt.UNENCRYPTED", 
key.getBytes(StandardCharsets.UTF_8));
+    assertEquals(encryptor2.getEncryptionType(), EncryptionType.UNENCRYPTED);
   }
 
   @Test
-  public void GetEncryptorTest2() {
-    IEncryptor encryptor = IEncryptor.getEncryptor("SM4128", 
key.getBytes(StandardCharsets.UTF_8));
-    assertEquals(encryptor.getEncryptionType(), EncryptionType.SM4128);
+  public void GetDecryptorTest() {
+    IEncryptor encryptor =
+        IEncryptor.getEncryptor(
+            "org.apache.tsfile.encrypt.AES128", 
key.getBytes(StandardCharsets.UTF_8));
+    assertEquals(encryptor.getEncryptionType(), EncryptionType.AES128);
     IEncryptor encryptor2 =
-        IEncryptor.getEncryptor(EncryptionType.SM4128, 
key.getBytes(StandardCharsets.UTF_8));
-    assertEquals(encryptor2.getEncryptionType(), EncryptionType.SM4128);
+        IEncryptor.getEncryptor(
+            "org.apache.tsfile.encrypt.UNENCRYPTED", 
key.getBytes(StandardCharsets.UTF_8));
+    assertEquals(encryptor2.getEncryptionType(), EncryptionType.UNENCRYPTED);
   }
 
   @Test
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128Test.java 
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128Test.java
deleted file mode 100644
index af1ddbcb..00000000
--- a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128Test.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.tsfile.encrypt;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.concurrent.ThreadLocalRandom;
-
-public class SM4128Test {
-  private final String key = "mkmkmkmkmkmkmkmk";
-
-  private String randomString(int length) {
-    StringBuilder builder = new StringBuilder(length);
-    for (int i = 0; i < length; i++) {
-      builder.append((char) (ThreadLocalRandom.current().nextInt(33, 128)));
-    }
-    return builder.toString();
-  }
-
-  @Before
-  public void setUp() {}
-
-  @After
-  public void tearDown() {}
-
-  @Test
-  public void testBytes1() throws IOException {
-    String input = randomString(2000000);
-    byte[] unencrypted = input.getBytes(StandardCharsets.UTF_8);
-    long time = System.currentTimeMillis();
-    IEncryptor encryptor = new 
IEncryptor.SM4128Encryptor(key.getBytes(StandardCharsets.UTF_8));
-    byte[] encrypted = encryptor.encrypt(unencrypted);
-    System.out.println("encryption time cost:" + (System.currentTimeMillis() - 
time));
-    time = System.currentTimeMillis();
-    IDecryptor decryptor = new 
IDecryptor.SM4128Decryptor(key.getBytes(StandardCharsets.UTF_8));
-    byte[] decrypted = decryptor.decrypt(encrypted);
-    System.out.println("decryption time cost:" + (System.currentTimeMillis() - 
time));
-    Assert.assertArrayEquals(unencrypted, decrypted);
-  }
-
-  @Test
-  public void testBytes2() throws IOException {
-    String input = randomString(500000);
-    byte[] unencrypted = input.getBytes(StandardCharsets.UTF_8);
-    long time = System.currentTimeMillis();
-    IEncryptor encryptor = new 
IEncryptor.SM4128Encryptor(key.getBytes(StandardCharsets.UTF_8));
-    byte[] encrypted = encryptor.encrypt(unencrypted, 0, unencrypted.length);
-    System.out.println("encryption time cost:" + (System.currentTimeMillis() - 
time));
-    time = System.currentTimeMillis();
-    IDecryptor decryptor = new 
IDecryptor.SM4128Decryptor(key.getBytes(StandardCharsets.UTF_8));
-    byte[] decrypted = decryptor.decrypt(encrypted, 0, encrypted.length);
-    System.out.println("decryption time cost:" + (System.currentTimeMillis() - 
time));
-    Assert.assertArrayEquals(unencrypted, decrypted);
-  }
-}
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileReadWriteTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileReadWriteTest.java
deleted file mode 100644
index f2570707..00000000
--- 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileReadWriteTest.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * 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.tsfile.encrypt;
-
-import org.apache.tsfile.common.conf.TSFileConfig;
-import org.apache.tsfile.common.conf.TSFileDescriptor;
-import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.exception.write.WriteProcessException;
-import org.apache.tsfile.file.metadata.IDeviceID;
-import org.apache.tsfile.file.metadata.enums.TSEncoding;
-import org.apache.tsfile.read.TsFileReader;
-import org.apache.tsfile.read.TsFileSequenceReader;
-import org.apache.tsfile.read.common.Field;
-import org.apache.tsfile.read.common.Path;
-import org.apache.tsfile.read.common.RowRecord;
-import org.apache.tsfile.read.expression.QueryExpression;
-import org.apache.tsfile.read.query.dataset.QueryDataSet;
-import org.apache.tsfile.utils.TsFileGeneratorForTest;
-import org.apache.tsfile.write.TsFileWriter;
-import org.apache.tsfile.write.record.TSRecord;
-import org.apache.tsfile.write.record.datapoint.DataPoint;
-import org.apache.tsfile.write.record.datapoint.DoubleDataPoint;
-import org.apache.tsfile.write.record.datapoint.FloatDataPoint;
-import org.apache.tsfile.write.record.datapoint.IntDataPoint;
-import org.apache.tsfile.write.record.datapoint.LongDataPoint;
-import org.apache.tsfile.write.schema.MeasurementSchema;
-import org.apache.tsfile.write.schema.Schema;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class SM4128TsFileReadWriteTest {
-  private final double delta = 0.0000001;
-  private final String path = 
TsFileGeneratorForTest.getTestTsFilePath("root.sg1", 0, 0, 1);
-  private File f;
-  private final IDeviceID deviceID = 
IDeviceID.Factory.DEFAULT_FACTORY.create("device_1");
-
-  private TSFileConfig conf = TSFileDescriptor.getInstance().getConfig();
-
-  @Before
-  public void setUp() {
-    conf.setEncryptFlag("true");
-    conf.setEncryptType("SM4128");
-    conf.setEncryptKey("thisisourtestkey");
-    f = new File(path);
-    if (f.exists()) {
-      assertTrue(f.delete());
-    }
-    if (!f.getParentFile().exists()) {
-      assertTrue(f.getParentFile().mkdirs());
-    }
-  }
-
-  @After
-  public void tearDown() {
-    conf.setEncryptKey("abcdefghijklmnop");
-    conf.setEncryptType("UNENCRYPTED");
-    conf.setEncryptFlag("false");
-    f = new File(path);
-    if (f.exists()) {
-      assertTrue(f.delete());
-    }
-  }
-
-  @Test
-  public void intTest() throws IOException, WriteProcessException {
-    List<TSEncoding> encodings =
-        Arrays.asList(
-            TSEncoding.PLAIN,
-            TSEncoding.RLE,
-            TSEncoding.TS_2DIFF,
-            TSEncoding.REGULAR,
-            TSEncoding.GORILLA,
-            TSEncoding.ZIGZAG);
-    for (TSEncoding encoding : encodings) {
-      intTest(encoding);
-    }
-  }
-
-  private void intTest(TSEncoding encoding) throws IOException, 
WriteProcessException {
-    writeDataByTSRecord(TSDataType.INT32, (i) -> new IntDataPoint("sensor_1", 
(int) i), encoding);
-    readData((i, field, delta) -> assertEquals(i, field.getIntV()));
-  }
-
-  @Test
-  public void longTest() throws IOException, WriteProcessException {
-    List<TSEncoding> encodings =
-        Arrays.asList(
-            TSEncoding.PLAIN,
-            TSEncoding.RLE,
-            TSEncoding.TS_2DIFF,
-            TSEncoding.REGULAR,
-            TSEncoding.GORILLA);
-    for (TSEncoding encoding : encodings) {
-      longTest(encoding);
-    }
-  }
-
-  public void longTest(TSEncoding encoding) throws IOException, 
WriteProcessException {
-    writeDataByTSRecord(TSDataType.INT64, (i) -> new LongDataPoint("sensor_1", 
i), encoding);
-    readData((i, field, delta) -> assertEquals(i, field.getLongV()));
-  }
-
-  @Test
-  public void floatTest() throws IOException, WriteProcessException {
-    List<TSEncoding> encodings =
-        Arrays.asList(
-            TSEncoding.PLAIN,
-            TSEncoding.RLE,
-            TSEncoding.TS_2DIFF,
-            TSEncoding.GORILLA_V1,
-            TSEncoding.GORILLA);
-    for (TSEncoding encoding : encodings) {
-      floatTest(encoding);
-    }
-  }
-
-  public void floatTest(TSEncoding encoding) throws IOException, 
WriteProcessException {
-    writeDataByTSRecord(
-        TSDataType.FLOAT, (i) -> new FloatDataPoint("sensor_1", (float) i), 
encoding);
-    readData((i, field, delta) -> assertEquals(i, field.getFloatV(), delta));
-  }
-
-  @Test
-  public void doubleTest() throws IOException, WriteProcessException {
-    List<TSEncoding> encodings =
-        Arrays.asList(
-            TSEncoding.PLAIN,
-            TSEncoding.RLE,
-            TSEncoding.TS_2DIFF,
-            TSEncoding.GORILLA_V1,
-            TSEncoding.GORILLA);
-    for (TSEncoding encoding : encodings) {
-      doubleTest(encoding);
-    }
-  }
-
-  public void doubleTest(TSEncoding encoding) throws IOException, 
WriteProcessException {
-    writeDataByTSRecord(
-        TSDataType.DOUBLE, (i) -> new DoubleDataPoint("sensor_1", (double) i), 
encoding);
-    readData((i, field, delta) -> assertEquals(i, field.getDoubleV(), delta));
-  }
-
-  // If no dataPoint in "device_1.sensor_2", it will throws a nomeasurement
-  // exception,
-  // cause no schema in tsfilemetadata anymore.
-  @Test
-  public void readEmptyMeasurementTest() throws IOException, 
WriteProcessException {
-    try (TsFileWriter tsFileWriter = new TsFileWriter(f, new Schema(), conf)) {
-      // add measurements into file schema
-      tsFileWriter.registerTimeseries(
-          new Path(deviceID), new MeasurementSchema("sensor_1", 
TSDataType.FLOAT, TSEncoding.RLE));
-      tsFileWriter.registerTimeseries(
-          new Path(deviceID),
-          new MeasurementSchema("sensor_2", TSDataType.INT32, 
TSEncoding.TS_2DIFF));
-      // construct TSRecord
-      TSRecord tsRecord = new TSRecord(1, deviceID);
-      DataPoint dPoint1 = new FloatDataPoint("sensor_1", 1.2f);
-      tsRecord.addTuple(dPoint1);
-      // write a TSRecord to TsFile
-      tsFileWriter.write(tsRecord);
-    }
-
-    // read example : no filter
-    TsFileSequenceReader reader = new TsFileSequenceReader(path);
-    TsFileReader readTsFile = new TsFileReader(reader);
-    ArrayList<Path> paths = new ArrayList<>();
-    paths.add(new Path(deviceID, "sensor_2", true));
-    QueryExpression queryExpression = QueryExpression.create(paths, null);
-    try {
-      QueryDataSet queryDataSet = readTsFile.query(queryExpression);
-    } catch (IOException e) {
-      // Assert.fail();
-    } finally {
-      reader.close();
-    }
-
-    assertTrue(f.delete());
-  }
-
-  @Test
-  public void readMeasurementWithRegularEncodingTest() throws IOException, 
WriteProcessException {
-    TSFileDescriptor.getInstance().getConfig().setTimeEncoder("REGULAR");
-    writeDataByTSRecord(
-        TSDataType.INT64, (i) -> new LongDataPoint("sensor_1", i), 
TSEncoding.REGULAR);
-    readData((i, field, delta) -> assertEquals(i, field.getLongV()));
-    TSFileDescriptor.getInstance().getConfig().setTimeEncoder("TS_2DIFF");
-  }
-
-  private void writeDataByTSRecord(
-      TSDataType dataType, SM4128TsFileReadWriteTest.DataPointProxy proxy, 
TSEncoding encodingType)
-      throws IOException, WriteProcessException {
-    int floatCount = 1024 * 1024 * 13 + 1023;
-    // add measurements into file schema
-    try (TsFileWriter tsFileWriter = new TsFileWriter(f, new Schema(), conf)) {
-      tsFileWriter.registerTimeseries(
-          new Path(deviceID), new MeasurementSchema("sensor_1", dataType, 
encodingType));
-      for (long i = 1; i < floatCount; i++) {
-        // construct TSRecord
-        TSRecord tsRecord = new TSRecord(i, deviceID);
-        DataPoint dPoint1 = proxy.generateOne(i);
-        tsRecord.addTuple(dPoint1);
-        // write a TSRecord to TsFile
-        tsFileWriter.write(tsRecord);
-      }
-    }
-  }
-
-  private void readData(SM4128TsFileReadWriteTest.ReadDataPointProxy proxy) 
throws IOException {
-    TsFileSequenceReader reader = new TsFileSequenceReader(path);
-    TsFileReader readTsFile = new TsFileReader(reader);
-    ArrayList<Path> paths = new ArrayList<>();
-    paths.add(new Path(deviceID, "sensor_1", true));
-    QueryExpression queryExpression = QueryExpression.create(paths, null);
-
-    QueryDataSet queryDataSet = readTsFile.query(queryExpression);
-    for (int j = 0; j < paths.size(); j++) {
-      assertEquals(paths.get(j), queryDataSet.getPaths().get(j));
-    }
-    int i = 1;
-    while (queryDataSet.hasNext()) {
-      RowRecord r = queryDataSet.next();
-      assertEquals(i, r.getTimestamp());
-      proxy.assertEqualProxy(i, r.getFields().get(0), delta);
-      i++;
-    }
-    reader.close();
-  }
-
-  private interface DataPointProxy {
-
-    DataPoint generateOne(long value);
-  }
-
-  private interface ReadDataPointProxy {
-
-    void assertEqualProxy(long i, Field field, double delta);
-  }
-}
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileWriteTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileWriteTest.java
deleted file mode 100644
index 795085bf..00000000
--- 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileWriteTest.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * 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.tsfile.encrypt;
-
-import org.apache.tsfile.common.conf.TSFileConfig;
-import org.apache.tsfile.common.conf.TSFileDescriptor;
-import org.apache.tsfile.common.constant.JsonFormatConstant;
-import org.apache.tsfile.constant.TestConstant;
-import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.exception.write.WriteProcessException;
-import org.apache.tsfile.file.metadata.TsFileMetadata;
-import org.apache.tsfile.file.metadata.enums.TSEncoding;
-import org.apache.tsfile.read.TsFileSequenceReader;
-import org.apache.tsfile.read.common.Path;
-import org.apache.tsfile.utils.RecordUtils;
-import org.apache.tsfile.utils.StringContainer;
-import org.apache.tsfile.write.TsFileWriter;
-import org.apache.tsfile.write.WriteTest;
-import org.apache.tsfile.write.record.TSRecord;
-import org.apache.tsfile.write.schema.IMeasurementSchema;
-import org.apache.tsfile.write.schema.MeasurementSchema;
-import org.apache.tsfile.write.schema.Schema;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Random;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-public class SM4128TsFileWriteTest {
-  private static final Logger LOG = LoggerFactory.getLogger(WriteTest.class);
-  private final int ROW_COUNT = 2000000;
-  private TsFileWriter tsFileWriter;
-  private String inputDataFile;
-  private String outputDataFile;
-  private String errorOutputDataFile;
-  private Random rm = new Random();
-  private ArrayList<IMeasurementSchema> measurementArray;
-  private ArrayList<Path> pathArray;
-  private Schema schema;
-  private int stageSize = 4;
-  private int stageState = -1;
-  private int prePageSize;
-  private int prePageCheckThres;
-  private TSFileConfig conf = TSFileDescriptor.getInstance().getConfig();
-
-  private String[][] stageDeviceIds = {{"d1", "d2", "d3"}, {"d1"}, {"d2", 
"d3"}};
-  private String[] measurementIds = {"s0", "s1", "s2", "s3", "s4", "s5"};
-  private long longBase = System.currentTimeMillis() * 1000;
-  private String[] enums = {"MAN", "WOMAN"};
-
-  @Before
-  public void prepare() throws IOException {
-    inputDataFile = TestConstant.BASE_OUTPUT_PATH.concat("writeTestInputData");
-    outputDataFile = 
TestConstant.BASE_OUTPUT_PATH.concat("writeTestOutputData.tsfile");
-    errorOutputDataFile = 
TestConstant.BASE_OUTPUT_PATH.concat("writeTestErrorOutputData.tsfile");
-    // for each row, flush page forcely
-    prePageSize = conf.getPageSizeInByte();
-    conf.setPageSizeInByte(0);
-    prePageCheckThres = conf.getPageCheckSizeThreshold();
-    conf.setPageCheckSizeThreshold(0);
-    conf.setEncryptFlag("true");
-    conf.setEncryptType("SM4128");
-    conf.setEncryptKey("thisisourtestkey");
-
-    try {
-      generateSampleInputDataFile();
-    } catch (IOException e) {
-      fail();
-    }
-    File file = new File(outputDataFile);
-    File errorFile = new File(errorOutputDataFile);
-    if (file.exists()) {
-      file.delete();
-    }
-    if (errorFile.exists()) {
-      errorFile.delete();
-    }
-    measurementArray = new ArrayList<>();
-    measurementArray.add(new MeasurementSchema("s0", TSDataType.INT32, 
TSEncoding.RLE));
-    measurementArray.add(new MeasurementSchema("s1", TSDataType.INT64, 
TSEncoding.TS_2DIFF));
-    HashMap<String, String> props = new HashMap<>();
-    props.put("max_point_number", "2");
-    measurementArray.add(
-        new MeasurementSchema(
-            "s2",
-            TSDataType.FLOAT,
-            TSEncoding.RLE,
-            TSFileDescriptor.getInstance().getConfig().getCompressor(),
-            props));
-    props = new HashMap<>();
-    props.put("max_point_number", "3");
-    measurementArray.add(
-        new MeasurementSchema(
-            "s3",
-            TSDataType.DOUBLE,
-            TSEncoding.TS_2DIFF,
-            TSFileDescriptor.getInstance().getConfig().getCompressor(),
-            props));
-    measurementArray.add(new MeasurementSchema("s4", TSDataType.BOOLEAN, 
TSEncoding.PLAIN));
-    pathArray = new ArrayList<>();
-    for (int i = 0; i < 5; i++) {
-      pathArray.add(new Path("d1", "s" + i, true));
-    }
-    schema = new Schema();
-    LOG.info(schema.toString());
-    tsFileWriter = new TsFileWriter(file, schema, conf);
-  }
-
-  @After
-  public void after() {
-    conf.setPageSizeInByte(prePageSize);
-    conf.setPageCheckSizeThreshold(prePageCheckThres);
-    conf.setEncryptKey("abcdefghijklmnop");
-    conf.setEncryptType("UNENCRYPTED");
-    conf.setEncryptFlag("false");
-    File file = new File(inputDataFile);
-    if (file.exists()) {
-      file.delete();
-    }
-    file = new File(outputDataFile);
-    if (file.exists()) {
-      file.delete();
-    }
-    file = new File(errorOutputDataFile);
-    if (file.exists()) {
-      file.delete();
-    }
-  }
-
-  private void generateSampleInputDataFile() throws IOException {
-    File file = new File(inputDataFile);
-    if (file.exists()) {
-      file.delete();
-    }
-    FileWriter fw = new FileWriter(file);
-
-    long startTime = System.currentTimeMillis();
-    startTime = startTime - startTime % 1000;
-
-    // first stage:int, long, float, double, boolean, enums
-    try {
-      for (int i = 0; i < ROW_COUNT; i++) {
-        // write d1
-        String d1 = "d1," + (startTime + i) + ",s1," + (i * 10 + 1) + ",s2," + 
(i * 10 + 2);
-        if (rm.nextInt(1000) < 100) {
-          d1 = "d1," + (startTime + i) + ",s1,,s2," + (i * 10 + 2) + 
",s4,HIGH";
-        }
-        if (i % 5 == 0) {
-          d1 += ",s3," + (i * 10 + 3);
-        }
-        fw.write(d1 + "\r\n");
-
-        // write d2
-        String d2 = "d2," + (startTime + i) + ",s2," + (i * 10 + 2) + ",s3," + 
(i * 10 + 3);
-        if (rm.nextInt(1000) < 100) {
-          d2 = "d2," + (startTime + i) + ",s2,,s3," + (i * 10 + 3) + ",s5,MAN";
-        }
-        if (i % 5 == 0) {
-          d2 += ",s1," + (i * 10 + 1);
-        }
-        fw.write(d2 + "\r\n");
-      }
-      // write error
-      String d =
-          "d2,3,"
-              + (startTime + ROW_COUNT)
-              + ",s2,"
-              + (ROW_COUNT * 10 + 2)
-              + ",s3,"
-              + (ROW_COUNT * 10 + 3);
-      fw.write(d + "\r\n");
-      d = "d2," + (startTime + ROW_COUNT + 1) + ",2,s-1," + (ROW_COUNT * 10 + 
2);
-      fw.write(d + "\r\n");
-    } finally {
-      fw.close();
-    }
-  }
-
-  @Test
-  public void writeTest() throws IOException {
-    try {
-      write();
-    } catch (WriteProcessException e) {
-      e.printStackTrace();
-    }
-    LOG.info("write processing has finished");
-    TsFileSequenceReader reader = new TsFileSequenceReader(outputDataFile);
-    TsFileMetadata metaData = reader.readFileMetadata();
-  }
-
-  public void write() throws IOException, WriteProcessException {
-    long lineCount = 0;
-    long startTime = System.currentTimeMillis();
-    String[] strings;
-    // add all measurement except the last one at before writing
-    for (int i = 0; i < measurementArray.size() - 1; i++) {
-      tsFileWriter.registerTimeseries(
-          new Path(pathArray.get(i).getIDeviceID()), measurementArray.get(i));
-    }
-    while (true) {
-      if (lineCount % stageSize == 0) {
-        LOG.info(
-            "write line:{},use time:{}s",
-            lineCount,
-            (System.currentTimeMillis() - startTime) / 1000);
-        stageState++;
-        LOG.info("stage:" + stageState);
-        if (stageState == stageDeviceIds.length) {
-          break;
-        }
-      }
-      if (lineCount == ROW_COUNT / 2) {
-        tsFileWriter.registerTimeseries(
-            new Path(pathArray.get(measurementArray.size() - 
1).getIDeviceID()),
-            measurementArray.get(measurementArray.size() - 1));
-      }
-      strings = getNextRecord(lineCount, stageState);
-      for (String str : strings) {
-        TSRecord record = RecordUtils.parseSimpleTupleRecord(str, schema);
-        if (record.dataPointList.isEmpty()) {
-          continue;
-        }
-        tsFileWriter.write(record);
-      }
-      lineCount++;
-    }
-    // test duplicate measurement adding
-    Path path = pathArray.get(measurementArray.size() - 1);
-    IMeasurementSchema dupTimeseries = 
measurementArray.get(measurementArray.size() - 1);
-    try {
-      tsFileWriter.registerTimeseries(new Path(path.getIDeviceID()), 
dupTimeseries);
-    } catch (WriteProcessException e) {
-      assertEquals("given timeseries has exists! " + path, e.getMessage());
-    }
-    try {
-      tsFileWriter.close();
-    } catch (IOException e) {
-      fail("close writer failed");
-    }
-    LOG.info("stage size: {}, write {} group data", stageSize, lineCount);
-  }
-
-  private String[] getNextRecord(long lineCount, int stage) {
-
-    String[] ret = new String[stageDeviceIds[stage].length];
-    for (int i = 0; i < ret.length; i++) {
-      StringContainer sc = new 
StringContainer(JsonFormatConstant.TSRECORD_SEPARATOR);
-      sc.addTail(stageDeviceIds[stage][i], lineCount);
-      sc.addTail(
-          measurementIds[0],
-          lineCount * 10 + i,
-          measurementIds[1],
-          longBase + lineCount * 20 + i,
-          measurementIds[2],
-          (lineCount * 30 + i) / 3.0,
-          measurementIds[3],
-          (longBase + lineCount * 40 + i) / 7.0);
-      sc.addTail(measurementIds[4], ((lineCount + i) & 1) == 0);
-      sc.addTail(measurementIds[5], enums[(int) (lineCount + i) % 
enums.length]);
-      ret[i] = sc.toString();
-    }
-    return ret;
-  }
-}

Reply via email to