关于ECC 非对称加密的问题

Nosoft12345 2015-10-30 03:37:36
有一个证书.cer.直接上代码:

unsigned char * pub_cert = readCer("公钥证书.cer");
X509 * pcert = d2i_X509(NULL,(const unsigned char **)&pub_cert ,strlen((char*)pub_cert ));
EVP_PEKY * pkey = X509_get_pubkey(pcert);

BYTE out[256] = {0};
int ret = EVP_PKEY_encrypt(out , strkey , key_len ,pkey);
if( ret<=0) return false ;
return true ;
=============================================

这里 返回值ret 为 0

感觉openssl这块知道的人特少。
...全文
483 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nosoft12345 2015-11-02
  • 打赏
  • 举报
回复
引用 1 楼 mLee79 的回复:
ECC 加密是使用 ECDH 算法, 你应该生成使用相同 ecparam 的一个新的 ECKEY, 使用自己的 公钥与新的 KEY 做 DH, 加密密钥可以通过对 KEY 做 HASH 获得, 并保存新生成的 KEY 的公钥... 解密时使用使用 新的 KEY 的公钥 与自己的 私钥做 DH, 通过相同的 HASH 算法获得.. 大概就是 生成密钥的时候调用: EC_KEY newKey = EC_KEY_new_by_curve_name(EC_GROUP_get_curve_name(EC_KEY_get0_group(myEcKey))); EC_KEY_generate_key(newKey); ECDH_compute_key( , , EC_KEY_get0_public_key(myEcKey), newKey , KEY_HASH_FUNCTION); Save( EC_KEY_get0_public_key(newKey)); 获得密钥的时候调用: EC_POINT epnt = EC_POINT_new(EC_KEY_get0_group(myEcKey)); EC_POINT_oct2point(egrp, epnt, @LoadSaveKey )); ECDH_compute_key(,,epnt, myEcKey, KEY_HASH_FUNCTION);
公钥是放在公钥证书里了 我不能自己去生成。
Nosoft12345 2015-11-02
  • 打赏
  • 举报
回复
引用 1 楼 mLee79 的回复:
ECC 加密是使用 ECDH 算法, 你应该生成使用相同 ecparam 的一个新的 ECKEY, 使用自己的 公钥与新的 KEY 做 DH, 加密密钥可以通过对 KEY 做 HASH 获得, 并保存新生成的 KEY 的公钥... 解密时使用使用 新的 KEY 的公钥 与自己的 私钥做 DH, 通过相同的 HASH 算法获得.. 大概就是 生成密钥的时候调用: EC_KEY newKey = EC_KEY_new_by_curve_name(EC_GROUP_get_curve_name(EC_KEY_get0_group(myEcKey))); EC_KEY_generate_key(newKey); ECDH_compute_key( , , EC_KEY_get0_public_key(myEcKey), newKey , KEY_HASH_FUNCTION); Save( EC_KEY_get0_public_key(newKey)); 获得密钥的时候调用: EC_POINT epnt = EC_POINT_new(EC_KEY_get0_group(myEcKey)); EC_POINT_oct2point(egrp, epnt, @LoadSaveKey )); ECDH_compute_key(,,epnt, myEcKey, KEY_HASH_FUNCTION);
公钥是放在公钥证书里了 我不能自己去生成。
Nosoft12345 2015-11-02
  • 打赏
  • 举报
回复
非常感谢您的细心和耐心指导,但真的不是很明白。 我的流程是: 1、从公钥证书读取证书数据:unsigned char * pub_cert = readCer("公钥证书.cer"); 2、然后转换成小X509 证书的格式: 3、然后再通过X509 * pcert = d2i_X509(NULL,(const unsigned char **)&pub_cert ,strlen((char*)pub_cert )); 4、EVP_PEKY * pkey = X509_get_pubkey(pcert); =========== 获得密钥的时候调用: EC_POINT epnt = EC_POINT_new(EC_KEY_get0_group(myEcKey)); EC_POINT_oct2point(egrp, epnt, @LoadSaveKey )); ECDH_compute_key(,,epnt, myEcKey, KEY_HASH_FUNCTION); 以上不太知道是干啥用的,另外加密解密 具体要用到哪些函数 我看您一楼的代码,没涉及到加密解密。 ECC有专门独立的加密解密的函数么 =========== 我再openssl上找了下,很多您写的函数在其上不是找不到,而是网络无法连接到,不知道是什么情况。
mLee79 2015-11-02
  • 打赏
  • 举报
