2017-02-22 57 views
0

我正在研究一些使用加密庫的軟件,這是我無法更改的基礎機制。當程序運行時,大約需要10分鐘的時間來生成公鑰和私鑰,這在嘗試調試軟件的其他部分時非常令人沮喪。我想將密鑰寫入一個文件並讀回來以節省時間。將虛擬指針的數據寫入文件

這些鍵是空指針:

Enc_Key_T secKey = nullptr;

Enc_Key_T被定義爲typedef void* Enc_Key_T

我已經習慣了嘗試讀取和寫入密鑰是如下的代碼(僅試圖寫目前爲止的祕密密鑰):

#ifdef WriteKey 

    generate_Keys(parameters, &sec_key, &prv_key); 

    FILE * pFile; 
    pFile = fopen("sk.bin", "wb"); 
    fwrite(&sec_key, sizeof(Enc_Key_T), sizeof(&sec_key), pFile); 
    fclose(pFile); 

#else 

    FILE * pFile; 
    long lSize; 
    char * buffer; 
    pFile = fopen("sk.bin", "rb"); 
    if(pFile == NULL) 
     fileError(); 

    fseek (pFile, 0 , SEEK_END); 
    lsize = ftell (pFile); 
    rewind (pFile); 

    buffer = (char *) malloc (sizeof(char)*lSize); 
    if(buffer == NULL) 
     memError(); 

    sec_key = (void *) fread(buffer, 1, lSize, pFile); 

    fclose(pFile); 
    free(buffer); 

#endif 

當我編寫文件時,它出現爲64但是在密鑰指針中讀回它被設置爲一個低值內存地址,這讓我覺得我做錯了什麼。我找不到任何可以做到的例子。我甚至不確定它是否可以,因爲我不會創建任何下層結構,所以我只是試圖在由指針提供的位置分配一些內存。

無論如何,這可以完成,而無需觸摸生成密鑰的底層庫?

+0

至少'sizeof(&sec_key)'這是錯誤的。它應該是'sizeof(sec_key)'。 –

+0

您必須瞭解密鑰的存儲方式。現在,你正在試圖複製一些只知道它在哪裏的東西。但是,如何複製一張紙與複製聲音的方式不同。你需要確切地知道*複製它的是什麼,而不僅僅是在哪裏。 –

+0

請告訴我'Enc_Key_T'的類型是一個類或結構還是什麼?如果你有它,你可以發佈它的聲明嗎? sizeof將不會對你有任何幫助,除非你向我展示Enc_Key_T –

回答

2

簡答:一般來說,你不能做到這一點。

長答案: 你缺少的是結構,你不能保證Enc_Key_T可以通過簡單地寫入內存內容來進行序列化。另外,即使它只是原始的隨機數據,也沒有已知的長度。

另外,不能保證庫沒有自己的狀態,綁定到生成的密鑰。

代碼問題:

寫入時,你的數據沒有已知的長度。寫入的數據是一個指針,然後是一些僞造的東西。

讀取時,不需要輔助緩衝區;此外,fread返回讀取的字節數,而不是指向數據的指針。因此,而不是:

buffer = (char *) malloc (sizeof(char)*lSize); 
if(buffer == NULL) 
    memError(); 

sec_key = (void *) fread(buffer, 1, lSize, pFile); 

你可以寫:

sec_key = (void *) malloc (lSize); 
if(sec_key == NULL) 
    memError(); 

if (0 == fread(sec_key, 1, lSize, pFile)) { 
    // error 
} 
+0

另外,他不知道要寫多少字節。正如你所指出的那樣,也不保證他寫了任何有意義的東西 - 它可能只是當他再次運行程序時不會存在的東西的地址。 –

+0

@DavidSchwartz哦。我錯過了寫作部分也是錯誤的。根本沒有已知的長度。 – Lyth

0

我會假設你要集中調試這個應用程序,你可以投資1小時建立這些我建議包裝。

正如你只要你不知道的底層結構,這圖書館是你必須做以下一個黑盒子:

void generate_KeysEx(...){ 
#if DEBUG 
    // return dummy keys 
#else 
    // call this API 
#endif 
} 

void EncryptEx(...){ 
#if DEBUG 
    // return cipher same as plain text 
#else 
    // call this library API 
#endif 
} 
0

從在評論中討論它聽起來不像這是可能的而不捕獲庫中的結構,這將需要重大的代碼更改。

我發現的一個非常奇怪的解決方案是改變一些關鍵的生成參數,這大大減少了運行時間。