• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_DERPKCS1/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(&params);
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```