2017-02-23 77 views
1

我想使用ECC專用密鑰進行加密,因爲相互驗證。 但我無法在wolfcrypt(wolfSSL)或micro-ecc庫中找到方法(或函數)。是否可以使用ECC私鑰進行加密?

可以使用(ECC)私鑰進行加密嗎? 如果是這樣,我該怎麼做?

+0

如果您使用私鑰加密郵件,它將破壞加密的目的:) – StoryTeller

+1

@StoryTeller這是對密碼簽名或類似事物所做的事情,似乎是對於「相互驗證」而言的合理解決方案,如問題中所述 – Ctx

+0

@Ctx - 好吧,我完全錯過了認證部分,而是專注於加密。當然,人們應該用私鑰對*消息進行簽名,並使用公共密鑰進行加密。最好是爲每個目的使用不同的一對鑰匙。 – StoryTeller

回答

2

爲解決最初的問題「是否可以使用ECC私鑰進行加密?」

通常用戶維護私鑰並共享其公鑰。公鑰與數字密鑰在數學上糾纏在一起,因此用公鑰加密的消息可以用私鑰解密。通過這種方式,私鑰仍然是私密的!不建議使用私鑰進行加密。如果您能證明您希望通過一切手段這樣做的理由,請解釋一下。很高興聽到你的推理。但如果你正在學習,只是不確定,請避免做你所問的事。

