diff --git a/CMakeLists.txt b/CMakeLists.txt
index fb42c1fbf8c522b2c6b77925cd028ce13ed82f60..15db3e3a5ea2fcc46bacb27492a96a7cdea0da6a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,6 +6,7 @@ add_definitions ("-D_GNU_SOURCE")
 
 set(CMAKE_C_FLAGS "-std=c11 -Wall -Wextra")
 
+add_definitions ("-DBUILD_DAP_TESTS")
 if(BUILD_DAP_TESTS)
     enable_testing()
     add_subdirectory(test)
diff --git a/crypto/dap_enc_iaes.c b/crypto/dap_enc_iaes.c
index 91d2e0e1e3209757bc4b152daeb61b294e5b5227..2ed38ff8dd8543a7e47c62944c796c50818dc66b 100644
--- a/crypto/dap_enc_iaes.c
+++ b/crypto/dap_enc_iaes.c
@@ -32,6 +32,7 @@ void dap_enc_aes_key_delete(struct dap_enc_key *a_key)
 void dap_enc_aes_key_new(struct dap_enc_key * a_key)
 {
     a_key->_inheritor = DAP_NEW_Z(dap_enc_aes_key_t);
+    a_key->_inheritor_size = sizeof (dap_enc_aes_key_t);
     a_key->type = DAP_ENC_KEY_TYPE_AES;
     a_key->enc = dap_enc_iaes256_cbc_encrypt;
     a_key->dec = dap_enc_iaes256_cbc_decrypt;
diff --git a/crypto/dap_enc_key.c b/crypto/dap_enc_key.c
index 636885f3ed93b1ac64afe4277e9993ae0502cd33..00b609dccfb7df937ca9c32662e19e8265d0933e 100644
--- a/crypto/dap_enc_key.c
+++ b/crypto/dap_enc_key.c
@@ -94,6 +94,56 @@ void dap_enc_key_deinit()
 
 }
 
