2017-08-29 19 views
-3

公開鍵(PK)と署名(crypto ++ライブラリによって生成)をsqliteデータベースに格納しようとしています。私はまず、次のようにキーをコード化しました:データベースに公開鍵を格納する(C++)

pk[node].BEREncode(CryptoPP::StringSink(pkstring).Ref()); 

これらをデータベースに格納します。しかし、PKと署名には特殊文字が含まれているため、正しくデータベースに格納されません。

char * PK = (char*) malloc (BC.trans[l].PK.length()+1); //use malloc to manually manage the memory 
std::strcpy(PK,BC.trans[l].PK.c_str()); 
char *zSQL = sqlite3_mprintf("INSERT INTO BC (PK VALUES ('%q');", PK); 
rc = sqlite3_exec(db, zSQL, callback, (void*)data, &zErrMsg);// executes the command in sqlite and returns the status (whether stroing was successful or not. 
free(PK); 

文字列が文字にコピーする必要があり、そして問題は、charにコンテンツをコピーすることで、正確にここに起こる:私は何を保存するために使用することです。私はその文字列に特殊文字が含まれていると思う。ハッシュについては、私は同じフォローを持っていますが、それは完璧に正常に動作します。 PKと署名の場合のみ。私はmemcpyとstrncpyも使用しました。これには何も作用せず、キーはデータベースに正しく保存されません。

どのような考えですか?

私は完全なコードで更新しました。今私はPKを保存することができ、そのように見えるが、私はレコードの束を削除するデータベースを要求すると、何も起こりません。つまり何かが間違っていることを意味します。ここで


はコードです:

int Network_Nodes =10; 
int Block_Size=10;   
int BC_lenght=0;   
int Fin_BC_size =50; 

std::vector<CryptoPP::RSA::PrivateKey> prk; 
std::vector<CryptoPP::RSA::PublicKey> pk; 
std::vector<std::string> prev_t;   
struct Block { 

    std::string block_hash; 

    std::string block_num; 

    struct transactions { 
     std::string TransactionID; 
     std::string previousTransactionID; 
     std::string PK; 
     std::string Sign; 
    }; 
    std::vector<transactions> trans; 
} BC; 

int generatekey() 
{  
    for (int i=0;i<Network_Nodes;i++)  
    { 
     CryptoPP::AutoSeededRandomPool rng; 
     CryptoPP::InvertibleRSAFunction param; 
     param.GenerateRandomWithKeySize(rng,3072); 
     CryptoPP::RSA::PrivateKey privatekey(param); 
     CryptoPP::RSA::PublicKey publickey (param); 
     prk.push_back(privatekey); 
     pk.push_back(publickey); 
    } 
    return 0; 
} 
/////////////////////////////////////////////////////////////// 