回复
EVP_PKEY 兼容 RSA, ECC, DH 只是能够用 EVP_PKEY 保存他们的私钥 . ECDH, DH 在原理上就跟 RSA 不一样, 一定是几个不同的 KEY 用公钥计算加密参数, 各人再用 自己的私钥解密得到这个参数. 1楼的流程没有问题, 你从 EVP_PKEY 获得 EC_KEY 后, 按那个写法弄就可以了.
Nosoft12345 2015-11-02
  • 打赏
  • 举报
回复
我刚才看了下openssl的相关文档,说的是EVP_PKEY 这个结构是能同时兼容RAS和ECC等相关算法的。
Nosoft12345 2015-11-02
  • 打赏
  • 举报
回复
引用 8 楼 Nosoft12345 的回复:
[quote=引用 7 楼 mLee79 的回复:] 你那个只能弄 RSA 啥的, 1 楼我不贴了正确的写法么, ECDH, DH 跟 RSA 一类是不一样的.
您的意思是说 EVP_PKEY_encrypt 仅仅使用与Rsa? 如果是ECC的话,要用您贴的代码么 我也是刚刚做这个[/quote] 另外,ECC的话,如何去非对称加密和解密呢? 网指导啊
Nosoft12345 2015-11-02
  • 打赏
  • 举报
回复
引用 7 楼 mLee79 的回复:
你那个只能弄 RSA 啥的, 1 楼我不贴了正确的写法么, ECDH, DH 跟 RSA 一类是不一样的.
您的意思是说 EVP_PKEY_encrypt 仅仅使用与Rsa? 如果是ECC的话,要用您贴的代码么 我也是刚刚做这个
mLee79 2015-11-02
  • 打赏
  • 举报
回复
你那个只能弄 RSA 啥的, 1 楼我不贴了正确的写法么, ECDH, DH 跟 RSA 一类是不一样的.
Nosoft12345 2015-11-02
  • 打赏
  • 举报
回复
引用 4 楼 mLee79 的回复:
不用你生成新的公钥啊, 但是每次加密都要生成一个新的 ECKEY, 这个KEY只使用一次. 加密用新生成的 KEY 的私钥与自己的公钥做 DH, 并保存新生成的 KEY 的公钥, 新的 ECKEY 的私钥被丢弃, 解密用新 KEY 的公钥与自己的私钥做 DH ..
大侠, 你看我的代码有问题么? ====================== 从公钥证书取出公钥,进行非对称加密。 您觉得应该怎么来写啊
Nosoft12345 2015-11-02
  • 打赏
  • 举报
回复
引用 4 楼 mLee79 的回复:
不用你生成新的公钥啊, 但是每次加密都要生成一个新的 ECKEY, 这个KEY只使用一次. 加密用新生成的 KEY 的私钥与自己的公钥做 DH, 并保存新生成的 KEY 的公钥, 新的 ECKEY 的私钥被丢弃, 解密用新 KEY 的公钥与自己的私钥做 DH ..
大侠, 你看我的代码有问题么? ====================== 从公钥证书取出公钥,进行非对称加密。 您觉得应该怎么来写啊
mLee79 2015-11-02
  • 打赏
  • 举报
回复
不用你生成新的公钥啊, 但是每次加密都要生成一个新的 ECKEY, 这个KEY只使用一次. 加密用新生成的 KEY 的私钥与自己的公钥做 DH, 并保存新生成的 KEY 的公钥, 新的 ECKEY 的私钥被丢弃, 解密用新 KEY 的公钥与自己的私钥做 DH ..
mLee79 2015-10-30
  • 打赏
  • 举报
回复
ECC 加密是使用 ECDH 算法, 你应该生成使用相同 ecparam 的一个新的 ECKEY, 使用自己的 公钥与新的 KEY 做 DH, 加密密钥可以通过对 KEY 做 HASH 获得, 并保存新生成的 KEY 的公钥... 解密时使用使用 新的 KEY 的公钥 与自己的 私钥做 DH, 通过相同的 HASH 算法获得.. 大概就是 生成密钥的时候调用: EC_KEY newKey = EC_KEY_new_by_curve_name(EC_GROUP_get_curve_name(EC_KEY_get0_group(myEcKey))); EC_KEY_generate_key(newKey); ECDH_compute_key( , , EC_KEY_get0_public_key(myEcKey), newKey , KEY_HASH_FUNCTION); Save( EC_KEY_get0_public_key(newKey)); 获得密钥的时候调用: EC_POINT epnt = EC_POINT_new(EC_KEY_get0_group(myEcKey)); EC_POINT_oct2point(egrp, epnt, @LoadSaveKey )); ECDH_compute_key(,,epnt, myEcKey, KEY_HASH_FUNCTION);

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