+/**
+ * @brief dap_enc_key_serealize
+ * @param key
+ * @return allocates dap_enc_key_serealize_t* dont remember use free()
+ */
+dap_enc_key_serealize_t* dap_enc_key_serealize(dap_enc_key_t * key)
+{
+    log_it(L_DEBUG, "serealize struct size : %d", sizeof (dap_enc_key_serealize_t));
+    dap_enc_key_serealize_t *result = DAP_NEW_Z(dap_enc_key_serealize_t);
+    result->priv_key_data_size = key->priv_key_data_size;
+    result->pub_key_data_size = key->pub_key_data_size;
+    result->last_used_timestamp = key->last_used_timestamp;
+    result->inheritor_size = key->_inheritor_size;
+    result->type = key->type;
+    memcpy(result->priv_key_data, key->priv_key_data, key->priv_key_data_size);
+    memcpy(result->pub_key_data, key->pub_key_data, key->pub_key_data_size);
+    memcpy(result->inheritor, key->_inheritor, key->_inheritor_size);
+
+    return result;
+}
+
+/**
+ * @brief dap_enc_key_deserealize
+ * @param buf
+ * @param buf_size
+ * @return allocates dap_enc_key_t*. Use dap_enc_key_delete for free memory
+ */
+dap_enc_key_t* dap_enc_key_deserealize(void *buf, size_t buf_size)
+{
+    if(buf_size != sizeof (dap_enc_key_serealize_t)) {
+        log_it(L_ERROR, "Key can't be deserealize. buf_size != sizeof (dap_enc_key_serealize_t)");
+        return NULL;
+    }
+    dap_enc_key_serealize_t *in_key = (dap_enc_key_serealize_t *)buf;
+    dap_enc_key_t *result = dap_enc_key_new(in_key->type);
+    result->last_used_timestamp = in_key->last_used_timestamp;
+    result->priv_key_data_size = in_key->priv_key_data_size;
+    result->pub_key_data_size = in_key->pub_key_data_size;
+    result->_inheritor_size = in_key->inheritor_size;
+    memcpy(result->priv_key_data, in_key->priv_key_data, result->priv_key_data_size);
+    memcpy(result->pub_key_data, in_key->pub_key_data, result->pub_key_data_size);
+
+    if(in_key->inheritor_size)
+        memcpy(result->_inheritor, in_key->inheritor, in_key->inheritor_size);
+    else
+        result->_inheritor = NULL;
+
+    return result;
+}
+
 /**
  * @brief dap_enc_key_new
  * @param a_key_type
diff --git a/crypto/dap_enc_key.h b/crypto/dap_enc_key.h
index c8ccb06118234a4f91c0b1d4e2d0629e964e27f9..36530ce3a6a9b9e2db91686a80758234d57e8c26 100644
--- a/crypto/dap_enc_key.h
+++ b/crypto/dap_enc_key.h
@@ -116,7 +116,6 @@ typedef void (*dap_enc_callback_delete)(struct dap_enc_key*);
 typedef size_t (*dap_enc_callback_dataop_t)(struct dap_enc_key *key, const void *in,
                                             const size_t in_size,void ** out);
 
-
 typedef void (*dap_enc_callback_ptr_t)(struct dap_enc_key *, void *);
 typedef size_t (*dap_enc_callback_pptr_r_size_t)(struct dap_enc_key *, void **);
 typedef void (*dap_enc_callback_data_t)(struct dap_enc_key *, const void * , size_t);
@@ -135,12 +134,35 @@ typedef struct dap_enc_key{
     dap_enc_key_type_t type;
     dap_enc_callback_dataop_t enc;
     dap_enc_callback_dataop_t dec;
-    void * _inheritor;
+
+    void * _inheritor; // WARNING! Inheritor must have only serealizeble/deserializeble data (copy)
+    size_t _inheritor_size;
 } dap_enc_key_t;
 
+#define MAX_ENC_KEY_SIZE 16384
+#define MAX_INHERITOR_SIZE 2048
+
+// struct for serelization/deseralization keys in binary storage
+typedef struct dap_enc_key_serealize {
+    size_t priv_key_data_size;
+    size_t pub_key_data_size;
+    size_t inheritor_size;
+    time_t last_used_timestamp;
+    dap_enc_key_type_t type;
+
+    unsigned char priv_key_data[MAX_ENC_KEY_SIZE];
+    unsigned char pub_key_data[MAX_ENC_KEY_SIZE];
+    unsigned char inheritor[MAX_INHERITOR_SIZE];
+} dap_enc_key_serealize_t;
+
 int dap_enc_key_init(void);
 void dap_enc_key_deinit(void);
 
+
+dap_enc_key_serealize_t* dap_enc_key_serealize(dap_enc_key_t * key);
+dap_enc_key_t* dap_enc_key_deserealize(void *buf, size_t buf_size);
+
+// allocate memory for key struct
 dap_enc_key_t *dap_enc_key_new(dap_enc_key_type_t a_key_type);
 
 // default gen key
diff --git a/test/crypto/dap_enc_test.c b/test/crypto/dap_enc_test.c
index da7ea3083bbba12f9d337bfaede05aaf90151dc0..47153d45e3cb788fd75faeee023c07ac24636e85 100644
--- a/test/crypto/dap_enc_test.c
+++ b/test/crypto/dap_enc_test.c
@@ -86,7 +86,7 @@ void test_key_transfer_msrln()
     /* generate Bob's response */
     dap_enc_key_t* bob_key = dap_enc_key_new(DAP_ENC_KEY_TYPE_MSRLN);
     bob_key->enc(bob_key, (unsigned char *) alice_msg, alice_msg_len,
-                         (void **) &bob_key->pub_key_data);
+                 (void **) &bob_key->pub_key_data);
     bob_msg = bob_key->pub_key_data;
     bob_msg_len = bob_key->pub_key_data_size;
 
@@ -112,6 +112,93 @@ static void cleanup_test_case()
     dap_enc_key_deinit();
 }
 