void initialization() 
{  
    for (int i=0;i<=Network_Nodes;i++) 
    { 
     prev_t.push_back("NULL"); 
    }   

    //Creating database 
    sqlite3 *db; 
     char *zErrMsg = 0; 
     int rc; 
     char *sql; 
     const char* data = "Callback function called"; 

     /* Open database */ 
     rc = sqlite3_open("RemovableBC.db", &db); 
     if(rc) { 
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); 
        return; 
       } else { 
      //  fprintf(stdout, "Opened database successfully\n"); 
       } 


     sql = "DROP TABLE BC"; 
     rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); 

     /* Create a table in the data base to be used for storing data. Create SQL statement */ 
      sql = "CREATE TABLE BC(" \ 
       "T_ID   TEXT ," \ 
       "P_T_ID   TEXT ," \ 
       "PK   BLOB ," \ 
       "Signature  BLOB  ," \ 
       "Block_ID   TEXT  );"; 

      /* Execute SQL statement */ 
      rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); 
      if(rc != SQLITE_OK){ 
        fprintf(stderr, "SQL error: %s\n", zErrMsg); 
         sqlite3_free(zErrMsg); 
        } else { 
      //   fprintf(stdout, "Table created successfully\n"); 
        } 
      sqlite3_close(db);  
} 
///////////////////////////////////////////////////////////////////////////////////////////////////////////// 
void fill_the_block(std::string block_content) 
{   
     const char* data = "Callback function called"; 
     SHA256 hash; 
     string digest; 
     sqlite3 *db=NULL; 
     char *sql; 
     char *zErrMsg = 0; 
     int rc; 
     char sqlStr[2000]; 
     /* Open database */ 
     rc = sqlite3_open("RemovableBC.db", &db); 
      if(rc) { 
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); 
        return; 
        } else { 
        // fprintf(stdout, "Opened database successfully\n"); 
       } 
     StringSource s(block_content, true, new HashFilter(hash, new HexEncoder(new StringSink(digest)))); 
     BC.block_hash=digest; 
     for (int l=0 ; l<Block_Size ; l++) 
       { 
            char *begin = sqlStr; 
            char *end = begin + sizeof(sqlStr); 
            std::fill(begin, end, 0); 
            char *zSQL = sqlite3_mprintf("INSERT INTO BC (T_ID , P_T_ID , PK , Signature , Block_ID) VALUES ('%q','%q','%q','%q','%q');", BC.trans[l].TransactionID.c_str() ,BC.trans[l].previousTransactionID.c_str() ,BC.trans[l].PK.c_str() ,BC.trans[l].Sign.c_str(),BC.block_hash.c_str()); 

            rc = sqlite3_exec(db, zSQL, callback, (void*)data, &zErrMsg); 

            sqlite3_free(zSQL); 
            if(rc != SQLITE_OK) { 
             fprintf(stderr, "SQL error in populating : %s\n", zErrMsg); 
             sqlite3_free(zErrMsg); 
             } else {  
       } 


           sqlite3_close(db);   //We close the connection we have with the database 
} 
/////////////////////////////////////////////////////////////////////////// 
void populate_bc() 
{   
     int generated_blocks=0; 
     int stored_trans_in_block=0;     
     int node=0;            
     std::string block_content,trans_cont;       
     std::string pkstring; 
     std::string signature; 
     std::string mes ="This message is going to be singed"; 


     while (BC_lenght <=Fin_BC_size) 
      { 
      if (generated_blocks <= 10){ 
       if (node >= Network_Nodes) 
         { 
          node=0; //cout << "step 4" <<endl; 
         } 
       if (stored_trans_in_block >= Block_Size) 
         { 
         cout << "block size is "<< BC_lenght<<endl; 
         fill_the_block(block_content); 
         BC_lenght++; 
         block_content.clear(); 
         stored_trans_in_block=0; 


         for(int o=0; o<stored_trans_in_block;o++) 
               { 
                BC.trans[o] = {}; 
               } 
               BC.trans = {}; 
               BC ={}; 

         } 
       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
       if (prev_t[node]=="NULL") 
         { 
          // cout << "We are populating on behafe of "<< node<< endl; 
          trans_cont=""; 
          BC.trans.push_back(Block::transactions()); 

          BC.trans[stored_trans_in_block].previousTransactionID ="NULL"; 
         // byte public_key[] = pk[node]; 

          std::string endoced_pub; 
          Base64Encoder pubKeySink(new StringSink(endoced_pub)); 
          pk[node].DEREncode(pubKeySink); 
         pk[node].BEREncode(CryptoPP::StringSink(pkstring).Ref()); 
          BC.trans[stored_trans_in_block].PK=endoced_pub; 

          CryptoPP::AutoSeededRandomPool rng; 
          CryptoPP::RSASSA_PKCS1v15_SHA_Signer signer(prk[node]); 
          CryptoPP::StringSource ss1(mes, true, 
                new CryptoPP::SignerFilter(rng, signer, 
                       new CryptoPP::StringSink(signature) 
                 ) // SignerFilter 
             ); // StringSource 
         // cout << "step 1" <<endl; 
          BC.trans[stored_trans_in_block].Sign=signature; 
          trans_cont = "NULL" + pkstring + signature; 
          SHA256 hash; 
          string digest; 
          StringSource s(trans_cont, true, new HashFilter(hash, new HexEncoder(new StringSink(digest)))); 
         // cout << "step 2" <<endl; 
          BC.trans[stored_trans_in_block].TransactionID=digest; 
          prev_t[node] =digest;      // This keeps the previous transaction of each node in an array and thus we can later use to populate the BC 
          block_content+=digest;     // This is to calculate the ID of the block which is the hash of all TIDs (hash of hash of all trnasctions) 
          node++; 
          stored_trans_in_block++; 
         // cout << "step 3" <<endl; 
         }//end of if (prev_t[node]=="NULL") 
        else 
         {// cout << "step 6" <<endl; 
            trans_cont=""; 
            BC.trans.push_back(Block::transactions()); 

            BC.trans[stored_trans_in_block].previousTransactionID =prev_t[node]; 
           std::string endoced_pub; 
                  Base64Encoder pubKeySink(new StringSink(endoced_pub)); 
                  pk[node].DEREncode(pubKeySink); 
                //  pubKeySink.MessageEnd(); 

           // pk[node].BEREncode(CryptoPP::StringSink(pkstring).Ref()); 
            BC.trans[stored_trans_in_block].PK = endoced_pub; 
         //  BC.trans[stored_trans_in_block].PK= pk[node]; 
            CryptoPP::AutoSeededRandomPool rng; 
            CryptoPP::RSASSA_PKCS1v15_SHA_Signer signer(prk[node]); 
            CryptoPP::StringSource ss1(mes, true, 
                  new CryptoPP::SignerFilter(rng, signer, 
                         new CryptoPP::StringSink(signature) 
                   ) // SignerFilter 
               ); // StringSource 
            BC.trans[stored_trans_in_block].Sign=signature; 
            trans_cont = prev_t[node] + pkstring + signature; 
            SHA256 hash; 
            string digest; 
            StringSource s(trans_cont, true, new HashFilter(hash, new HexEncoder(new StringSink(digest)))); 
            BC.trans[stored_trans_in_block].TransactionID=digest; 
            prev_t[node] =digest;      
            block_content+=digest;      
            node++; 
            stored_trans_in_block++; 
         } 

       generated_blocks++; 
      } 


     else 
     { 

      generated_blocks=0; 

     } 
      } 

} 
////////////////////////////////////////////////////////////////////////////////////// 

