SSL探03

SSL探03

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

本文探讨了Openssl的Engine机械.Openssl硬件引擎(Engine)可以使用户比較easy地将自己的硬件增加到openssl中去,替换其提供的软件算法.

ENGINE 是 OPENSSL 预留的用以载入第三方加密库引擎,主要包含了动态库载入的代码和加密函数指针管理的一系列接口.如果要使用 Engine(如果你已经载入上 该 Engine 了 ) , 那 么 首 先 要 加 载 该Engine(比方 ENGINE_load_XXXX),然后选择要使用的算法或者使用支持的全部加密算法。这样你的应用程序在调用加解密算法时,它就会指向你载入的动态库里的加解密算法,而不是原先的 OPENSSL的 库里的加解密算法.

使用Engine的基本流程:

①//Engine_load_xxxx();
初始化Engine对象,对engine的属性及方法进行设置(自己实现的算法),将engine载入到系统中,
②//e =Engine_by_id(“ID_ali”);
获取engine
③选择使用哪些算法
ENGINE_set_default(ENGINE *e, int Flag)
当中 Flag 的说明例如以下:
ENGINE_METHOD_ALL 使用全部存在的算法(默认)
ENGINE_METHOD_RSA 仅使用 RSA 算法
ENGINE_METHOD_DSA 仅使用 DSA 算法
ENGINE_METHOD_DH 仅使用 DH 算法
ENGINE_METHOD_RAND 仅使用随机数算法
ENGINE_METHOD_CIPHERS 仅使用对称加解密算法
ENGINE_METHOD_DIGESTS 仅使用摘要算法
④//以对称加密为例,将engine传入方法就可以.

EVP_EncryptInit_ex(ctx,ciper,e,key,iv);
这样便使用engine中的算法替换掉了SSL的自带算法.

说明:

a.ENGINE_load_hwcipher();这种方法进行Engine的初始化.

void ENGINE_load_hwcipher() {
	ENGINE *e_hw = engine_hwcipher();
	if (!e_hw)
		return;
	ENGINE_add(e_hw);
	ENGINE_free(e_hw);
	ERR_clear_error();
}

当中又调用engine_hwcipher()

static ENGINE *engine_hwcipher(void) {
	ENGINE *ret = ENGINE_new();
	if (!ret)
		return NULL;
	if (!bind_helper(ret)) {
		ENGINE_free(ret);
		return NULL;
	}
	return ret;
}

engine_hwcipher()中调用bind_helper(ENGINE *e);来看看bind_helper(ENGINE *e)的实现

static int bind_helper(ENGINE *e) {
	int ret;

	ret = ENGINE_set_id(e, engine_hw_id);
	if (ret != 1) {
		printf("ENGINE_set_id failed\n");
		return 0;
	}
	ret = ENGINE_set_name(e, engine_hw_name);
	if (ret != 1) {
		printf("ENGINE_set_name failed\n");
		return 0;
	}
	ret = ENGINE_set_RSA(e, &hw_rsa);
	if (ret != 1) {
		printf("ENGINE_set_RSA failed\n");
		return 0;
	}
	ret = ENGINE_set_RAND(e, &hw_rand);
	if (ret != 1) {
		printf("ENGINE_set_RAND failed\n");
		return 0;
	}
	ret = ENGINE_set_destroy_function(e, hw_destroy);
	if (ret != 1) {
		printf("ENGINE_set_destroy_function failed\n");
		return 0;
	}
	ret = ENGINE_set_init_function(e, hw_init);
	if (ret != 1) {
		printf("ENGINE_set_init_function failed\n");
		return 0;
	}
	ret = ENGINE_set_finish_function(e, hw_finish);
	if (ret != 1) {
		printf("ENGINE_set_finish_function failed\n");
		return 0;
	}
	ret = ENGINE_set_ctrl_function(e, hw_ctrl);
	if (ret != 1) {
		printf("ENGINE_set_ctrl_function failed\n");
		return 0;
	}
	ret = ENGINE_set_load_privkey_function(e, hw_load_privkey);
	if (ret != 1) {
		printf("ENGINE_set_load_privkey_function failed\n");
		return 0;
	}
	ret = ENGINE_set_load_pubkey_function(e, hw_load_pubkey);
	if (ret != 1) {
		printf("ENGINE_set_load_pubkey_function failed\n");
		return 0;
	}
	ret = ENGINE_set_cmd_defns(e, hw_cmd_defns);
	if (ret != 1) {
		printf("ENGINE_set_cmd_defns failed\n");
		return 0;
	}
	ret = ENGINE_set_ciphers(e, hw_ciphers);
	if (ret != 1) {
		printf("ENGINE_set_ciphers failed\n");
		return 0;
	}
	ret = ENGINE_set_digests(e, hw_md);
	if (ret != 1) {
		printf("ENGINE_set_digests failed\n");
		return 0;
	}
	return 1;
}


