跳到主要内容

使用RSA私钥进行编码解码(C/C++)

编码

  1. 调用OH_CryptoAsymKeyGenerator_CreateOH_CryptoAsymKeyGenerator_Generate,生成RSA密钥类型为RSA2048、素数个数为2的非对称密钥对(keyPair)。keyPair对象中包括公钥PubKey、私钥PriKey。

    如何生成RSA非对称密钥对,开发者可参考下文示例,并结合非对称密钥生成和转换规格:RSA随机生成非对称密钥对(C/C++)理解。参考文档与当前示例可能存在入参差异,请在阅读时注意区分。

  2. 调用OH_CryptoPrivKeyEncodingParams_Create创建参数对象(params),并通过OH_CryptoPrivKeyEncodingParams_SetParam设置加密算法和密码。

  3. 调用OH_CryptoPrivKey_Encode,传入参数CRYPTO_PEM/CRYPTO_DER、PKCS1/PKCS8和参数对象(params)生成编码后的私钥字符串。

解码

  1. 调用OH_CryptoAsymKeyGenerator_Create生成RSA非对称密钥生成器keyGen。

    如何生成RSA非对称密钥对,开发者可参考下文示例,并结合非对称密钥生成和转换规格:RSA

  2. 调用OH_CryptoAsymKeyGenerator_SetPassword,传入编码后的私钥字符串与编码口令。

  3. 调用OH_CryptoAsymKeyGenerator_Convert,传入参数CRYPTO_PEM和编码后的私钥字符串,返回RSA密钥对。

  • 编码示例:
#include "CryptoArchitectureKit/crypto_architecture_kit.h"
#include "file.h"

static OH_Crypto_ErrCode SetParams(OH_CryptoPrivKeyEncodingParams *params)
{
Crypto_DataBlob password = {(uint8_t *)"1234567890", 10};
Crypto_DataBlob cipher = {(uint8_t *)"AES-128-CBC", 11};
OH_Crypto_ErrCode ret = OH_CryptoPrivKeyEncodingParams_SetParam(params,
CRYPTO_PRIVATE_KEY_ENCODING_PASSWORD_STR, &password);
if (ret != CRYPTO_SUCCESS) {
return ret;
}
ret = OH_CryptoPrivKeyEncodingParams_SetParam(params, CRYPTO_PRIVATE_KEY_ENCODING_SYMMETRIC_CIPHER_STR, &cipher);
if (ret != CRYPTO_SUCCESS) {
return ret;
}
return CRYPTO_SUCCESS;
}