void remove_node (int i) 
{ 


     std::string search_node;     //This is the ID of the transaction that we need to search for in the BC, 
     sqlite3 *db; 

     std::string endoced_pub; 
     Base64Encoder pubKeySink(new StringSink(endoced_pub)); 
     pk[i].DEREncode(pubKeySink); 
    // pubKeySink.MessageEnd(); 
     char *sql; 
     int rc; 
     char *zErrMsg = 0; 

     const char* data = "Callback function called"; 
     /* Open database */ 
      rc = sqlite3_open("RemovableBC.db", &db); 

      if(rc) { 
       fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); 
       return; 
      } else { 
      // fprintf(stderr, "Opened database successfully\n"); 
      } 
     /* Execute SQL statement */ 
     // char *zSQL = sqlite3_mprintf("DELETE from BC"); 


      char * Search_NODE = (char*) malloc (endoced_pub.length()+1); 
      std::strcpy(Search_NODE,endoced_pub.c_str()); 
          std::strcpy(Search_NODE,search_node.c_str()); 

     // char *zSQL = sqlite3_mprintf("DELETE from BC where PK = '%q';", Search_NODE); 

        char *zSQL = sqlite3_mprintf("UPDATE BC set Signature = null and PK = null where PK = '%q';", endoced_pub.c_str()); 
        rc = sqlite3_exec(db, zSQL, callback, (void*)data, &zErrMsg); 

cout<< endoced_pub.c_str()<<endl; 


      if(rc != SQLITE_OK) { 
       fprintf(stderr, "SQL error in removing a record: %s\n", zErrMsg); 
       sqlite3_free(zErrMsg); 
      } else { 
      // fprintf(stdout, "Operation done successfully\n"); 
      } 
      sqlite3_close(db); 
      free(Search_NODE); 
} 

///////////////////////////////////////////////////////////////////////////////////////////////////////////// 
///////////////////////////////////////////////////////////////////////////////////////////////////////////// 
int main() { 

    auto initial = std::chrono::high_resolution_clock::now(); 
    generatekey(); 
    cout << "Keys are generated for " <<Network_Nodes << " nodes..." << endl; 

    clock_t begin_block_pup = clock(); 
    initialization(); 
    cout << "Initializing previous transaction vector..." << endl; 

    //clock_t ti =clock(); 
    //double time = double (ti)/CLOCKS_PER_SEC; 


    clock_t ti2 =clock(); 
     double time2 = double (ti2)/CLOCKS_PER_SEC; 
    //cout << "second time is " << done <<endl; 
    populate_bc(); 
    cout << "BC has been populated with "<< BC_lenght <<" blocks..." << endl; 
    return 0; 
} 
+1

質問を編集するには[mcve]を含める必要があります。つまり、 'data'や' callback'のようなものは定義されていません。 'sqlite3_exec'は何を返しますか? 'malloc'とは何ですか? 'std :: string'を使ってみましょう。 – Tas

+0

INSERT INTO BC(PK VALUES( '%q') - (終了しないで) –

+0

' malloc'はなぜですか? – Blacktempel

答えて

1

お使いのシステムに問題、あなたはどちらかBLOBとしてPKデータを保存したり、7ビットのASCIIにそれをエンコードする必要があるということです。

Sqliteには多少の国際化対応があり、文字列として保存された生のバイナリデータを別の形式に変換することがあります。 (例えば、UTF-8変換)

したがって、この質問SO : sqlite blobに対する回答のよう

又は第7ビットASCII(例えばB64エンコード)にバイトを変換するブロブを使用するか、データを格納します。

結果をb64デコードする必要があることを思い出してください。

関連する問題