openssl中dh算法Demo

/*下面程序利用openssl库,实现了dh算法,产生密钥以及计算sessionkey*/
#include <openssl/dh.h>
#include <memory.h>
int main() {
    DH *d1,*d2;
    BIO *b;
    int ret,size,i,len1,len2;
    char sharekey1[128],sharekey2[128];
    /* 构造DH 数据结构 */
    d1=DH_new();
    d2=DH_new();
    /* 生成d1 的密钥参数*/
    ret=DH_generate_parameters_ex(d1,64,DH_GENERATOR_2,NULL);
    if(ret!=1) {               //prime_len,g大于1,常见2和5
        printf("DH_generate_parameters_ex err!\n");
        return -1;
    }
    /* 检查密钥参数 */
    ret=DH_check(d1,&i);//i先被置0,然后通过或等于,得到出错信息类型
    if(ret!=1) {
        printf("DH_check err!\n");
    if(i&DH_CHECK_P_NOT_PRIME)
        printf("p value is not prime\n");
    if(i&DH_CHECK_P_NOT_SAFE_PRIME)
        printf("p value is not a safe prime\n");
    if (i&DH_UNABLE_TO_CHECK_GENERATOR)
        printf("unable to check the generator value\n");
    if (i&DH_NOT_SUITABLE_GENERATOR)
        printf("the g value is not a generator\n");
    }
    printf("DH parameters appear to be ok.\n");
    /* 密钥大小 */
    size=DH_size(d1);
    printf("DH key1 size : %d\n",size);
    /* 生成公私钥 */
    ret=DH_generate_key(d1);
    if(ret!=1) {
        printf("DH_generate_key err!\n");
        return -1;
    }
    /* p和g为公开的密钥参数,因此可以拷贝 */
    d2->p=BN_dup(d1->p);
    d2->g=BN_dup(d1->g);
    /* 生成公私钥,用于测试生成共享密钥 */
    ret=DH_generate_key(d2);
    if(ret!=1) {
        printf("DH_generate_key err!\n");
        return -1;
    }
    /* 检查公钥 */
    ret=DH_check_pub_key(d1,d1->pub_key,&i);
    if(ret!=1) {
        if (i&DH_CHECK_PUBKEY_TOO_SMALL)
            printf("pub key too small \n");
        if (i&DH_CHECK_PUBKEY_TOO_LARGE)
            printf("pub key too large \n");
    }
    /* 计算共享密钥 */
    len1=DH_compute_key(sharekey1,d2->pub_key,d1);
    len2=DH_compute_key(sharekey2,d1->pub_key,d2);
    if(len1!=len2) {
        printf("生成共享密钥失败1\n");
        return -1;
    }
    if(memcmp(sharekey1,sharekey2,len1)!=0) {
        printf("生成共享密钥失败2\n");
        return -1;
    }
    printf("生成共享密钥成功\n");
    return 0;
}
时间: 2024-10-07 23:03:01

openssl中dh算法Demo的相关文章

openssl中dh算法实现

Openssl的DH实现在crypt/dh目录中,各个源码如下: (1) dh.h 定义了 DH 密钥方法数据结构以及各种函数. (2) dh_asn1.c DH密钥参数的DER 编解码实现. (3) dh_lib.c 实现了通用的 DH 函数,设计层面的. (4) dh_gen.c 实现了生成 DH 密钥参数. (5) dh_key.c 实现openssl 提供的默认的DH_METHOD,实现了根据密钥参数生成DH 公私钥,以及根据DH 公钥(一方)以及DH 私钥(另一方)来生成一个共享密钥,

源码方式向openssl中添加新算法完整详细步骤(示例:摘要算法SM3)【非engine方式】

openssl简介 openssl是一个功能丰富且自包含的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘要).大数运算.非对称算法密钥生成.ASN.1编解码库.证书请求(PKCS10)编解码.数字证书编解码.CRL编解码.OCSP协议.数字证书验证.PKCS7标准实现和PKCS12个人数字证书格式实现等功能. openssl采用C语言作为开发语言,这使得它具有优秀的跨平台性能.openssl支持Linux.UNIX.wi

