铜锁/Tongsuo API文档:核心函数参数详解

铜锁/Tongsuo API文档:核心函数参数详解

【免费下载链接】Tongsuo 铜锁/Tongsuo is a Modern Cryptographic Primitives and Protocols Library 【免费下载链接】Tongsuo 项目地址: https://gitcode.com/GitHub_Trending/to/Tongsuo

铜锁/Tongsuo作为一款现代密码学原语与协议库,其API设计遵循密码学工程最佳实践,提供了从基础哈希计算到复杂加密操作的完整接口。本文聚焦核心加密函数的参数设计与使用规范,帮助开发者正确集成铜锁密码功能。

密码学上下文管理基础

铜锁采用"上下文对象"模式封装加密状态,所有核心操作均围绕EVP_MD_CTX(消息摘要上下文)和EVP_CIPHER_CTX(加密上下文)展开。这种设计确保线程安全的同时,简化了复杂密码学操作的状态管理。

上下文对象生命周期

// 初始化消息摘要上下文
EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();

// 使用上下文进行加密/哈希操作
// ...

// 释放上下文资源
EVP_MD_CTX_free(md_ctx);

核心上下文结构体定义在头文件中,包含算法元数据、中间状态和结果缓冲区:

哈希函数参数详解

以应用最广泛的EVP_DigestInit_ex()为例,解析哈希计算的参数设计:

EVP_DigestInit_ex函数原型

int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);
参数名类型描述约束条件
ctxEVP_MD_CTX*消息摘要上下文必须通过EVP_MD_CTX_new()初始化
typeconst EVP_MD*哈希算法类型支持SM3/SHA256等标准算法
implENGINE*算法实现引擎通常为NULL使用默认引擎

算法类型选择

铜锁支持多种国家/国际标准哈希算法,通过预定义常量指定:

// SM3密码杂凑算法(GB/T 32905-2016)
const EVP_MD *md = EVP_sm3();

// SHA-256算法
const EVP_MD *md = EVP_sha256();

算法定义位于头文件:include/openssl/evp.h

对称加密函数参数解析

以AES-GCM为例解析EVP_EncryptInit_ex()的参数设计,该函数是所有对称加密操作的入口点。

EVP_EncryptInit_ex函数原型

int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, 
                      ENGINE *impl, const unsigned char *key, const unsigned char *iv);
参数详解
参数名类型描述典型值
ctxEVP_CIPHER_CTX*加密上下文必须初始化的上下文对象
typeconst EVP_CIPHER*密码算法类型EVP_aes_256_gcm()
implENGINE*加密引擎NULL(默认引擎)
keyconst unsigned char*密钥材料32字节(AES-256)
ivconst unsigned char*初始向量12字节(GCM模式推荐)
算法类型常量

铜锁支持的对称加密算法定义在include/openssl/evp.h,常见算法包括:

  • EVP_aes_128_gcm():AES-128-GCM模式
  • EVP_sm4_cbc():SM4-CBC模式(GB/T 32907-2016)
  • EVP_aes_256_ctr():AES-256-CTR模式

AEAD模式特殊参数

对于GCM/CCM等认证加密模式,需要额外设置认证标签长度和附加数据:

// 设置GCM认证标签长度(128位)
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, NULL);

// 添加附加认证数据(AAD)
EVP_EncryptUpdate(ctx, NULL, &len, aad, aad_len);

控制命令常量定义:include/openssl/evp.h

非对称加密核心参数

RSA和SM2是铜锁提供的主要非对称加密算法,以EVP_PKEY_CTX_set_rsa_padding()为例说明参数控制。

RSA填充模式设置

EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new(pkey, NULL);
EVP_PKEY_encrypt_init(pctx);
EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_OAEP_PADDING);
填充模式参数
参数值描述应用场景安全性
RSA_PKCS1_PADDINGPKCS#1 v1.5填充兼容性场景易受 Bleichenbacher 攻击
RSA_PKCS1_OAEP_PADDINGOAEP填充新应用开发推荐使用,安全性更高
RSA_NO_PADDING无填充特殊协议场景需自行保证安全性

相关常量定义:include/openssl/rsa.h

SM2椭圆曲线参数

SM2国密算法参数通过专用函数设置:

EVP_PKEY_CTX_set_sm2_id(pctx, "1234567812345678", 16); // 设置用户ID

SM2算法支持定义在:include/openssl/evp.h

参数错误处理与调试

铜锁提供详细的错误码机制,通过ERR_get_error()获取最近一次错误:

unsigned long err = ERR_get_error();
char err_msg[256];
ERR_error_string_n(err, err_msg, sizeof(err_msg));
printf("密码操作失败: %s\n", err_msg);

错误码定义文件:

最佳实践与性能优化

参数选择建议

  1. 哈希算法:优先选择SM3(国密)或SHA-3(国际)
  2. 对称加密:AES-256-GCM提供最佳安全性/性能平衡
  3. 非对称加密:SM2(国密)或ECC(国际)比RSA更高效
  4. IV/Nonce:必须使用密码学安全的随机数,推荐长度12字节

性能优化参数

  • 上下文复用:重复加密时保留上下文对象可减少初始化开销
  • 批处理模式:使用EVP_EncryptUpdate()单次处理大块数据
  • 引擎选择:通过硬件加速引擎提升性能

完整示例:SM3哈希计算

#include <openssl/evp.h>
#include <openssl/sm3.h>

int sm3_hash(const unsigned char *data, size_t len, unsigned char *md, unsigned int *md_len) {
    EVP_MD_CTX *ctx = EVP_MD_CTX_new();
    if (!ctx) return 0;
    
    int ret = 0;
    if (EVP_DigestInit_ex(ctx, EVP_sm3(), NULL) &&
        EVP_DigestUpdate(ctx, data, len) &&
        EVP_DigestFinal_ex(ctx, md, md_len)) {
        ret = 1;
    }
    
    EVP_MD_CTX_free(ctx);
    return ret;
}

总结

铜锁API的参数设计遵循"安全优先"原则,通过强类型和明确约束防止常见错误。理解核心函数的参数语义是正确使用密码学功能的基础,建议开发时参考:

合理配置参数不仅能确保安全性,还能显著提升应用性能。在处理敏感数据时,建议始终使用铜锁提供的默认安全参数,避免自定义算法或协议带来的安全风险。

铜锁项目logo

【免费下载链接】Tongsuo 铜锁/Tongsuo is a Modern Cryptographic Primitives and Protocols Library 【免费下载链接】Tongsuo 项目地址: https://gitcode.com/GitHub_Trending/to/Tongsuo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值