• 向openssl中添加一个最简单的算法


    一、尝试在sha.c中添加新的函数

    在尝试添加新算法前,我先尝试在原有的旧算法中添加一个新函数,看是否能被编译并生成对应的动态链接库

    关于openssl的编译过程可以参考我之前的文章:Ubuntu中安装OpenSSL

    首先我们下载openssl1.1.j(注意这里使用了1.1.x的版本)

    之后在crypto/sha/sha256.c中,添加下列语句

    /*原有的内容*/
    unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md)
    {
        SHA256_CTX c;
        static unsigned char m[SHA256_DIGEST_LENGTH];
    
        if (md == NULL)
            md = m;
        SHA256_Init(&c);
        SHA256_Update(&c, d, n);
        SHA256_Final(md, &c);
        OPENSSL_cleanse(&c, sizeof(c));
        return md;
    }
    /*添加的内容开始*/
    int test_ab(int a,int b){
        return a + b;
    }
    /*添加的内容结束*/
    
    /*原有的内容*/
    int SHA224_Update(SHA256_CTX *c, const void *data, size_t len)
    {
        return SHA256_Update(c, data, len);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    由于该文件引用了#include ,而我们需要将我们自己写的test_ab函数添加到对应的动态链接库中,因此还需要在头文件中声明我们自己写的这个函数

    //原有的函数
    unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md);
    void SHA256_Transform(SHA256_CTX *c, const unsigned char *data);
    //新增的函数
    int test_ab(int a,int b);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在添加完对应的函数之后,我们需要对整个项目进行重新编译

    ./config
    
    • 1

    在完成这一步之后,如果我们之间make,则会得到如下错误:test_ab does not have a number assigned,这里我参考了另一篇博客,解决了这个问题:openssl does not have a number assigned

    因此,在执行完上面的命令后,我们还需要执行make update

    make update
    
    • 1

    之后再执行make和make install即可

    make
    
    • 1
    sudo make install
    
    • 1

    就可以生成对应的动态链接库了。

    在生成对应的动态链接库后,我们可以编写一个函数调用我们刚刚添加的算法

    #include   
    #include   
      
    int main() {
        int a = 10;
        int b = 21;
        printf("%d\n",test_ab(a,b));  
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    之后,我们对该文件进行编译并链接到对应的动态链接库(若按照下面的命令执行,应将动态链接库拷贝到main1.c所在的路径下)

    gcc main1.c -L. -lssl -lcrypto -o main1
    
    • 1
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
    
    • 1

    之后执行,即可输出结果

    二、添加自定义算法

    在完成了上面的在已集成算法中添加新函数的功能后,我们更进一步,添加自己定义的算法。在这里,我部分参考了这个网址:How to Integrate a Symmetric Cipher

    2.1 添加对应文件

    首先,假设我们要定义一个新的名为spear的算法,我们首先需要在crypto目录中新建一个名为spear的目录,之后再在这个目录中新建一个spear.cbuild.info,之后填充这两个文件的内容

    spear.c,在该文件中自定义了很多函数

    #include 
    #include 
    
    int spear(){
       printf("%s\n","Spear execute!");
       return 199;
    }
    
    int spear_add_ab(int a,int b){
       return a + b;
    }
    
    int spear_sub_ab(int a,int b){
       return a - b;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    build.info,定义了config时的源文件的路径

    LIBS=../../libcrypto
    SOURCE[../../libcrypto]=\
            spear.c
    
    • 1
    • 2
    • 3

    由于spear.c文件中添加了对应的头文件,而此时我们还没有新建该头文件,因此我们需要在include/openssl目录下新建一个头文件spear.h

    int spear();
    int spear_add_ab(int a,int b);
    int spear_sub_ab(int a,int b);
    
    • 1
    • 2
    • 3

    2.2 相关配置

    在完成相关函数编写后,我们需要将自定义的算法进行配置

    首先改变cofig文件中的内容,再最后加上spear

    for i in aes aria bf camellia cast des dh dsa ec hmac idea md2 md5 mdc2 rc2 rc4 rc5 ripemd rsa seed sha sm2 sm3 sm4 spear
    do
      if [ ! -d $THERE/crypto/$i ]
      then
        options="$options no-$i"
      fi
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    之后在Configure中进行如下修改,再最后加上spear

    $config{sdirs} = [
        "objects",
        "md2", "md4", "md5", "sha", "mdc2", "hmac", "ripemd", "whrlpool", "poly1305", "blake2", "siphash", "sm3",
        "des", "aes", "rc2", "rc4", "rc5", "idea", "aria", "bf", "cast", "camellia", "seed", "sm4", "chacha", "modes",
        "bn", "ec", "rsa", "dsa", "dh", "sm2", "dso", "engine",
        "buffer", "bio", "stack", "lhash", "rand", "err",
        "evp", "asn1", "pem", "x509", "x509v3", "conf", "txt_db", "pkcs7", "pkcs12", "comp", "ocsp", "ui",
        "cms", "ts", "srp", "cmac", "ct", "async", "kdf", "store", "spear"
        ];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.3 编译运行

    编译运行的步骤和上面往sha.c中添加算法的一样,唯一需要注意的就是执行完config之后一定要运行make update函数,否则不会将我们写的算法添加到动态链接库中。

    在完成./configmake updatemakesudo make install之后,会生成最新的动态链接库,现在我们需要自己写一个main.c文件调用对应的函数

    #include   
    #include   
      
    int main() { 
        printf("%d\n",spear());
        printf("%d\n",spear_add_ab(100,76));
        printf("%d\n",spear_sub_ab(100,76));
        return 0;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    之后的编译步骤与上面相同,只需要把main1.c换成main.c即可,即可输出对应的结果

    在这里插入图片描述

  • 相关阅读:
    父组件可以监听到子组件的生命周期吗?
    Android WebView使用总结
    自然语言生成技术现状调查:核心任务、应用和评估(3)
    CTF/AWD竞赛标准参考书+实战指南:《AWD特训营》
    INTERSPEECH 2022|CALM: 基于对比学习的表现力语音合成跨模态说话风格建模【语音之家】
    Spring Boot+Vue3前后端分离实战wiki知识库系统之Vue3 + Vue CLI 项目搭建
    acme.sh获取证书
    深度学习Course4第三周Detection Algorithms习题整理
    显示控件——AV输入显示
    管理会计学复习题集
  • 原文地址:https://blog.csdn.net/weixin_46841376/article/details/132617489