bind_helper(ENGINE *e)方法中对engine结构体中的属性及方法进行设置,自己实现各种加解密算法.

b.至此,engine的初始化工作完毕,然后 e = ENGINE_by_id(“ID_hw”);获取自己须要的engine.

c.选择要使用的算法.ENGINE_set_default(ENGINE *e, int Flag)

c.将engine传入加解密调用函数就可以. EVP_EncryptInit_ex(&ciph_ctx, cipher, e, key, iv);

这样便实现了使用自己定义算法替换openssl中默认算法.具体的代码可參考OpenSSL 源码中的 Demos/Engines



版权声明:本文博主原创文章。博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117021.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • docker下修改mysql配置文件[通俗易懂]

    docker下修改mysql配置文件[通俗易懂]由于需要修改mysql的sql_mode,在命令行修改每次重启都会失效,因为修改docker下mysql的配置文件。操作系统:centos7docker版本:Dockerversion17.05.0-ce,build89658bemysql版本:5.7.181.拉取镜像dockerpullmysql:5.7.182.列出镜像[root@zk01~]#dockerimages

  • js闭包面试题经典_js闭包原理

    js闭包面试题经典_js闭包原理说明最近看到这样一段代码functionfun(n,o){console.log(o);return{fun:function(m){returnfun(m,n);}};}vara=fun(0);a.fun(1);a.fun(2);a.fun(3);varb=f

  • PyCharm 2021.10.3 激活码(JetBrains全家桶)[通俗易懂]

    (PyCharm 2021.10.3 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 如何激活成功教程Mac软件的付费限制(一)

    如何激活成功教程Mac软件的付费限制(一)一、前言在使用Mac的过程中,经常会碰到一些软件,属于付费使用产品。那么处于好奇或者自学的目的,能不能绕过这个限制呢。今天简单的分享下我激活成功教程的几款软件当中的一款,具体是什么软件就不说了,主要是提供下激活成功教程的思路。由于不能供发图,所以这里简单介绍下这款软件。这款软件是AppStore上的一款磁盘清理软件,扫描是免费的。扫描到数据之后,点击清理按钮时候会检查是否注册。如果注册了,直接进入清理程序,否…

  • 函数WSAStartup[通俗易懂]

    函数WSAStartup一、WSAStartup函数               intWSAStartup                      (                         WORDwVersionRequested,                         LPWSADATAlpWSAData                      

  • feiler包(prim算法)

    背景Weisfeiler-Lehman算法(威斯费勒-莱曼算法)是测试图同构的经典算法之一,我在这儿记录一下它的实现原理,参考文章为Weisfeiler-LehmanGraphKernels伪代码论文中的伪代码如下所示假设要测试同构的两张图为G和G`,那么在结点v的第i次迭代里,算法都分别做了四步处理:标签复合集定义、复合集排序、标签压缩和重标签。标签复合集定义如果是第一次迭代,v的标签复合集里只有一个元素,就是v的标签。如果不是第一次迭代,v的标签复合集元素就是v的..

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号