diff --git a/libraries/Update/src/Update.h b/libraries/Update/src/Update.h
index 7ae5e980751..5832846fd28 100644
--- a/libraries/Update/src/Update.h
+++ b/libraries/Update/src/Update.h
@@ -137,8 +137,9 @@ class UpdateClass {
 
   /*
       sets the expected MD5 for the firmware (hexString)
+      If calc_post_decryption is true, the update library will calculate the MD5 after the decryption, if false the calculation occurs before the decryption
     */
-  bool setMD5(const char *expected_md5);
+  bool setMD5(const char *expected_md5, bool calc_post_decryption = true);
 
   /*
       returns the MD5 String of the successfully ended firmware
@@ -257,6 +258,7 @@ class UpdateClass {
   const esp_partition_t *_partition;
 
   String _target_md5;
+  bool _target_md5_decrypted = true;
   MD5Builder _md5;
 
   int _ledPin;
diff --git a/libraries/Update/src/Updater.cpp b/libraries/Update/src/Updater.cpp
index 78f93602cde..e92f84d4599 100644
--- a/libraries/Update/src/Updater.cpp
+++ b/libraries/Update/src/Updater.cpp
@@ -348,6 +348,11 @@ bool UpdateClass::_writeBuffer() {
       log_d("Decrypting OTA Image");
     }
   }
+
+  if (!_target_md5_decrypted) {
+    _md5.add(_buffer, _bufferLen);
+  }
+
   //check if data in buffer needs decrypting
   if (_cryptMode & U_AES_IMAGE_DECRYPTING_BIT) {
     if (!_decryptBuffer()) {
@@ -404,7 +409,9 @@ bool UpdateClass::_writeBuffer() {
   if (!_progress && _command == U_FLASH) {
     _buffer[0] = ESP_IMAGE_HEADER_MAGIC;
   }
-  _md5.add(_buffer, _bufferLen);
+  if (_target_md5_decrypted) {
+    _md5.add(_buffer, _bufferLen);
+  }
   _progress += _bufferLen;
   _bufferLen = 0;
   if (_progress_callback) {
@@ -446,12 +453,13 @@ bool UpdateClass::_verifyEnd() {
   return false;
 }
 
-bool UpdateClass::setMD5(const char *expected_md5) {
+bool UpdateClass::setMD5(const char *expected_md5, bool calc_post_decryption) {
   if (strlen(expected_md5) != 32) {
     return false;
   }
   _target_md5 = expected_md5;
   _target_md5.toLowerCase();
+  _target_md5_decrypted = calc_post_decryption;
   return true;
 }