1# 使用RSA私钥进行编码解码(C/C++) 2 3<!--Kit: Crypto Architecture Kit--> 4<!--Subsystem: Security--> 5<!--Owner: @zxz--3--> 6<!--Designer: @lanming--> 7<!--Tester: @PAFT--> 8<!--Adviser: @zengyawen--> 9 10**编码** 11 121. 调用[OH_CryptoAsymKeyGenerator_Create](../../reference/apis-crypto-architecture-kit/capi-crypto-asym-key-h.md#oh_cryptoasymkeygenerator_create)、[OH_CryptoAsymKeyGenerator_Generate](../../reference/apis-crypto-architecture-kit/capi-crypto-asym-key-h.md#oh_cryptoasymkeygenerator_generate),生成RSA密钥类型为RSA2048、素数个数为2的非对称密钥对(keyPair)。keyPair对象中包括公钥PubKey、私钥PriKey。 13 14 如何生成RSA非对称密钥对,开发者可参考下文示例,并结合[非对称密钥生成和转换规格:RSA](crypto-asym-key-generation-conversion-spec.md#rsa)和[随机生成非对称密钥对(C/C++)](crypto-generate-asym-key-pair-randomly-ndk.md)理解。参考文档与当前示例可能存在入参差异,请在阅读时注意区分。 15 162. 调用[OH_CryptoPrivKeyEncodingParams_Create](../../reference/apis-crypto-architecture-kit/capi-crypto-asym-key-h.md#oh_cryptoprivkeyencodingparams_create)创建参数对象(params),并通过[OH_CryptoPrivKeyEncodingParams_SetParam](../../reference/apis-crypto-architecture-kit/capi-crypto-asym-key-h.md#oh_cryptoprivkeyencodingparams_setparam)设置加密算法和密码。 17 183. 调用[OH_CryptoPrivKey_Encode](../../reference/apis-crypto-architecture-kit/capi-crypto-asym-key-h.md#oh_cryptoprivkey_encode),传入参数CRYPTO_PEM/CRYPTO_DER、PKCS1/PCKS8和参数对象(params)生成编码后的私钥字符串。 19 20**解码** 21 221. 调用[OH_CryptoAsymKeyGenerator_Create](../../reference/apis-crypto-architecture-kit/capi-crypto-asym-key-h.md#oh_cryptoasymkeygenerator_create)生成RSA非对称密钥生成器keyGen。 23 24 如何生成RSA非对称密钥对,开发者可参考下文示例,并结合[非对称密钥生成和转换规格:RSA](crypto-asym-key-generation-conversion-spec.md#rsa)。 25 262. 调用[OH_CryptoAsymKeyGenerator_SetPassword],传入编码后的私钥字符串与编码口令。 27 283. 调用[OH_CryptoAsymKeyGenerator_Convert],传入参数CRYPTO_PEM和编码后的私钥字符串,返回RSA密钥对。 29 30- 编码示例: 31```C++ 32#include "CryptoArchitectureKit/crypto_architecture_kit.h" 33 34static OH_Crypto_ErrCode doTestPriKeyPkcs1Encoded() 35{ 36 OH_CryptoAsymKeyGenerator *keyGen = nullptr; 37 OH_Crypto_ErrCode ret = OH_CryptoAsymKeyGenerator_Create("RSA2048", &keyGen); 38 if (ret != CRYPTO_SUCCESS) { 39 return ret; 40 } 41 OH_CryptoKeyPair *keyPair = nullptr; 42 ret = OH_CryptoAsymKeyGenerator_Generate(keyGen, &keyPair); 43 if (ret != CRYPTO_SUCCESS) { 44 OH_CryptoAsymKeyGenerator_Destroy(keyGen); 45 return ret; 46 } 47 48 OH_CryptoPrivKey *privKey = OH_CryptoKeyPair_GetPrivKey(keyPair); 49 if (privKey == nullptr) { 50 OH_CryptoKeyPair_Destroy(keyPair); 51 OH_CryptoAsymKeyGenerator_Destroy(keyGen); 52 return CRYPTO_OPERTION_ERROR; 53 } 54 OH_CryptoPrivKeyEncodingParams *params = nullptr; 55 ret = OH_CryptoPrivKeyEncodingParams_Create(¶ms); 56 if (ret != CRYPTO_SUCCESS) { 57 OH_CryptoKeyPair_Destroy(keyPair); 58 OH_CryptoAsymKeyGenerator_Destroy(keyGen); 59 return ret; 60 } 61 62 Crypto_DataBlob password = {(uint8_t *)"1234567890", 10}; 63 Crypto_DataBlob cipher = {(uint8_t *)"AES-128-CBC", 11}; 64 ret = OH_CryptoPrivKeyEncodingParams_SetParam(params, CRYPTO_PRIVATE_KEY_ENCODING_PASSWORD_STR, &password); 65 if (ret != CRYPTO_SUCCESS) { 66 OH_CryptoPrivKeyEncodingParams_Destroy(params); 67 OH_CryptoKeyPair_Destroy(keyPair); 68 OH_CryptoAsymKeyGenerator_Destroy(keyGen); 69 return ret; 70 } 71 ret = OH_CryptoPrivKeyEncodingParams_SetParam(params, CRYPTO_PRIVATE_KEY_ENCODING_SYMMETRIC_CIPHER_STR, &cipher); 72 if (ret != CRYPTO_SUCCESS) { 73 OH_CryptoPrivKeyEncodingParams_Destroy(params); 74 OH_CryptoKeyPair_Destroy(keyPair); 75 OH_CryptoAsymKeyGenerator_Destroy(keyGen); 76 return ret; 77 } 78 79 Crypto_DataBlob pemData = {0}; 80 ret = OH_CryptoPrivKey_Encode(privKey, CRYPTO_PEM, "PKCS1", params, &pemData); 81 if (ret != CRYPTO_SUCCESS) { 82 OH_CryptoPrivKeyEncodingParams_Destroy(params); 83 OH_CryptoKeyPair_Destroy(keyPair); 84 OH_CryptoAsymKeyGenerator_Destroy(keyGen); 85 return ret; 86 } 87 OH_Crypto_FreeDataBlob(&pemData); 88 OH_CryptoPrivKeyEncodingParams_Destroy(params); 89 OH_CryptoKeyPair_Destroy(keyPair); 90 OH_CryptoAsymKeyGenerator_Destroy(keyGen); 91 return ret; 92} 93``` 94 95- 解码示例: 96```C++ 97#include "CryptoArchitectureKit/crypto_architecture_kit.h" 98#include <string> 99 100static OH_Crypto_ErrCode doTestConvertPemKeyByPromise() 101{ 102 std::string priKeyPkcs1EncodingStr = "-----BEGIN RSA PRIVATE KEY-----\n" 103 "Proc-Type: 4,ENCRYPTED\n" 104 "DEK-Info: AES-128-CBC,815A066131BF05CF87CE610A59CC69AE\n\n" 105 "7Jd0vmOmYGFZ2yRY8fqRl3+6rQlFtNcMILvcb5KWHDSrxA0ULmJE7CW0DSRikHoA\n" 106 "t0KgafhYXeQXh0dRy9lvVRAFSLHCLJVjchx90V7ZSivBFEq7+iTozVp4AlbgYsJP\n" 107 "vx/1sfZD2WAcyMJ7IDmJyft7xnpVSXsyWGTT4f3eaHJIh1dqjwrso7ucAW0FK6rp\n" 108 "/TONyOoXNfXtRbVtxNyCWBxt4HCSclDZFvS9y8fz9ZwmCUV7jei/YdzyQI2wnE13\n" 109 "W8cKlpzRFL6BWi8XPrUtAw5MWeHBAPUgPWMfcmiaeyi5BJFhQCrHLi+Gj4EEJvp7\n" 110 "mP5cbnQAx6+paV5z9m71SKrI/WSc4ixsYYdVmlL/qwAK9YliFfoPl030YJWW6rFf\n" 111 "T7J9BUlHGUJ0RB2lURNNLakM+UZRkeE9TByzCzgTxuQtyv5Lwsh2mAk3ia5x0kUO\n" 112 "LHg3Eoabhdh+YZA5hHaxnpF7VjspB78E0F9Btq+A41rSJ6zDOdToHey4MJ2nxdey\n" 113 "Z3bi81TZ6Fp4IuROrvZ2B/Xl3uNKR7n+AHRKnaAO87ywzyltvjwSh2y3xhJueiRs\n" 114 "BiYkyL3/fnocD3pexTdN6h3JgQGgO5GV8zw/NrxA85mw8o9im0HreuFObmNj36T9\n" 115 "k5N+R/QIXW83cIQOLaWK1ThYcluytf0tDRiMoKqULiaA6HvDMigExLxuhCtnoF8I\n" 116 "iOLN1cPdEVQjzwDHLqXP2DbWW1z9iRepLZlEm1hLRLEmOrTGKezYupVv306SSa6J\n" 117 "OA55lAeXMbyjFaYCr54HWrpt4NwNBX1efMUURc+1LcHpzFrBTTLbfjIyq6as49pH\n" 118 "-----END RSA PRIVATE KEY-----\n"; 119 120 OH_CryptoAsymKeyGenerator *keyGen = nullptr; 121 OH_Crypto_ErrCode ret = OH_CryptoAsymKeyGenerator_Create("RSA2048", &keyGen); 122 if (ret != CRYPTO_SUCCESS) { 123 return ret; 124 } 125 126 OH_CryptoKeyPair *dupKeyPair = nullptr; 127 Crypto_DataBlob priKeyPkcs1EncodingData = {}; 128 priKeyPkcs1EncodingData.data = reinterpret_cast<uint8_t *>(const_cast<char *>(priKeyPkcs1EncodingStr.c_str())); 129 priKeyPkcs1EncodingData.len = strlen(priKeyPkcs1EncodingStr.c_str()); 130 std::string password = "123456"; 131 ret = OH_CryptoAsymKeyGenerator_SetPassword(keyGen, reinterpret_cast<const unsigned char *>(password.c_str()), 132 password.size()); 133 if (ret != CRYPTO_SUCCESS) { 134 OH_CryptoAsymKeyGenerator_Destroy(keyGen); 135 return ret; 136 } 137 ret = OH_CryptoAsymKeyGenerator_Convert(keyGen, CRYPTO_PEM, nullptr, &priKeyPkcs1EncodingData, &dupKeyPair); 138 if (ret != CRYPTO_SUCCESS) { 139 OH_CryptoAsymKeyGenerator_Destroy(keyGen); 140 return ret; 141 } 142 OH_CryptoKeyPair_Destroy(dupKeyPair); 143 OH_CryptoAsymKeyGenerator_Destroy(keyGen); 144 return ret; 145} 146```