diff --git a/dist/services/CryptoService/CryptoServiceWeb.js b/dist/services/CryptoService/CryptoServiceWeb.js
index be96a6ee078c2a019054b85e3bf832e26ede3620..04fd945b66b6f3637c493600d63b1d7983f42c98 100644
--- a/dist/services/CryptoService/CryptoServiceWeb.js
+++ b/dist/services/CryptoService/CryptoServiceWeb.js
@@ -48,12 +48,23 @@ const getBytes = (value, encoding) => {
     return bytes;
 };
 class CryptoServiceWeb {
-    encryptAESGCM(data) {
+    encryptAESGCM(data, key, iv) {
         return __awaiter(this, void 0, void 0, function* () {
-            const key = yield crypto.subtle.generateKey({
-                name: "AES-GCM",
-                length: 256,
-            }, true, ["encrypt", "decrypt"]);
+            if (!key && !iv) {
+                key = yield crypto.subtle.generateKey({
+                    name: "AES-GCM",
+                    length: 256,
+                }, true, ["encrypt", "decrypt"]);
+                iv = crypto.getRandomValues(new Buffer(12));
+            }
+            else {
+                if (key instanceof Buffer) {
+                    key = yield crypto.subtle.importKey("raw", key, "AES-GCM", true, [
+                        "encrypt",
+                        "decrypt",
+                    ]);
+                }
+            }
             let encoded;
             if (typeof data === "string") {
                 encoded = new TextEncoder().encode(data);
@@ -61,7 +72,6 @@ class CryptoServiceWeb {
             else {
                 encoded = data;
             }
-            const iv = crypto.getRandomValues(new Buffer(12));
             const encrypted = yield crypto.subtle.encrypt({ name: "AES-GCM", iv: iv }, key, encoded);
             return { data: encrypted, key: yield exportKey(key), iv };
         });
diff --git a/dist/services/CryptoService/ICryptoService.d.ts b/dist/services/CryptoService/ICryptoService.d.ts
index 24dfcd1294c69e9cb0ef9035e48651b8936c8d28..9bbea01ae3b7796f6eeda8329a49eb082af2c685 100644
--- a/dist/services/CryptoService/ICryptoService.d.ts
+++ b/dist/services/CryptoService/ICryptoService.d.ts
@@ -1,3 +1,4 @@
+/// <reference types="node" />
 export interface AESGCMOutput {
     data: ArrayBuffer;
     key: ArrayBuffer;
@@ -10,7 +11,7 @@ export interface RSAKeys {
 export interface ICryptoService {
     encryptAESGCM: {
         (data: string): Promise<AESGCMOutput>;
-        (data: ArrayBuffer): Promise<AESGCMOutput>;
+        (data: ArrayBuffer, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>;
     };
     decryptAESGCM: {
         (data: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): Promise<string>;
diff --git a/src/services/CryptoService/CryptoServiceNode.ts b/src/services/CryptoService/CryptoServiceNode.ts
index 1af2cca563ccbb8f960d1159f35762c743aa45a9..5f5163d15807e8debfab33706e807ebb66b19352 100644
--- a/src/services/CryptoService/CryptoServiceNode.ts
+++ b/src/services/CryptoService/CryptoServiceNode.ts
@@ -4,7 +4,7 @@ import md5 from "js-md5";
 import * as crypto from "crypto";
 
 import { AESGCMOutput, RSAKeys, ICryptoService } from "./ICryptoService";
-import { ensureUint8Array, arrayBufferToBase64 } from "../../utils/common";
+import { ensureUint8Array } from "../../utils/common";
 
 const AES_GCM_ALGO = "aes-256-gcm";
 
diff --git a/src/services/CryptoService/CryptoServiceWeb.ts b/src/services/CryptoService/CryptoServiceWeb.ts
index 06534df3aa1ac55180bc501d73b5ee30718fc55d..831e038306a39eb403591c5775480f77b16555e0 100644
--- a/src/services/CryptoService/CryptoServiceWeb.ts
+++ b/src/services/CryptoService/CryptoServiceWeb.ts
@@ -42,16 +42,29 @@ class CryptoServiceWeb implements ICryptoService {
   public async encryptAESGCM(data: string): Promise<AESGCMOutput>;
   public async encryptAESGCM(data: ArrayBuffer): Promise<AESGCMOutput>;
   public async encryptAESGCM(
-    data: string | ArrayBuffer
+    data: string | ArrayBuffer,
+    key?: Buffer | CryptoKey,
+    iv?: Buffer
   ): Promise<AESGCMOutput> {
-    const key = await crypto.subtle.generateKey(
-      {
-        name: "AES-GCM",
-        length: 256,
-      },
-      true,
-      ["encrypt", "decrypt"]
-    );
+    if (!key && !iv) {
+      key = await crypto.subtle.generateKey(
+        {
+          name: "AES-GCM",
+          length: 256,
+        },
+        true,
+        ["encrypt", "decrypt"]
+      );
+
+      iv = crypto.getRandomValues(new Buffer(12));
+    } else {
+      if (key instanceof Buffer) {
+        key = await crypto.subtle.importKey("raw", key, "AES-GCM", true, [
+          "encrypt",
+          "decrypt",
+        ]);
+      }
+    }
 
     let encoded;
     if (typeof data === "string") {
@@ -59,7 +72,7 @@ class CryptoServiceWeb implements ICryptoService {
     } else {
       encoded = data;
     }
-    const iv = crypto.getRandomValues(new Buffer(12));
+
     const encrypted = await crypto.subtle.encrypt(
       { name: "AES-GCM", iv: iv },
       key,
diff --git a/src/services/CryptoService/ICryptoService.ts b/src/services/CryptoService/ICryptoService.ts
index 0dfd66a86ab28a6a4fe1a2138a78628f18c20a06..0867a3b80ce04f260f99ddd5dca1d652596e578e 100644
--- a/src/services/CryptoService/ICryptoService.ts
+++ b/src/services/CryptoService/ICryptoService.ts
@@ -12,7 +12,7 @@ export interface RSAKeys {
 export interface ICryptoService {
   encryptAESGCM: {
     (data: string): Promise<AESGCMOutput>;
-    (data: ArrayBuffer): Promise<AESGCMOutput>;
+    (data: ArrayBuffer, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>;
   };
   decryptAESGCM: {
     (data: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): Promise<string>;