在OpenSSL中添加自定义加密算法

一.简介 本文以添加自定义算法EVP_ssf33为例,介绍在OpenSSL中添加自定义加密算法的方法 二.步骤 1.修改crypto/object/objects.txt,注册算法OID,如下: rsadsi 3 255 : SSF33 : ssf33 2.进入目录:crypto/object/,执行如下命令,生成算法的声明 perl objects.pl objects.txt obj_mac.num obj_mac.h 3.在crypto/evp/下添加e_ssf33.c,内容如下 #inc

K-Means算法Demo

简介:本Demo是参照这个网站上的Demo自己用Java实现的.将Java打包为Jar,再将Jar转为exe,源代码及程序Demo下载请点我. K-Means算法简介 我尽量用通俗易懂但不规范的语言来描述K-Means算法. K-eans算法是数据挖掘十大算法之一,是一种聚类算法,也是最简单的无监督学习(unsupervised learning)算法之一. 假设有一个元素集合,我们的目标是将该集合中的元素划分成K个簇(就是K个部分),每个簇内的元素相似度较高,不同簇的元素相似度较低(正所谓物以

加密、认证、DH算法

首先理解加密算法 其次理解DH算法 最后解析ipsecVPN 理解加密算法 一个完整的加密方法由很多因素组成,但是最关键的两个因素是加密算法和密钥.加密算法通常是非常复杂的数学公式,这些公式确定如何将明文转化为密文的运作过程与规则.密钥是一串被加入到算法中的随机比特,若要使两个加密点之间进行加密的通信,必须使用相同的加密算法.而且在某些时候他们需要使用相同的密钥(对称式加密),当然在很多时候两者使用不同的密钥来进行加密或者解密(非对称加密). 下面描述对称式加密算法和非对称式加密算法: 对称式加

OPENSSL中RSA私钥文件(PEM格式)解析【一】

http://blog.sina.com.cn/s/blog_4fcd1ea30100yh4s.html 在PKCS#1 RSA算法标准中定义RSA私钥语法为: RSAPrivateKey ::= SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- p prime2 INTEGER, -- q

DH算法

1.通信方A和通信方B约定一个初始数g,如g=5,一个质数p,如p=23,g和p是公开的,且1< g < p 2.A生成一个随机数a,a是保密的,如a=6 3.A计算g^a%p发送给B,g^a%p=5^6%23=8 4.B生成一个随机数b,b是保密的,如b=15 5.B计算g^b%p发送给A,g^b%p=5^15%23=19 6.A接收到g^b%p后,再使用保密的a,计算(g^b%p)^a%p=19^6%23=2 7.B接收到g^a%p后,再使用保密的b,计算(g^a%p)^b%p=8^15%

推荐系统中常用算法 以及优点缺点对比

推荐系统中常用算法 以及优点缺点对比 在 推荐系统简介中,我们给出了推荐系统的一般框架.很明显,推荐方法是整个推荐系统中最核心.最关键的部分,很大程度上决定了推荐系统性能的优劣.目前,主要的推荐方法包括:基于内容推荐.协同过滤推荐.基于关联规则推荐.基于效用推荐.基于知识推荐和组合推荐. 一.基于内容推荐 基于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器

数据挖掘中分类算法小结

数据挖掘中分类算法小结 数据仓库,数据库或者其它信息库中隐藏着许多可以为商业.科研等活动的决策提供所需要的知识.分类与预测是两种数据分析形式,它们可以用来抽取能够描述重要数据集合或预测未来数据趋势的模型.分类方法(Classification)用于预测数据对象的离散类别(Categorical Label);预测方法(Prediction )用于预测数据对象的连续取值. 分类技术在很多领域都有应用,例如可以通过客户分类构造一个分类模型来对银行贷款进行风险评估;当前的市场营销中很重要的一个特点是强