2017-07-27 111 views
0

我正在寫一個CNG供應商。具體來說,堅持實施NCryptExportKey API。我正嘗試從硬件密鑰管理器轉換EC密鑰(用於簽名,ECDSA256)。 h/w密鑰管理器以ASN格式提供密鑰。我提到了MSDN文檔,它提到了公鑰X和Y值(BCRYPT_ECCKEY_BLOB結構)是以big-endian格式。但在另一篇文章中,stackoverflow(Import a Public key from somewhere else to CngKey?),魔法值也似乎是big-endian格式。CNG提供程序,如何將EC密鑰轉換爲BCRYPT_ECCKEY_BLOB結構?

我的問題是:

  1. 是 '魔法' 和 '長度' 值需要在big-endian格式?

  2. 如何將大數X轉換爲大端格式?轉換每個字節?

回答

0

魔法是用來比較常數。因爲它不是一個數字,所以它不是大尾數格式的。您應該只使用常量來設置或比較值;他們不一定需要包含任何數字。

長度是一個ULONG,因爲不幸的是.NET基於小端,它無疑也存儲爲小端。通常你不在乎;只需使用ULONG來設置或檢索它。

如果您有BigInteger實例,則可以使用ToByteArray將其簡單地保存爲字節,然後顛倒字節的順序。裏面的位將保持不變。如果該值左側爲零字節(反轉後),則還需要刪除該字節。

0

爲了從組轉化爲魔,你可以很容易地做到這一點(僞代碼):

ULONG nid_to_magic_<public|private>_<ecdsa|ecdh> (EC_KEY * eckey) { 
int nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey)); 
switch(nid){ 
    case NID_X9_62_prime256v1: 
     return BCRYPT_<ECDH | ECDSA>_<PUBLIC | PRIVATE>_P256_MAGIC; 
    case NID_secp384r1: 
     return BCRYPT_<ECDH | ECDSA>_<PUBLIC | PRIVATE>_P384_MAGIC; 
    case NID_secp521r1: 
     return BCRYPT_<ECDH | ECDSA>_<PUBLIC | PRIVATE>_P521_MAGIC; 

    //And so on... 
    } 
    //Note: it seems that the magic number is more "pedantic than NID"; 
} 

你可以在大端X和Y使用BN_bn2bin()

相關問題