openssl3.2 - 官方demo学习 - kdf - scrypt.c

文章目录

    • openssl3.2 - 官方demo学习 - kdf - scrypt.c
    • 概述
    • 笔记
    • END

openssl3.2 - 官方demo学习 - kdf - scrypt.c

概述

设置 kdf-SCRYPT算法的参数, 取key

笔记

/*!
\file scrypt.c
\note openssl3.2 - 官方demo学习 - kdf - scrypt.c
设置 kdf-SCRYPT算法的参数, 取key
*//** Copyright 2021-2023 The OpenSSL Project Authors. All Rights Reserved.** Licensed under the Apache License 2.0 (the "License").  You may not use* this file except in compliance with the License.  You can obtain a copy* in the file LICENSE in the source distribution or at* https://www.openssl.org/source/license.html*/#include <stdio.h>
#include <openssl/core_names.h>
#include <openssl/crypto.h>
#include <openssl/kdf.h>
#include <openssl/obj_mac.h>
#include <openssl/params.h>#include "my_openSSL_lib.h"/** test vector from* https://datatracker.ietf.org/doc/html/rfc7914*//** Hard coding a password into an application is very bad.* It is done here solely for educational purposes.*/
static unsigned char password[] = {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'
};/** The salt is better not being hard coded too.  Each password should have a* different salt if possible.  The salt is not considered secret information* and is safe to store with an encrypted password.*/
static unsigned char scrypt_salt[] = {'N', 'a', 'C', 'l'
};/** The SCRYPT parameters can be variable or hard coded.  The disadvantage with* hard coding them is that they cannot easily be adjusted for future* technological improvements appear.*/
static unsigned int scrypt_n = 1024;
static unsigned int scrypt_r = 8;
static unsigned int scrypt_p = 16;static const unsigned char expected_output[] = {0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00,0x78, 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe,0x7c, 0x6a, 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30,0xe7, 0x73, 0x76, 0x63, 0x4b, 0x37, 0x31, 0x62,0x2e, 0xaf, 0x30, 0xd9, 0x2e, 0x22, 0xa3, 0x88,0x6f, 0xf1, 0x09, 0x27, 0x9d, 0x98, 0x30, 0xda,0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, 0xee, 0x6d,0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, 0x40
};int main(int argc, char **argv)
{int ret = EXIT_FAILURE;EVP_KDF *_evp_kdf = NULL;EVP_KDF_CTX *_evp_kdf_ctx = NULL;unsigned char out[64];OSSL_PARAM _ossl_param_ary[6], *p_ossl_param = _ossl_param_ary;OSSL_LIB_CTX *_ossl_lib_ctx = NULL;_ossl_lib_ctx = OSSL_LIB_CTX_new();if (_ossl_lib_ctx == NULL) {fprintf(stderr, "OSSL_LIB_CTX_new() returned NULL\n");goto end;}/* Fetch the key derivation function implementation */_evp_kdf = EVP_KDF_fetch(_ossl_lib_ctx, "SCRYPT", NULL);if (_evp_kdf == NULL) {fprintf(stderr, "EVP_KDF_fetch() returned NULL\n");goto end;}/* Create a context for the key derivation operation */_evp_kdf_ctx = EVP_KDF_CTX_new(_evp_kdf);if (_evp_kdf_ctx == NULL) {fprintf(stderr, "EVP_KDF_CTX_new() returned NULL\n");goto end;}/* Set password */*p_ossl_param++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_PASSWORD, password,sizeof(password));/* Set salt */*p_ossl_param++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, scrypt_salt,sizeof(scrypt_salt));/* Set N (default 1048576) */*p_ossl_param++ = OSSL_PARAM_construct_uint(OSSL_KDF_PARAM_SCRYPT_N, &scrypt_n);/* Set R (default 8) */*p_ossl_param++ = OSSL_PARAM_construct_uint(OSSL_KDF_PARAM_SCRYPT_R, &scrypt_r);/* Set P (default 1) */*p_ossl_param++ = OSSL_PARAM_construct_uint(OSSL_KDF_PARAM_SCRYPT_P, &scrypt_p);*p_ossl_param = OSSL_PARAM_construct_end();/* Derive the key */if (EVP_KDF_derive(_evp_kdf_ctx, out, sizeof(out), _ossl_param_ary) != 1) {fprintf(stderr, "EVP_KDF_derive() failed\n");goto end;}if (CRYPTO_memcmp(expected_output, out, sizeof(expected_output)) != 0) {fprintf(stderr, "Generated key does not match expected value\n");goto end;}ret = EXIT_SUCCESS;
end:EVP_KDF_CTX_free(_evp_kdf_ctx);EVP_KDF_free(_evp_kdf);OSSL_LIB_CTX_free(_ossl_lib_ctx);return ret;
}

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos 更换内核