OH_Crypto_ErrCode doTestPriKeyPkcs1Encoded()
{
OH_CryptoAsymKeyGenerator *keyGen = nullptr;
OH_Crypto_ErrCode ret = OH_CryptoAsymKeyGenerator_Create("RSA2048", &keyGen);
if (ret != CRYPTO_SUCCESS) {
return ret;
}
OH_CryptoKeyPair *keyPair = nullptr;
ret = OH_CryptoAsymKeyGenerator_Generate(keyGen, &keyPair);
if (ret != CRYPTO_SUCCESS) {
OH_CryptoAsymKeyGenerator_Destroy(keyGen);
return ret;
}

OH_CryptoPrivKey *privKey = OH_CryptoKeyPair_GetPrivKey(keyPair);
if (privKey == nullptr) {
OH_CryptoKeyPair_Destroy(keyPair);
OH_CryptoAsymKeyGenerator_Destroy(keyGen);
return CRYPTO_OPERTION_ERROR;
}
OH_CryptoPrivKeyEncodingParams *params = nullptr;
ret = OH_CryptoPrivKeyEncodingParams_Create(&params);
if (ret != CRYPTO_SUCCESS) {
OH_CryptoKeyPair_Destroy(keyPair);
OH_CryptoAsymKeyGenerator_Destroy(keyGen);
return ret;
}
ret = SetParams(params);
if (ret != CRYPTO_SUCCESS) {
OH_CryptoPrivKeyEncodingParams_Destroy(params);
OH_CryptoKeyPair_Destroy(keyPair);
OH_CryptoAsymKeyGenerator_Destroy(keyGen);
return ret;
}

Crypto_DataBlob pemData = {0};
ret = OH_CryptoPrivKey_Encode(privKey, CRYPTO_PEM, "PKCS1", params, &pemData);
if (ret != CRYPTO_SUCCESS) {
OH_CryptoPrivKeyEncodingParams_Destroy(params);
OH_CryptoKeyPair_Destroy(keyPair);
OH_CryptoAsymKeyGenerator_Destroy(keyGen);
return ret;
}
OH_Crypto_FreeDataBlob(&pemData);
OH_CryptoPrivKeyEncodingParams_Destroy(params);
OH_CryptoKeyPair_Destroy(keyPair);
OH_CryptoAsymKeyGenerator_Destroy(keyGen);
return ret;
}
  • 解码示例:

    #include "CryptoArchitectureKit/crypto_architecture_kit.h"
    #include <string>
    #include "file.h"

    OH_Crypto_ErrCode doTestPriKeyPkcs1Decoded()
    {
    std::string priKeyPkcs1EncodingStr =
    "-----BEGIN RSA PRIVATE KEY-----\n"
    "Proc-Type: 4,ENCRYPTED\n"
    "DEK-Info: AES-128-CBC,815A066131BF05CF87CE610A59CC69AE\n\n"
    "7Jd0vmOmYGFZ2yRY8fqRl3+6rQlFtNcMILvcb5KWHDSrxA0ULmJE7CW0DSRikHoA\n"
    "t0KgafhYXeQXh0dRy9lvVRAFSLHCLJVjchx90V7ZSivBFEq7+iTozVp4AlbgYsJP\n"
    "vx/1sfZD2WAcyMJ7IDmJyft7xnpVSXsyWGTT4f3eaHJIh1dqjwrso7ucAW0FK6rp\n"
    "/TONyOoXNfXtRbVtxNyCWBxt4HCSclDZFvS9y8fz9ZwmCUV7jei/YdzyQI2wnE13\n"
    "W8cKlpzRFL6BWi8XPrUtAw5MWeHBAPUgPWMfcmiaeyi5BJFhQCrHLi+Gj4EEJvp7\n"
    "mP5cbnQAx6+paV5z9m71SKrI/WSc4ixsYYdVmlL/qwAK9YliFfoPl030YJWW6rFf\n"
    "T7J9BUlHGUJ0RB2lURNNLakM+UZRkeE9TByzCzgTxuQtyv5Lwsh2mAk3ia5x0kUO\n"
    "LHg3Eoabhdh+YZA5hHaxnpF7VjspB78E0F9Btq+A41rSJ6zDOdToHey4MJ2nxdey\n"
    "Z3bi81TZ6Fp4IuROrvZ2B/Xl3uNKR7n+AHRKnaAO87ywzyltvjwSh2y3xhJueiRs\n"
    "BiYkyL3/fnocD3pexTdN6h3JgQGgO5GV8zw/NrxA85mw8o9im0HreuFObmNj36T9\n"
    "k5N+R/QIXW83cIQOLaWK1ThYcluytf0tDRiMoKqULiaA6HvDMigExLxuhCtnoF8I\n"
    "iOLN1cPdEVQjzwDHLqXP2DbWW1z9iRepLZlEm1hLRLEmOrTGKezYupVv306SSa6J\n"
    "OA55lAeXMbyjFaYCr54HWrpt4NwNBX1efMUURc+1LcHpzFrBTTLbfjIyq6as49pH\n"
    "-----END RSA PRIVATE KEY-----\n";

    OH_CryptoAsymKeyGenerator *keyGen = nullptr;
    OH_Crypto_ErrCode ret = OH_CryptoAsymKeyGenerator_Create("RSA2048", &keyGen);
    if (ret != CRYPTO_SUCCESS) {
    return ret;
    }

    OH_CryptoKeyPair *dupKeyPair = nullptr;
    Crypto_DataBlob priKeyPkcs1EncodingData = {};
    priKeyPkcs1EncodingData.data = reinterpret_cast<uint8_t *>(const_cast<char *>(priKeyPkcs1EncodingStr.c_str()));
    priKeyPkcs1EncodingData.len = strlen(priKeyPkcs1EncodingStr.c_str());
    std::string password = "123456";
    ret = OH_CryptoAsymKeyGenerator_SetPassword(keyGen, reinterpret_cast<const unsigned char *>(password.c_str()),
    password.size());
    if (ret != CRYPTO_SUCCESS) {
    OH_CryptoAsymKeyGenerator_Destroy(keyGen);
    return ret;
    }
    ret = OH_CryptoAsymKeyGenerator_Convert(keyGen, CRYPTO_PEM, nullptr, &priKeyPkcs1EncodingData, &dupKeyPair);
    if (ret != CRYPTO_SUCCESS) {
    OH_CryptoAsymKeyGenerator_Destroy(keyGen);
    return ret;
    }
    OH_CryptoKeyPair_Destroy(dupKeyPair);
    OH_CryptoAsymKeyGenerator_Destroy(keyGen);
    return ret;
    }