diff --git a/c/opendht.cpp b/c/opendht.cpp
index 13819c35bc9ec72b3fa12f0b160708dab6fa4c3b..fb28b7218c096ab62a0fec452aacfb881286bf04 100644
--- a/c/opendht.cpp
+++ b/c/opendht.cpp
@@ -118,13 +118,21 @@ dht_privatekey* dht_privatekey_generate(unsigned key_length_bits) {
 }
 
 dht_privatekey* dht_privatekey_import(const uint8_t* dat, size_t dat_size, const char* password) {
-    return reinterpret_cast<dht_privatekey*>(new dht::crypto::PrivateKey(dat, dat_size, password));
+    try {
+        return reinterpret_cast<dht_privatekey*>(new dht::crypto::PrivateKey(dat, dat_size, password));
+    } catch (const dht::crypto::CryptoException& e) {
+        return nullptr;
+    }
 }
 
 dht_publickey* dht_privatekey_get_publickey(const dht_privatekey* key) {
     return reinterpret_cast<dht_publickey*>(new dht::crypto::PublicKey(reinterpret_cast<const dht::crypto::PrivateKey*>(key)->getPublicKey()));
 }
 
+void dht_privatekey_delete(dht_privatekey* pk) {
+    delete reinterpret_cast<dht::crypto::PrivateKey*>(pk);
+}
+
 // dht::DhtRunner
 dht_runner* dht_runner_new() {
     return reinterpret_cast<dht_runner*>(new dht::DhtRunner);
diff --git a/c/opendht_c.h b/c/opendht_c.h
index d388aa599cc55e2d5616b8c3e8f3236c8007e7cd..de69a013cd77542c51b2d5086336bf6f3ff8ccc2 100644
--- a/c/opendht_c.h
+++ b/c/opendht_c.h
@@ -63,6 +63,7 @@ typedef struct dht_privatekey dht_privatekey;
 OPENDHT_C_PUBLIC dht_privatekey* dht_privatekey_generate(unsigned key_length_bits);
 OPENDHT_C_PUBLIC dht_privatekey* dht_privatekey_import(const uint8_t* dat, size_t dat_size, const char* password);
 OPENDHT_C_PUBLIC dht_publickey* dht_privatekey_get_publickey(const dht_privatekey*);
+OPENDHT_C_PUBLIC void dht_privatekey_delete(dht_privatekey* pk);
 
 // dht::crypto::Certificate
 struct OPENDHT_C_PUBLIC dht_certificate;
@@ -74,11 +75,11 @@ typedef bool (*dht_value_cb)(const dht_value* value, bool expired, void* user_da
 typedef bool (*dht_done_cb)(bool ok, void* user_data);
 typedef bool (*dht_shutdown_cb)(void* user_data);
 
-// dht::DhtRunner
 struct OPENDHT_C_PUBLIC dht_op_token;
 typedef struct dht_op_token dht_op_token;
 OPENDHT_C_PUBLIC void dht_op_token_delete(dht_op_token* token);
 
+// dht::DhtRunner
 struct OPENDHT_C_PUBLIC dht_runner;
 typedef struct dht_runner dht_runner;
 OPENDHT_C_PUBLIC dht_runner* dht_runner_new();