文章目录 一、查看/更换系统内核1.1 查看当前运行环境的内核1.2 查看系统上所有可用内核1.3 切换内核方法一&#xff1a;通过启动菜单更换内核方法二&#xff1a;更换默认启动内核 二、安装内核2.1 使用ELRepo安装2.2 安装指定内核版本参考资料 一、查看/更换系统内核 1.1 查看…

docker搭建SSH镜像、systemctl镜像、nginx镜像、tomcat镜像

目录 一、SSH镜像 二、systemctl镜像 三、nginx镜像 四、tomcat镜像 五、mysql镜像 一、SSH镜像 1、开启ip转发功能 vim /etc/sysctl.conf net.ipv4.ip_forward 1sysctl -psystemctl restart docker 2、 cd /opt/sshd/vim Dockerfile 3、生成镜像 4、启动容器并修改ro…

面试题:你知道 Spring lazy-init 懒加载的原理吗?

文章目录 前言一、先睹为快二、原理分析三、总结 前言 普通的bean的初始化是在容器启动初始化阶段执行的&#xff0c;而被lazy-init修饰的bean 则是在从容器里第一次进行context.getBean(“”)时进行触发。 Spring 启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring…

这可能是最全面的Java并发编程八股文了

内容摘自我的学习网站&#xff1a;topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创…

SpringBoot基础:一步步创建SpringBoot工程

摘要 本文介绍了&#xff0c;从零开始创建SpringBoot工程&#xff0c;且在每一步给出分析和原因。创建maven – 转Springboot – 引入jdbc – 引入数据库操作框架&#xff0c;最后给出了不同场景指定不同配置文件的方案。 背景 为什么要使用SpringBoot工程&#xff1f; 使用Sp…

Python 网络编程之粘包问题

【一】粘包问题介绍 【1】粘包和半包 粘包&#xff1a; 定义&#xff1a; 粘包指的是发送方发送的若干个小数据包被接收方一次性接收&#xff0c;形成一个大的数据包。原因&#xff1a; 通常是因为网络底层对数据传输的优化&#xff0c;将多个小数据包组合成一个大的数据块一次…

Linux搭建和使用redis

官网地址&#xff1a;http://redis.io/download 文件上传到服务器 tar包解压 tar zxvf redis-5.0.14.tar.gz安装 进入解压目录下&#xff0c;找到Makefile所在目录&#xff0c;执行make命令 make执行之后&#xff0c;会产生src等目录&#xff0c;进入执行make install命令…

locust快速入门--使用分布式提高测试压力

背景&#xff1a; 使用默认的locust启动命令进行压测时&#xff0c;尽管已经将用户数设置大比较大&#xff08;400&#xff09;&#xff0c;但是压测的时候RPS一直在100左右。需要增加压测的压力。 问题原因&#xff1a; 如果你是通过命令行启动的或者参考之前文章的启动方式…

【论文阅读】Speech Driven Video Editing via an Audio-Conditioned Diffusion Model

DiffusionVideoEditing&#xff1a;基于音频条件扩散模型的语音驱动视频编辑 code&#xff1a;GitHub - DanBigioi/DiffusionVideoEditing: Official project repo for paper "Speech Driven Video Editing via an Audio-Conditioned Diffusion Model" paper&#…

第十讲 单片机驱动彩色液晶屏 控制RA8889软件:图像运算

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

