diff --git a/src/contents/ui/CreateRoomPage.qml b/src/contents/ui/CreateRoomPage.qml
--- a/src/contents/ui/CreateRoomPage.qml
+++ b/src/contents/ui/CreateRoomPage.qml
@@ -20,6 +20,7 @@
 
   property var creatingRoom: false
   property var inviteUserIds: []
+  property var encryptedChangedOnce: false
 
   ButtonGroup {
     id: roomTypeButtons
@@ -34,6 +35,11 @@
         id: typePublic
         objectName: 'typePublicRadio'
         checked: true
+        onCheckedChanged: {
+          if (!createRoomPage.encryptedChangedOnce) {
+            encrypted.checked = !checked;
+          }
+        }
         text: l10n.get('create-room-page-type-public')
         ButtonGroup.group: roomTypeButtons
       }
@@ -82,6 +88,14 @@
       Layout.fillWidth: true
     }
 
+    CheckBox {
+      id: encrypted
+      objectName: 'encryptedInput'
+      text: l10n.get('create-room-page-encrypted-prompt')
+      Layout.fillWidth: true
+      onToggled: createRoomPage.encryptedChangedOnce = true
+    }
+
     Item {
       Kirigami.FormData.isSection: true
       Kirigami.FormData.label: l10n.get('create-room-invite-userids-prompt')
@@ -160,7 +174,8 @@
         ? MK.MatrixSdk.TrustedPrivateChat
         : typePrivate.checked
         ? MK.MatrixSdk.PrivateChat
-        : MK.MatrixSdk.PublicChat
+        : MK.MatrixSdk.PublicChat,
+      /* encrypted = */ encrypted.checked,
     )
 
     onResolved: {
diff --git a/src/l10n/cmn-Hans/100-ui.ftl b/src/l10n/cmn-Hans/100-ui.ftl
--- a/src/l10n/cmn-Hans/100-ui.ftl
+++ b/src/l10n/cmn-Hans/100-ui.ftl
@@ -254,6 +254,7 @@
 create-room-page-action-create-room = 创建房间
 create-room-page-success-prompt = 房间已创建。
 create-room-page-failed-prompt = 无法创建房间。错误代码:{ $errorCode }。错误讯息:{ $errorMsg }。
+create-room-page-encrypted-prompt = 启用端对端加密
 
 join-room-page-title = 加入房间
 join-room-page-id-or-alias-prompt = 房间 id 或别名:
diff --git a/src/l10n/en/100-ui.ftl b/src/l10n/en/100-ui.ftl
--- a/src/l10n/en/100-ui.ftl
+++ b/src/l10n/en/100-ui.ftl
@@ -282,6 +282,7 @@
 create-room-page-add-invite-placeholder = Matrix id, e.g. @foo:example.org
 create-room-page-action-add-invite = Add
 create-room-page-action-remove-invite = Remove
+create-room-page-encrypted-prompt = Enable end-to-end encryption
 
 join-room-page-title = Join room
 join-room-page-id-or-alias-prompt = Room id or alias:
diff --git a/src/matrix-sdk.hpp b/src/matrix-sdk.hpp
--- a/src/matrix-sdk.hpp
+++ b/src/matrix-sdk.hpp
@@ -170,6 +170,7 @@
      * @param topic The topic of the room.
      * @param powerLevelContentOverride The content to override m.room.power_levels event.
      * @param preset The preset to create the room with.
+     * @param encrypted Whether to enable encryption for this room.
      */
     MatrixPromise *createRoom(
         bool isPrivate,
@@ -180,7 +181,8 @@
         bool allowFederate,
         const QString &topic,
         const QJsonValue &powerLevelContentOverride,
-        CreateRoomPreset preset
+        CreateRoomPreset preset,
+        bool encrypted
     );
 
     /**
diff --git a/src/matrix-sdk.cpp b/src/matrix-sdk.cpp
--- a/src/matrix-sdk.cpp
+++ b/src/matrix-sdk.cpp
@@ -592,9 +592,22 @@
     bool allowFederate,
     const QString &topic,
     const QJsonValue &powerLevelContentOverride,
-    CreateRoomPreset preset
+    CreateRoomPreset preset,
+    bool encrypted
 )
 {
+    immer::array<Event> initialState;
+
+    if (encrypted) {
+        initialState = {Event{json{
+            {"type", "m.room.encryption"},
+            {"state_key", ""},
+            {"content", {
+                {"algorithm", "m.megolm.v1.aes-sha2"},
+            }},
+        }}};
+    }
+
     return new MatrixPromise(m_d->clientOnSecondaryRoot.createRoom(
         isPrivate ? Kazv::RoomVisibility::Private : Kazv::RoomVisibility::Public,
         optMaybe(name),
@@ -604,7 +617,8 @@
         allowFederate,
         optMaybe(topic),
         nlohmann::json(powerLevelContentOverride),
-        static_cast<Kazv::CreateRoomPreset>(preset)
+        static_cast<Kazv::CreateRoomPreset>(preset),
+        initialState
     ));
 }
 
diff --git a/src/tests/quick-tests/tst_CreateRoomPage.qml b/src/tests/quick-tests/tst_CreateRoomPage.qml
--- a/src/tests/quick-tests/tst_CreateRoomPage.qml
+++ b/src/tests/quick-tests/tst_CreateRoomPage.qml
@@ -32,6 +32,7 @@
       'topic',
       'powerLevelContentOverride',
       'preset',
+      'encrypted',
     ])
   }
   property var sdkVars: ({})
@@ -56,6 +57,7 @@
       mockHelper.clearAll();
       createRoomPage.inviteUserIds = [];
       createRoomPage.creatingRoom = false;
+      createRoomPage.encryptedChangedOnce = false;
     }
 
     function test_createRoomPublic() {
@@ -79,6 +81,7 @@
         allowFederate: true,
         powerLevelContentOverride: {},
         preset: MK.MatrixSdk.PublicChat,
+        encrypted: false,
       }));
     }
 
@@ -103,6 +106,7 @@
         allowFederate: true,
         powerLevelContentOverride: {},
         preset: MK.MatrixSdk.PrivateChat,
+        encrypted: true,
       }));
     }
 
@@ -127,6 +131,7 @@
         allowFederate: true,
         powerLevelContentOverride: {},
         preset: MK.MatrixSdk.TrustedPrivateChat,
+        encrypted: true,
       }));
     }
 
@@ -158,6 +163,7 @@
         allowFederate: true,
         powerLevelContentOverride: {},
         preset: MK.MatrixSdk.TrustedPrivateChat,
+        encrypted: true,
       }));
     }
 
@@ -193,6 +199,7 @@
         allowFederate: true,
         powerLevelContentOverride: {},
         preset: MK.MatrixSdk.TrustedPrivateChat,
+        encrypted: true,
       }));
     }
 
@@ -244,7 +251,28 @@
         allowFederate: true,
         powerLevelContentOverride: {},
         preset: MK.MatrixSdk.PublicChat,
+        encrypted: false,
       }));
     }
+
+    function test_encryptedCheckBox() {
+      const publicRadio = findChild(createRoomPage, 'typePublicRadio');
+      const privateRadio = findChild(createRoomPage, 'typePrivateRadio');
+      const directRadio = findChild(createRoomPage, 'typeDirectRadio')
+      const encryptedInput = findChild(createRoomPage, 'encryptedInput');
+      mouseClick(publicRadio);
+      verify(!encryptedInput.checked);
+      mouseClick(privateRadio);
+      verify(encryptedInput.checked);
+      mouseClick(directRadio);
+      verify(encryptedInput.checked);
+
+      mouseClick(encryptedInput);
+      verify(!encryptedInput.checked);
+      mouseClick(publicRadio);
+      verify(!encryptedInput.checked);
+      mouseClick(directRadio);
+      verify(!encryptedInput.checked);
+    }
   }
 }