+#define TEST_SER_FILE_NAME "keystorage.txt"
+static void _write_key_in_file(dap_enc_key_serealize_t* key,
+                               const char* file_name)
+{
+    FILE *f = fopen(TEST_SER_FILE_NAME, "w");
+    dap_assert(f, "Can't create file");
+    fwrite(key, sizeof (dap_enc_key_serealize_t), 1, f);
+    fclose(f);
+}
+
+dap_enc_key_serealize_t* _read_key_from_file(const char* file_name)
+{
+    FILE *f = fopen(TEST_SER_FILE_NAME, "r");
+    dap_assert(f, "Can't open key file");
+    dap_enc_key_serealize_t* resut_key = calloc(1, sizeof(dap_enc_key_serealize_t));
+    fread(resut_key, sizeof(dap_enc_key_serealize_t), 1, f);
+    fclose(f);
+
+    return resut_key;
+}
+
+static void test_serealize_deserealize()
+{
+    const char *kex_data = "123";
+    size_t kex_size = strlen(kex_data);
+    const size_t seed_size = 1 + (rand() % 1000);
+    uint8_t seed[seed_size];
+
+    generate_random_byte_array(seed, seed_size);
+
+    dap_enc_key_t* key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_AES, kex_data, kex_size, seed, seed_size, 0);
+    dap_enc_key_serealize_t* serealize_key = dap_enc_key_serealize(key);
+    _write_key_in_file(serealize_key, TEST_SER_FILE_NAME);
+    dap_enc_key_serealize_t* deserealize_key = _read_key_from_file(TEST_SER_FILE_NAME);
+    dap_assert(memcmp(serealize_key, deserealize_key, sizeof(dap_enc_key_serealize_t)) == 0,
+               "dap_enc_key_serealize_t equals");
+
+    dap_enc_key_t* key2 = dap_enc_key_deserealize(deserealize_key, sizeof (*deserealize_key));
+
+    dap_assert(key->type == key2->type, "Key type");
+    dap_assert(key->last_used_timestamp == key2->last_used_timestamp,
+               "Last used timestamp");
+    dap_assert(key->priv_key_data_size == key2->priv_key_data_size, "Priv key data size");
+    dap_assert(key->pub_key_data_size == key2->pub_key_data_size, "Pub key data size");
+
+    dap_assert(memcmp(key->priv_key_data, key2->priv_key_data, key2->priv_key_data_size) == 0,
+               "Priv key data");
+
+    if(key->pub_key_data_size) {
+        dap_assert(memcmp(key->pub_key_data, key2->pub_key_data, key2->pub_key_data_size) == 0,
+                   "Pub key data");
+    }
+    dap_assert(key->enc == key2->enc, "Enc callback");
+    dap_assert(key->dec == key2->dec, "Dec callback");
+
+    const char* source = "simple test";
+    size_t source_size = strlen(source);
+
+    uint8_t * encrypt_result = NULL;
+    uint8_t * decode_result = NULL;
+
+    size_t encrypted_size = dap_enc_code(key2, source,
+                                         source_size,
+                                         (void**)&encrypt_result,
+                                         DAP_ENC_DATA_TYPE_RAW);
+
+    size_t decode_size = dap_enc_decode(key,
+                                     encrypt_result,
+                                     encrypted_size,
+                                     (void**)&decode_result,
+                                     DAP_ENC_DATA_TYPE_RAW);
+
+    dap_assert_PIF(source_size == decode_size, "Check result decode size");
+
+    dap_assert_PIF(memcmp(source, decode_result, source_size) == 0,
+                   "Check source and encode->decode data");
+
+    free(encrypt_result);
+    free(decode_result);
+    free(serealize_key);
+    free(deserealize_key);
+    dap_enc_key_delete(key);
+    dap_enc_key_delete(key2);
+
+    dap_pass_msg("Key serealize->deserealize");
+}
+
 void dap_enc_tests_run() {
     dap_print_module_name("dap_enc");
     init_test_case();
@@ -119,5 +206,6 @@ void dap_enc_tests_run() {
     test_encode_decode_raw_b64(50);
     test_encode_decode_raw_b64_url_safe(50);
     test_key_transfer_msrln();
+    test_serealize_deserealize();
     cleanup_test_case();
 }