大模型理论基础1

大模型理论基础1 第一章&#xff1a;引言 语言模型 自回归语言模型 概率的链式法则&#xff1a; 在自回归语言模型 p 中生成整个序列 X1:L&#xff0c;我们需要一次生成一个令牌(token)&#xff0c;该令牌基于之前以生成的令牌进行计算获得&#xff1a; 其中T≥0 是一个控…

Java 日志体系泣血总结

目录 一. 前言 二. Log 日志体系 2.1. 背景/发展史 2.2. 关系/依赖 2.2.1. JCL&#xff08;Jakarta Commons Logging&#xff09; 2.2.2. SLF4J 2.2.3. SLF4J 的适配 2.2.4. Spring 统一输出 三. 总结 一. 前言 本文的目的是搞清楚 Java 中各种日志 Log 之间是怎样的关…

【深入理解 ByteBuf 之三 接口类拆解】2. Recycler 接口设计真正的回收机制

Recycler 回收器接口设计 本节接着 ObjectPool 的设计脉络&#xff0c;具体看看其具体实现 RecyclerObjectPool 中引用的 Recycler 究竟是怎么实现的 这一张图基本已经说明白了&#xff0c;我再做个总结&#xff0c;对细节感兴趣的可以看看我下面带源码的注释。 对于 Recycle…

2023.1.15 关于 Redis 持久化 RDB 策略详解

目录 Redis 持久化 Redis 实现持久化的两大策略 RDB 策略 手动触发 save 命令 bgsave 命令 bgsave 命令执行流程 自动触发 rdb 文件 实例演示一 实例演示二 实例演示三 实例演示四 RDB 策略的优缺点 Redis 持久化 什么是持久化&#xff1f; 回答&#xff1a; 将数据存…

SeaTunnel 海量数据同步工具的使用(连载中……)

一、概述 SeaTunnel 是一个非常易用&#xff0c;高性能、支持实时流式和离线批处理的海量数据处理产品&#xff0c;前身是 WaterDrop &#xff08;中文名&#xff1a;水滴&#xff09;&#xff0c;自 2021年10月12日更名为 SeaTunnel 。2021年12月9日&#xff0c;SeaTunnel 正式…

【Linux】Linux系统编程——pwd命令

文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 pwd&#xff08;Print Working Directory&#xff09;命令用于显示用户当前工作目录的完整路径。这是一个常用的命令&#xff0c;帮助用户确定他们目前所在的目录位置。 2.命令格式 基本的 pwd 命令…

使用Spring Boot和JPA实现多数据源的方法

使用Spring Boot和JPA实现多数据源的方法&#xff1a; 添加相关依赖&#xff1a;在pom.xml文件中添加Spring Boot和JPA的依赖项&#xff0c;例如Spring Boot Starter Data JPA和相应的数据库驱动。 配置数据源&#xff1a;在application.properties&#xff08;或application.…

STM32 USB OTG主机模式的实现方法

为了实现STM32的USB OTG主机模式&#xff0c;我们首先需要了解一些基本概念和原理&#xff0c;然后进行相应的硬件连接和软件编程。在这篇文章中&#xff0c;我们将介绍如何在STM32微控制器上实现USB OTG主机模式&#xff0c;并提供相应的代码示例。 1. STM32 USB OTG主机模式…

MyBatis 查询数据库

一. MyBatis 框架的搭建 本篇所用sql 表: drop table if exists userinfo; create table userinfo(id int primary key auto_increment,username varchar(100) not null,password varchar(32) not null,photo varchar(500) default ,createtime timestamp default current_tim…

教你用通义千问只要五步让千年的兵马俑跳上现代的科目三?

教你用五步让千年的兵马俑跳上现代的舞蹈科目三&#xff1f; 上面这个“科目三”的视频&#xff0c;只用了一张我上月去西安拍的兵马俑照片生成的。 使用通义千问&#xff0c;只要5步就能它舞动起来&#xff0c;跳上现在流行的“科目三”舞蹈。 全民舞王 第1步 打开通义千问…