openssl使用实践

参考文档:
[1]OpenSSL中文手册
[2]密码技术与应用
[3]OpenSSL ECC算法

openssl 是一个功能丰富的开源安全工具箱。它实现了大量软算法(摘要/对称/非对称)、非对称算法密钥生成、密钥存储和管理。

openssl 使用:
EVP编程实践:

1 数据结构说明:

EVP_PKEY: 用来存放非对称密钥信息,可以是RSA/DSA/DH/ECC密钥。
EVP_MD: 用来存放摘要算法信息、非对称算法类型以及各种计算函数。文件名 cypto/evp/m_*
EVP_CIPHER: 用来存放对称加密相关的信息和算法。
EVP_CIPHER_CTX: 对称算法上下文结构。
EVP_MD_CTX: 非对称算法上下文结构。定义在 include/openssl/ossl_typ.h:92
typedef struct evp_md_ctx_st EVP_MD_CTX;

参考文件: apps/apps.c 文件中 load_pubkey()函数

2 openssl命令使用例子:

生成默认的2048bit RSA私钥文件并使用AES128加密私钥文件
$ openssl genrsa -out server.key -passout pass:123456 -aes128
解密RSA私钥文件,保存为明文私钥文件server_nopass.key
$ openssl rsa -in server.key -passin pass:123456 -out server_nopass.key
利用RSA私钥产生对应的公钥文件:
$ openssl rsa -in server.key -passin pass:123456 -pubout -out server_pub.key
列出所有椭圆曲线
$ openssl ecparam -list_curves
生成椭圆曲线文件prime256v1.pem
$ openssl ecparam -name prime256v1 -out prime256v1.pem
根据曲线文件生成私钥
$ openssl genpkey -des3 -paramfile prime256v1.pem -out private.key
或者一次性生成ECC密钥
$ openssl ecparam -genkey -name prime256v1 -out private.key
or
$ openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256
利用私钥生成公钥
$ openssl ec -in private.key -pubout -out public.key
使用私钥private.key签名一个文件hash_file,生成签名文件hash_file.sig
$ openssl dgst -sign private.key hash_file > hash_file.sig
验证签名hash_file.sig
$ openssl dgst -verify public.key -signature hash_file.sig hash_file

3 openssl源码分析

两个关键数据结构 EC_KEY,EC_KEY_METHOD 定义在 include/openssl/ossl_typ.h 文件中。
typedef struct ec_key_st EC_KEY;
typedef struct ec_key_method_st EC_KEY_METHOD;

这两个结构体的原型定义在crypto/ec/ec_local.h文件中。
struct ec_key_st {
const EC_KEY_METHOD *meth;
ENGINE *engine;
int version;
EC_GROUP *group;
EC_POINT *pub_key;
BIGNUM *priv_key;
unsigned int enc_flag;
point_conversion_form_t conv_form;
CRYPTO_REF_COUNT references;
int flags;
CRYPTO_EX_DATA ex_data;
CRYPTO_RWLOCK *lock;
};
struct ec_key_method_st {
const char *name;
int32_t flags;
int (*init)(EC_KEY *key);
void (*finish)(EC_KEY *key);
int (*copy)(EC_KEY *dest, const EC_KEY *src);
int (*set_group)(EC_KEY *key, const EC_GROUP *grp);
int (*set_private)(EC_KEY *key, const BIGNUM *priv_key);
int (*set_public)(EC_KEY *key, const EC_POINT *pub_key);
int (*keygen)(EC_KEY *key);
int (*compute_key)(unsigned char **pout, size_t *poutlen,
const EC_POINT *pub_key, const EC_KEY *ecdh);
int (*sign)(int type, const unsigned char *dgst, int dlen, unsigned char
*sig, unsigned int *siglen, const BIGNUM *kinv,
const BIGNUM *r, EC_KEY *eckey);
int (*sign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp,
BIGNUM **rp);
ECDSA_SIG *(*sign_sig)(const unsigned char *dgst, int dgst_len,
const BIGNUM *in_kinv, const BIGNUM *in_r,
EC_KEY *eckey);

int (*verify)(int type, const unsigned char *dgst, int dgst_len,
              const unsigned char *sigbuf, int sig_len, EC_KEY *eckey);
int (*verify_sig)(const unsigned char *dgst, int dgst_len,
                  const ECDSA_SIG *sig, EC_KEY *eckey);

};

默认方法定义在crypto/ec/ec_kmeth.c文件
static const EC_KEY_METHOD openssl_ec_key_method = {
“OpenSSL EC_KEY method”,
0,
0,0,0,0,0,0,
ossl_ec_key_gen,
ossl_ecdh_compute_key,
ossl_ecdsa_sign,
ossl_ecdsa_sign_setup,
ossl_ecdsa_sign_sig,
ossl_ecdsa_verify,
ossl_ecdsa_verify_sig
};

i2d和d2i系列函数
https://blog.csdn.net/u010129119/article/details/53811622
这些函数用于将OpenSSL 对象转换或从其转换为它们的 ASN.1/DER 编码,DER是一种序列化编码,适合在网络上发送或写入文件等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值