爲了解決相互認證的私鑰加密聲明......我不確定這將如何幫助提供相互認證,我真的好奇@comomind在那裏談論什麼。這是一個關於SSL/TLS如何能夠解決相互認證的問題鏈接: (https://www.codeproject.com/Articles/326574/An-Introduction-to-Mutual-SSL-Authentication

對於那些wolfCrypt關注的問題,在wolfSSL的wolfCrypt庫的方法(或功能)的第二部分:

wc_ecc_encrypt 

這裏是從手動描述此API和參數的部分: (https://www.wolfssl.com/wolfSSL/Docs-wolfssl-manual-18-14-wolfcrypt-api-ecc.html

wc_ecc_encrypt

梗概:

包括標頭:wolfssl/wolfcrypt/ecc.h

INT wc_ecc_encrypt(ecc_key *的privKey,ecc_key * PUBKEY,常量字節* MSG, word32 msgSz,字節*總分,word32 * outSz ,ecEncCtx * ctx);

描述:該函數將來自msg 的給定輸入消息加密輸出。該函數將一個可選的ctx對象作爲參數。當提供 時,加密基於ecEncCtx的encAlgo, kdfAlgo和macAlgo進行。如果未提供ctx,則處理使用默認算法ecAES_128_CBC,ecHKDF_SHA256和 ecHMAC_SHA256完成 。

此函數要求根據ctx指定的加密類型 填充消息。

返回值:0:返回在成功地加密該輸入 消息BAD_FUNC_ARG:返回如果的privKey,PUBKEY,味精,msgSz,out或 outSz是NULL,或CTX對象指定不支持的加密 類型BAD_ENC_STATE_E:返回如果給出的ctx對象處於不適合加密的狀態 BUFFER_E:如果 提供的輸出緩衝區太小而無法存儲加密的密文 則返回MEMORY_E:如果爲 共享密鑰分配內存時出錯,則返回

參數:privKey - 指向包含 專用密鑰的ecc_key對象用於加密pubKey - 指向ecc_key的指針 包含對等體的公鑰的對象 傳達msg-指向緩衝區的指針,用於存放要加密的消息 msgSz - 緩衝區加密 - 指向 緩衝區的指針,用於存儲加密的密文outSz - 指向包含輸出緩衝區中可用大小的字的指針。一旦 成功加密消息,保存寫入 到輸出緩衝器CTX字節數 - 可選:指針到一個ecEncCtx對象 指定不同的加密算法使用

實施例:

byte msg[] = { /* initialize with msg to encrypt. Ensure 
padded to block size */ }; 
byte out[sizeof(msg)]; word32 outSz = sizeof(out); 
int ret; 
ecc_key cli, serv; // initialize cli with 
private key // initialize serv with received public key 

ecEncCtx* cliCtx, servCtx; // initialize cliCtx and servCtx // 
exchange salts 

ret = wc_ecc_encrypt(&cli, &serv, msg, sizeof(msg), out, &outSz, 
cliCtx); 

if(ret != 0) { // error encrypting message } 

另請參見:wc_ecc_decrypt

注意此API既需要公開和私鑰,其中公鑰來自對等體,私鑰是您自己的私鑰。該API然後將使用ECDH生成共享密鑰。共享密鑰是應該用於加密和解密的。您正在嘗試與之通話的一方還將使用您的公鑰和私鑰生成他自己的共享密鑰。任何一方都不會通過電報發送共享密鑰。查看更多共享的祕密,這裏的主題:(https://crypto.stackexchange.com/questions/21169/how-does-ecdh-arrive-on-a-shared-secret

測試用例:https://github.com/wolfSSL/wolfssl/blob/master/wolfcrypt/test/test.c#L8701

#ifdef HAVE_ECC_ENCRYPT 

int ecc_encrypt_test(void) 
{ 
    WC_RNG rng; 
    int  ret; 
    ecc_key userA, userB; 
    byte msg[48]; 
    byte plain[48]; 
    byte out[80]; 
    word32 outSz = sizeof(out); 
    word32 plainSz = sizeof(plain); 
    int  i; 

    ret = wc_InitRng(&rng); 
    if (ret != 0) 
     return -3001; 

    wc_ecc_init(&userA); 
    wc_ecc_init(&userB); 

    ret = wc_ecc_make_key(&rng, 32, &userA); 
    ret += wc_ecc_make_key(&rng, 32, &userB); 

    if (ret != 0) 
     return -3002; 

    for (i = 0; i < 48; i++) 
     msg[i] = i; 

    /* encrypt msg to send to userB */ 
    ret = wc_ecc_encrypt(&userA, &userB, msg, sizeof(msg), out, &outSz, NULL); 
    if (ret != 0) 
     return -3003; 

    /* userB decrypt the message received from userA */ 
    ret = wc_ecc_decrypt(&userB, &userA, out, outSz, plain, &plainSz, NULL); 
    if (ret != 0) 
     return -3004; 

    if (XMEMCMP(plain, msg, sizeof(msg)) != 0) 
     return -3005; 


    { /* let's verify message exchange works, A is client, B is server */ 
     ecEncCtx* cliCtx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng); 
     ecEncCtx* srvCtx = wc_ecc_ctx_new(REQ_RESP_SERVER, &rng); 

     byte cliSalt[EXCHANGE_SALT_SZ]; 
     byte srvSalt[EXCHANGE_SALT_SZ]; 
     const byte* tmpSalt; 

     if (cliCtx == NULL || srvCtx == NULL) 
      return -3006; 

     /* get salt to send to peer */ 
     tmpSalt = wc_ecc_ctx_get_own_salt(cliCtx); 
     if (tmpSalt == NULL) 
      return -3007; 
     XMEMCPY(cliSalt, tmpSalt, EXCHANGE_SALT_SZ); 

     tmpSalt = wc_ecc_ctx_get_own_salt(srvCtx); 
     if (tmpSalt == NULL) 
      return -3007; 
     XMEMCPY(srvSalt, tmpSalt, EXCHANGE_SALT_SZ); 

     /* in actual use, we'd get the peer's salt over the transport */ 
     ret = wc_ecc_ctx_set_peer_salt(cliCtx, srvSalt); 
     ret += wc_ecc_ctx_set_peer_salt(srvCtx, cliSalt); 

     ret += wc_ecc_ctx_set_info(cliCtx, (byte*)"wolfSSL MSGE", 11); 
     ret += wc_ecc_ctx_set_info(srvCtx, (byte*)"wolfSSL MSGE", 11); 

     if (ret != 0) 
      return -3008; 

     /* get encrypted msg (request) to send to B */ 
     outSz = sizeof(out); 
     ret = wc_ecc_encrypt(&userA, &userB, msg, sizeof(msg), out, &outSz,cliCtx); 
     if (ret != 0) 
      return -3009; 

     /* B decrypts msg (request) from A */ 
     plainSz = sizeof(plain); 
     ret = wc_ecc_decrypt(&userB, &userA, out, outSz, plain, &plainSz, srvCtx); 
     if (ret != 0) 
      return -3010; 

     if (XMEMCMP(plain, msg, sizeof(msg)) != 0) 
      return -3011; 

     { 
      /* msg2 (response) from B to A */ 
      byte msg2[48]; 
      byte plain2[48]; 
      byte out2[80]; 
      word32 outSz2 = sizeof(out2); 
      word32 plainSz2 = sizeof(plain2); 

      for (i = 0; i < 48; i++) 
       msg2[i] = i+48; 

      /* get encrypted msg (response) to send to B */ 
      ret = wc_ecc_encrypt(&userB, &userA, msg2, sizeof(msg2), out2, 
           &outSz2, srvCtx); 
      if (ret != 0) 
       return -3012; 

      /* A decrypts msg (response) from B */ 
      ret = wc_ecc_decrypt(&userA, &userB, out2, outSz2, plain2, &plainSz2, 
          cliCtx); 
      if (ret != 0) 
       return -3013; 

      if (XMEMCMP(plain2, msg2, sizeof(msg2)) != 0) 
       return -3014; 
     } 

     /* cleanup */ 
     wc_ecc_ctx_free(srvCtx); 
     wc_ecc_ctx_free(cliCtx); 
    } 

    /* cleanup */ 
    wc_ecc_free(&userB); 
    wc_ecc_free(&userA); 
    wc_FreeRng(&rng); 

    return 0; 
} 

#endif /* HAVE_ECC_ENCRYPT */ 
2

我想使用由於相互身份驗證的加密的ECC私鑰。但我無法在wolfcrypt(wolfSSL)或micro-ecc庫中找到方法(或函數)。

定義和操作存在細微差別。 「用私鑰加密」是不是有效的加密操作。通常你想要的是帶恢復的簽名方案

當像OpenSSL或wolfSSL這樣的庫簽名消息時,它們通常會應用格式化函數,然後將結果消息視爲密文實例。然後,私鑰用於解密密文。


難道是正常用於加密的(ECC)私人密鑰?

可能不是,但我們需要聽到更多關於你想要做的事情。

如果您需要設計方案的幫助,那麼您應該訪問Cryptography Stack ExchangeInformation Security Stack Exchange


[如果確定]如果是這樣,我怎麼能這樣做呢?

同樣,這取決於你在做什麼。在某些時候,您需要將格式化的消息視爲密文的一個實例。我不能再說了,因爲我不熟悉wolfSSL。

您可能也有興趣在Crypto.SE上Should we sign-then-encrypt, or encrypt-then-sign?。它似乎與你正在做的事情有一些相似之處。

相關問題