Fix EncryptRuleConfiguration defaultProperties. (#30990)

diff --git a/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/EncryptRuleConfiguration.java b/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/EncryptRuleConfiguration.java
index 0ead0f4..41ade93 100644
--- a/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/EncryptRuleConfiguration.java
+++ b/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/EncryptRuleConfiguration.java
@@ -27,7 +27,10 @@
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
 
 /**
  * Encrypt rule configuration.
@@ -41,11 +44,20 @@
     
     public EncryptRuleConfiguration(final Collection<EncryptTableRuleConfiguration> tables, final Map<String, AlgorithmConfiguration> encryptors) {
         this.tables = tables;
-        this.encryptors = encryptors;
-        for (AlgorithmConfiguration each : encryptors.values()) {
-            TypedSPILoader.findUninitedService(EncryptAlgorithm.class, each.getType()).map(EncryptAlgorithm::getMetaData).map(EncryptAlgorithmMetaData::getDefaultProps)
-                    .ifPresent(each.getProps()::putAll);
+        this.encryptors = rebuildEncryptorsWithDefaultProperties(encryptors);
+    }
+    
+    private Map<String, AlgorithmConfiguration> rebuildEncryptorsWithDefaultProperties(final Map<String, AlgorithmConfiguration> encryptors) {
+        Map<String, AlgorithmConfiguration> result = new HashMap<>();
+        for (Entry<String, AlgorithmConfiguration> entry : encryptors.entrySet()) {
+            Properties props = new Properties();
+            props.putAll(entry.getValue().getProps());
+            Properties defaultProps = TypedSPILoader.findUninitedService(EncryptAlgorithm.class, entry.getValue().getType()).map(EncryptAlgorithm::getMetaData)
+                    .map(EncryptAlgorithmMetaData::getDefaultProps).orElseGet(Properties::new);
+            defaultProps.forEach(props::putIfAbsent);
+            result.put(entry.getKey(), new AlgorithmConfiguration(entry.getValue().getType(), props));
         }
+        return result;
     }
     
     @Override
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
index d2cbaa7..e8520c4 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.encrypt.rule;
 
+import org.apache.commons.codec.digest.MessageDigestAlgorithms;
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
 import org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnItemRuleConfiguration;
 import org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
@@ -40,11 +41,14 @@
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 class EncryptRuleTest {
     
+    private static final String DIGEST_ALGORITHM_NAME = "digest-algorithm-name";
+    
     @Test
     void assertFindEncryptTable() {
         assertTrue(new EncryptRule("foo_db", createEncryptRuleConfiguration()).findEncryptTable("t_encrypt").isPresent());
@@ -86,6 +90,18 @@
         assertThat(pwdColumnConfig.getLikeQuery().get().getEncryptorName(), is("like_query_test_encryptor"));
     }
     
+    @Test
+    void assertAESEncryptRuleDefaultProps() {
+        EncryptRuleConfiguration defaultPropsEncryptRuleConfig = new EncryptRuleConfiguration(Collections.emptyList(),
+                Collections.singletonMap("aes_encryptor", new AlgorithmConfiguration("AES", new Properties())));
+        assertEquals(MessageDigestAlgorithms.SHA_1, defaultPropsEncryptRuleConfig.getEncryptors().get("aes_encryptor").getProps().getProperty(DIGEST_ALGORITHM_NAME));
+        Properties props = new Properties();
+        props.put(DIGEST_ALGORITHM_NAME, MessageDigestAlgorithms.SHA_256);
+        EncryptRuleConfiguration sha256EncryptRuleConfig = new EncryptRuleConfiguration(Collections.emptyList(),
+                Collections.singletonMap("aes_encryptor", new AlgorithmConfiguration("AES", props)));
+        assertEquals(MessageDigestAlgorithms.SHA_256, sha256EncryptRuleConfig.getEncryptors().get("aes_encryptor").getProps().getProperty(DIGEST_ALGORITHM_NAME));
+    }
+    
     private Map<String, AlgorithmConfiguration> getEncryptors(final AlgorithmConfiguration standardEncryptConfig, final AlgorithmConfiguration queryAssistedEncryptConfig,
                                                               final AlgorithmConfiguration queryLikeEncryptConfig) {
         Map<String, AlgorithmConfiguration> result = new HashMap<>(3, 1F);