RSA非对称加密-openssl命令及C语言实现

        RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。本文介绍如何使用openssl命令和C代码实现基础的RSA加/解密和签名/验签功能。

一、openssl命令实现RSA加解密

 1、生成私钥和公钥

  • 生成私钥

openssl genrsa -out private.key 2048                #生成私钥

  • 使用私钥生成公钥

openssl rsa -pubout -in private.key -out public.key        #私钥生成公钥

2、签名、验签

  • 使用private.key私钥签名data.txt,生成data.sign

openssl rsautl -sign -inkey private.key -keyform PEM -in data.txt -out data.sign        #签名

  • 使用公钥验签verify.key

openssl rsautl -verify -inkey public.key  -pubin -in data.sign        #验签

注意:执行生成密钥对和验签命令时,一定要注意文件名后面是否有空格符或tab符,否则会出现"No such file or directory"的报错

可以看到验签后,打印信息与签名前的文件内容相同,签名、验签测试OK。

3、加密、解密

  • 使用公钥加密 data.txt 生成 data.encrypt

openssl rsautl -encrypt -pubin -inkey public.key -in data.txt -out data.encrypt

注意:每次用公钥加密生成的加密文件内容都会变化

  • 使用私钥解密 data.encrypt

openssl rsautl -decrypt -inkey private.key -in data.encrypt 

如果要存到文件,解密命令后面加 "-out data.decrypt"

4、其他openssl命令

  • 从certificate.crt证书提取公钥到public_key.pem

openssl x509 -pubkey -noout -in certificate.crt > public_key.pem

  • 直接使用证书验签(从证书获取公钥,使用公钥验签)

openssl rsautl -verify -inkey certificate.crt -certin -in data.sign

二、C语言实现RSA非对称加解密

下面使用的密钥对openssl命令生成的 private.key 和 public.key

1、签名、验签

1.1 C代码实现

代码下载链接:https://download.csdn.net/download/hinewcc/89484338

  • openssl_rsa.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <error.h>
#include "openssl_rsa.h"

void rsa_init(void)
{
    printf("rsa init ... \n");
    OpenSSL_add_all_algorithms();
}

/*
*****************************************************************************************
*	函 数 名: rsa_sign
*	功能说明: RSA使用私钥签名
*	形    参:   key         :   私钥
*               file_in     :   输入需要签名的文件
*               file_out   :   签名后生成的文件
*	返 回 值: 0:成功, 其他:失败
*****************************************************************************************
*/
int rsa_sign(const char *key, const char *file_in, const char *file_out)
{
    int ret = -1;
    int keysize = 0;
    RSA *rsa = NULL;
    BIO *in = NULL, *out = NULL;
    unsigned char *rsa_in = NULL, *rsa_out = NULL;
    int rsa_inlen = 0, rsa_outlen = 0, len = 0;

/* 从私钥提取 RSA */
    FILE *fp = fopen(key, "r");
    if (NULL == fp) {
        perror("Open Key Error: \n");
        return -1;
    }

    rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL,NULL);
    if (!rsa) {
        perror("EVP_PKEY_get1_RSA Error: \n");
        goto error;
    }

/* 打开file_in文件内容,创建file_out文件 */
    in = BIO_new_file(file_in, "rb");
    if (NULL == in) {
        printf("BIO_new_file: open source file fail\n");
        goto error;
    }

    out = BIO_new_file(file_out, "wb");
    if (NULL == out) {
        printf("BIO_new_file: open file_out file fail\n");
        goto error;
    }

    keysize = RSA_size(rsa);
    if (keysize < 0) {
        printf("RSA_size key size is %d\n", keysize);
        goto error;
    }

    rsa_in =(unsigned char *)OPENSSL_malloc(keysize * 2);
    if (rsa_in == NULL){
        perror("OPENSSL_malloc ras in fail\n");
        goto error;
    }

    rsa_out =(unsigned char *)OPENSSL_malloc(keysize);
    if (rsa_out == NULL){
        perror("OPENSSL_malloc ras out fail\n");
        goto error;
    }

    rsa_inlen = BIO_read(in, rsa_in, keysize * 2);
    if (rsa_inlen < 0) {
        perror("BIO_read Fail: \n");
        goto error;
    }

/* 使用私钥验签,写入file_out文件 */
    len = RSA_private_encrypt(rsa_inlen, rsa_in, rsa_out, rsa, RSA_PKCS1_PADDING);
    if (len < 0) {
        perror("RSA_encrypt Fail: \n");
        goto error;
    }

    rsa_outlen = BIO_write(out, rsa_out, len);
    if (rsa_outlen < 0) {
        perror("BIO_write Fail: \n");
        goto error;
    }
    ret = 0;
    printf("sign success!\n");

error:
    if (NULL != fp) fclose(fp);
    if (rsa) RSA_free(rsa);
    if (in) BIO_free(in);
    if (out) BIO_free_all(out);
    if (rsa_in) OPENSSL_free(rsa_in);
    if (rsa_out) OPENSSL_free(rsa_out);

    return ret;
}

/*
*****************************************************************************************
*	函 数 名: rsa_verify
*	功能说明: RSA使用公钥验签
*	形    参:   key         :   私钥
*               file_in     :   输入需要签名的文件
*               file_out   :   签名后生成的文件
*	返 回 值: 0:成功, 其他:失败
*****************************************************************************************
*/
int rsa_verify(const char *public, const char *file_in,const char *file_out)
{
    int ret = ERR_NONE;
    int keysize = 0;
    RSA* rsa = NULL;
    BIO* in = NULL, *out = NULL;
    unsigned char* rsa_in = NULL, *rsa_out = NULL;
    int rsa_inlen = 0, rsa_outlen = 0, len = 0;

/* 从公钥提取 RSA */
    FILE *fp = fopen(public, "rb");
    if (NULL == fp) {
        perror("Open Key Error: \n");
        return -1;
    }

    if(NULL == (rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL,NULL)))
    {
        printf( "PEM_read_RSAPrivateKey error\n");
        fclose(fp);
        goto error;
    }

/* 打开file_in文件内容,创建file_out文件 */
    in = BIO_new_file(file_in, "rb");
    if (NULL == in) {
        printf("BIO_new_file: open file_in file fail\n");
        ret = ERR_KEY_EN_OPEN;
        goto error;
    }

    out = BIO_new_file(file_out, "wb");
    if (NULL == out) {
        printf("BIO_new_file: open file_out file fail\n");
        ret = ERR_KEY_DE_OPEN;
        goto error;
    }

    keysize = RSA_size(rsa);
    if (keysize < 0) {
        printf("RSA_size key size is %d\n", keysize);
        ret = ERR_RSA_SIZE;
        goto error;
    }

    rsa_in = (unsigned char *)OPENSSL_malloc(keysize * 2);
    if (rsa_in == NULL){
        perror("OPENSSL_malloc ras in fail\n");
        ret = ERR_RSAIN_MALLOC;
        goto error;
    }
    rsa_out = (unsigned char *)OPENSSL_malloc(keysize);
    if (rsa_out == NULL) {
        perror("OPENSSL_malloc ras out fail\n");
        ret = ERR_RSAOUT_MALLOC;
        goto error;
    }

    // Read ENCYRPTED_FILE
    rsa_inlen = BIO_read(in, rsa_in, keysize * 2);
    if (rsa_inlen < 0) {
        perror("BIO_read Fail: \n");
        ret = ERR_KEY_EN_R;
        goto error;
    }

/* 使用公钥验签,写入file_out文件 */
    len = RSA_public_decrypt(rsa_inlen, rsa_in, rsa_out, rsa, RSA_PKCS1_PADDING);
    if (len < 0) {
        perror("Decrypt Fail: \n");
        ret = ERR_KEY_DE;
        goto error;
    }

    // Write DECRYPTED_FILE
    rsa_outlen = BIO_write(out, rsa_out, len);
    if (rsa_outlen < 0) {
        perror("BIO_write Fail: \n");
         ret = ERR_KEY_DE_W;
        goto error;
    }
    printf("verify success!\n");

error:
    if (NULL != fp) fclose(fp);
    if (rsa) RSA_free(rsa);
    if (in) BIO_free(in);
    if (out) BIO_free_all(out);
    if (rsa_in) OPENSSL_free(rsa_in);
    if (rsa_out) OPENSSL_free(rsa_out);

    return ret;
}

  • openssl_rsa.h
#ifndef _OPENSSL_RSA_H_
#define _OPENSSL_RSA_H_

#include <openssl/x509.h>
#include <openssl/x509_vfy.h>
#include <openssl/pem.h>
#include <openssl/err.h>

#define ERR_NONE                     0

// DECRYPT
#define ERR_EMMC_KEY_OPEN            0x01
#define ERR_EMMC_KEY_WRITE           0x02
#define ERR_EMMC_KEY_SIZE            0x03
#define ERR_FILE_KEY_OPEN            0x03
#define ERR_FILE_KEY_READ            0x04
#define ERR_KEY_EN_OPEN              0x05
#define ERR_KEY_DE_OPEN              0x06
#define ERR_RSA_SIZE                 0x07
#define ERR_RSAIN_MALLOC             0x08
#define ERR_RSAOUT_MALLOC            0x09
#define ERR_KEY_DE                   0x0A
#define ERR_KEY_EN_R                 0x0B
#define ERR_KEY_DE_W                 0x0C
#define ERR_AES_TK                   0x0D
#define ERR_FILE_EN_OPEN             0x0E
#define ERR_FILE_DE_INIT             0x0F
#define ERR_FILE_DE_UPDATE           0x10
#define ERR_FILE_DE_OPEN             0x11
#define ERR_FILE_DE_W                0x12
#define ERR_FILE_DE_FINAL            0x13


void rsa_init(void);
int rsa_sign(const char *key, const char *file_in, const char *file_out);
int rsa_verify(const char *public, const char *file_in,const char *file_out);

#endif
  • main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "openssl_rsa.h"


int main(int argc, char **argv)
{
	int i;
	char acOpt[96] = {0};
	char acKey[96] = {0};
	char acFile_in[96] = {0};
    char acFile_Out[96] = {0};

	if (argc != 5) {
		printf("usage: ./app -sign|-verify key in out");
		return -1;
	}

	strcpy(acKey, argv[2]);
	strcpy(acFile_in, argv[3]);
    strcpy(acFile_Out, argv[4]);

	printf("key: %s\n", acKey);
    printf("input file: %s\n", acFile_in);
	printf("output file: %s\n", acFile_Out);

	if (strcmp(argv[1], "-sign") == 0) {
		rsa_sign(acKey, acFile_in, acFile_Out);
	} else if (strcmp(argv[1], "-verify") == 0) {
		rsa_verify(acKey, acFile_in, acFile_Out);
	} else {
		printf("usage: ./app -sign|-verify key in out");
		return -1;
	}

	return 0;
}

1.2 编译

$ gcc -o rsa_test main.c openssl_rsa.c -lcrypto

编译生成可执行程序 rsa_test

1.3 测试验证

$ ./rsa_test -sign private.key file.txt file.sign                #签名

使用private.key私钥对file.txt文件签名,生成file.sign

$ ./rsa_test -verify public.key file.sign out.txt                #验签

使用public.key公钥对file.sign签名文件验签,将输出的文件打印出来,内容与签名前的file.txt相同,验证OK。

2、加密、解密

2.1 C代码实现

代码下载链接:https://download.csdn.net/download/hinewcc/89484462

加密、解密 与 签名、验签 的代码基本相同,差异地方如下:

 1)公钥能实现验签/加密功能,加密、验签调用的函数不同:

  • RSA_public_decrypt:用公钥解密(验签)
  • RSA_public_encrypt:用公钥加密

 2)私钥能实现签名/解密功能,签名、解密调用的函数不同:

  • RSA_private_encrypt:用私钥加密(签名)
  • RSA_private_decrypt:用私钥解密

openssl_rsa.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <error.h>
#include "openssl_rsa.h"

void rsa_init(void)
{
    printf("rsa init ... \n");
    OpenSSL_add_all_algorithms();
}

/*
*****************************************************************************************
*	函 数 名: rsa_decrypt
*	功能说明: RSA使用私钥解密
*	形    参:   key         :   私钥
*               file_in     :   输入需要签名的文件
*               file_out   :   签名后生成的文件
*	返 回 值: 0:成功, 其他:失败
*****************************************************************************************
*/
int rsa_decrypt(const char *key, const char *file_in, const char *file_out)
{
    int ret = -1;
    int keysize = 0;
    RSA *rsa = NULL;
    BIO *in = NULL, *out = NULL;
    unsigned char *rsa_in = NULL, *rsa_out = NULL;
    int rsa_inlen = 0, rsa_outlen = 0, len = 0;

/* 从私钥提取 RSA */
    FILE *fp = fopen(key, "r");
    if (NULL == fp) {
        perror("Open Key Error: \n");
        return -1;
    }

    rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL,NULL);
    if (!rsa) {
        perror("EVP_PKEY_get1_RSA Error: \n");
        goto error;
    }

/* 打开file_in文件内容,创建file_out文件 */
    in = BIO_new_file(file_in, "rb");
    if (NULL == in) {
        printf("BIO_new_file: open source file fail\n");
        goto error;
    }

    out = BIO_new_file(file_out, "wb");
    if (NULL == out) {
        printf("BIO_new_file: open file_out file fail\n");
        goto error;
    }

    keysize = RSA_size(rsa);
    if (keysize < 0) {
        printf("RSA_size key size is %d\n", keysize);
        goto error;
    }

    rsa_in =(unsigned char *)OPENSSL_malloc(keysize * 2);
    if (rsa_in == NULL){
        perror("OPENSSL_malloc ras in fail\n");
        goto error;
    }

    rsa_out =(unsigned char *)OPENSSL_malloc(keysize);
    if (rsa_out == NULL){
        perror("OPENSSL_malloc ras out fail\n");
        goto error;
    }

    rsa_inlen = BIO_read(in, rsa_in, keysize * 2);
    if (rsa_inlen < 0) {
        perror("BIO_read Fail: \n");
        goto error;
    }

/* 使用私钥解密,写入file_out文件 */
    len = RSA_private_decrypt(rsa_inlen, rsa_in, rsa_out, rsa, RSA_PKCS1_PADDING);
    if (len < 0) {
        perror("RSA_encrypt Fail: \n");
        goto error;
    }

    rsa_outlen = BIO_write(out, rsa_out, len);
    if (rsa_outlen < 0) {
        perror("BIO_write Fail: \n");
        goto error;
    }
    ret = 0;
    printf("sign success!\n");

error:
    if (NULL != fp) fclose(fp);
    if (rsa) RSA_free(rsa);
    if (in) BIO_free(in);
    if (out) BIO_free_all(out);
    if (rsa_in) OPENSSL_free(rsa_in);
    if (rsa_out) OPENSSL_free(rsa_out);

    return ret;
}

/*
*****************************************************************************************
*	函 数 名: rsa_encrypt
*	功能说明: RSA使用公钥加密
*	形    参:   key         :   公钥
*               file_in     :   输入需要签名的文件
*               file_out   :   签名后生成的文件
*	返 回 值: 0:成功, 其他:失败
*****************************************************************************************
*/
int rsa_encrypt(const char *public, const char *file_in,const char *file_out)
{
    int ret = ERR_NONE;
    int keysize = 0;
    RSA* rsa = NULL;
    BIO* in = NULL, *out = NULL;
    unsigned char* rsa_in = NULL, *rsa_out = NULL;
    int rsa_inlen = 0, rsa_outlen = 0, len = 0;

/* 从公钥提取 RSA */
    FILE *fp = fopen(public, "rb");
    if (NULL == fp) {
        perror("Open Key Error: \n");
        return -1;
    }

    if(NULL == (rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL,NULL)))
    {
        printf( "PEM_read_RSAPrivateKey error\n");
        fclose(fp);
        goto error;
    }

/* 打开file_in文件内容,创建file_out文件 */
    in = BIO_new_file(file_in, "rb");
    if (NULL == in) {
        printf("BIO_new_file: open file_in file fail\n");
        ret = ERR_KEY_EN_OPEN;
        goto error;
    }

    out = BIO_new_file(file_out, "wb");
    if (NULL == out) {
        printf("BIO_new_file: open file_out file fail\n");
        ret = ERR_KEY_DE_OPEN;
        goto error;
    }

    keysize = RSA_size(rsa);
    if (keysize < 0) {
        printf("RSA_size key size is %d\n", keysize);
        ret = ERR_RSA_SIZE;
        goto error;
    }

    rsa_in = (unsigned char *)OPENSSL_malloc(keysize * 2);
    if (rsa_in == NULL){
        perror("OPENSSL_malloc ras in fail\n");
        ret = ERR_RSAIN_MALLOC;
        goto error;
    }
    rsa_out = (unsigned char *)OPENSSL_malloc(keysize);
    if (rsa_out == NULL) {
        perror("OPENSSL_malloc ras out fail\n");
        ret = ERR_RSAOUT_MALLOC;
        goto error;
    }

    // Read ENCYRPTED_FILE
    rsa_inlen = BIO_read(in, rsa_in, keysize * 2);
    if (rsa_inlen < 0) {
        perror("BIO_read Fail: \n");
        ret = ERR_KEY_EN_R;
        goto error;
    }

/* 使用公钥加密,写入file_out文件 */
    len = RSA_public_encrypt(rsa_inlen, rsa_in, rsa_out, rsa, RSA_PKCS1_PADDING);
    if (len < 0) {
        perror("Decrypt Fail: \n");
        ret = ERR_KEY_DE;
        goto error;
    }

    // Write DECRYPTED_FILE
    rsa_outlen = BIO_write(out, rsa_out, len);
    if (rsa_outlen < 0) {
        perror("BIO_write Fail: \n");
         ret = ERR_KEY_DE_W;
        goto error;
    }
    printf("verify success!\n");

error:
    if (NULL != fp) fclose(fp);
    if (rsa) RSA_free(rsa);
    if (in) BIO_free(in);
    if (out) BIO_free_all(out);
    if (rsa_in) OPENSSL_free(rsa_in);
    if (rsa_out) OPENSSL_free(rsa_out);

    return ret;
}

openssl_rsa.h

#ifndef _OPENSSL_RSA_H_
#define _OPENSSL_RSA_H_

#include <openssl/x509.h>
#include <openssl/x509_vfy.h>
#include <openssl/pem.h>
#include <openssl/err.h>

#define ERR_NONE                     0

// DECRYPT
#define ERR_EMMC_KEY_OPEN            0x01
#define ERR_EMMC_KEY_WRITE           0x02
#define ERR_EMMC_KEY_SIZE            0x03
#define ERR_FILE_KEY_OPEN            0x03
#define ERR_FILE_KEY_READ            0x04
#define ERR_KEY_EN_OPEN              0x05
#define ERR_KEY_DE_OPEN              0x06
#define ERR_RSA_SIZE                 0x07
#define ERR_RSAIN_MALLOC             0x08
#define ERR_RSAOUT_MALLOC            0x09
#define ERR_KEY_DE                   0x0A
#define ERR_KEY_EN_R                 0x0B
#define ERR_KEY_DE_W                 0x0C
#define ERR_AES_TK                   0x0D
#define ERR_FILE_EN_OPEN             0x0E
#define ERR_FILE_DE_INIT             0x0F
#define ERR_FILE_DE_UPDATE           0x10
#define ERR_FILE_DE_OPEN             0x11
#define ERR_FILE_DE_W                0x12
#define ERR_FILE_DE_FINAL            0x13


void rsa_init(void);
int rsa_decrypt(const char *key, const char *file_in, const char *file_out);
int rsa_encrypt(const char *public, const char *file_in,const char *file_out);

#endif

main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "openssl_rsa.h"


int main(int argc, char **argv)
{
	int i;
	char acOpt[96] = {0};
	char acKey[96] = {0};
	char acFile_in[96] = {0};
    char acFile_Out[96] = {0};

	if (argc != 5) {
		printf("usage: ./app -encrypt|-decrypt key in out");
		return -1;
	}

	strcpy(acKey, argv[2]);
	strcpy(acFile_in, argv[3]);
    strcpy(acFile_Out, argv[4]);

	printf("key: %s\n", acKey);
    printf("input file: %s\n", acFile_in);
	printf("output file: %s\n", acFile_Out);

	if (strcmp(argv[1], "-encrypt") == 0) {			//加密
		rsa_encrypt(acKey, acFile_in, acFile_Out);
	} else if (strcmp(argv[1], "-decrypt") == 0) {
		rsa_decrypt(acKey, acFile_in, acFile_Out);
	} else {
		printf("usage: ./app -encrypt|-decrypt key in out");
		return -1;
	}

    printf("success!!!\n");

	return 0;
}

2.2 编译

$ gcc -o rsa_test main.c openssl_rsa.c -lcrypto

2.3 测试过程

同上,不再赘述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

『Z-Workshop』 6月22日线下ALCOVE分享活动

2024 求是创新 ZJUBCA Sponsored by the ALCOVE Community TIME&#xff1a;2024/06/22 ADD&#xff1a;浙江大学紫金港校区 --- Alcove 是 Aptos 公链与 Alibaba Cloud 共同打造的亚洲首个 Move 开发者社区&#xff0c;致力于支持开发者使用 Move 语言构建下一代 Web3 应用&am…

UE4_材质_水涟漪、水深制作_Ben教程

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff0c;祝愿生活越来越好&#xff01; 效果图如下&#xff1a; 创建水材质的教程&#xff0c;首先需要外出收集一些参考&#xff0c;看一看你将要做的事情很重要&#xff0c;确定将要模仿物体的关键属性&#xff0c;从这…

Java网络编程(JavaWeb的基础)

Java网络编程&#xff08;JavaWeb的基础&#xff09; 文章目录 Java网络编程&#xff08;JavaWeb的基础&#xff09;前言一、网络编程概述1.1 软件架构&网络基础1.2 网络通信要素:IP/端口/通信协议1.3 传输层协议:tcp/udp 二、网络编程API2.1 InetAddress类2.2 Socket类&am…

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、南…

如何找到正确的网络钓鱼目标

在深入研究联系人收集之前&#xff0c;我们希望确保对可用的攻击面有一个清晰的了解。我见过许多渗透测试者只获取客户端提供的主域&#xff0c;通过 theHarvester、linkedInt、maltego 等运行它&#xff0c;并将输出称为目标列表。在这样做的过程中&#xff0c;这些渗透测试机…

云效BizDevOps上手亲测

云效BizDevOps上手亲测 什么是云效项目协作Projex配置2023业务空间原始诉求字段原始诉求工作流创建原始诉求配置2023产品空间创建主题业务原始诉求关联主题配置2023研发空间新建需求需求关联主题 与传统区别云效开发流程传统开发流程云效BizDevOps 操作体验 什么是云效 在说到…

203. 移除链表元素【链表】【C++】

题目描述 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#x…

Labview_Occurrencel(事件发生)

PS&#xff1a;这里遇到 一个很Low的事情&#xff1a; 在停止第二个while循环的时候出现了停止不了的情况。因为等待事件发生设置的超时时间为:-1。所以等事件发生后出现了条件接线端已经执行的情况&#xff0c;所以当下次事件发生时未能及时停止。初版的停止设置如下图&#x…

AI赋能视频剪辑师:人工智能时代,视频剪辑师该如何剪辑?

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;视频剪辑行业也不例外。在这个全新的时代&#xff0c;AI技术为视频剪辑师带来了前所未有的便利和创新空间。那么&#xff0c;在人工智能时代&#xff0c;视频剪辑师…

红海云签约联东集团,引领产业园区领军企业人力资源数字化新范式

北京联东投资&#xff08;集团&#xff09;有限公司&#xff08;以下简称“联东集团”&#xff09;是集产业园区运营、模板钢结构和投资业务为一体的集团化公司。联东集团独创了产业聚合U模式&#xff0c;致力于打造产业集聚平台&#xff0c;服务于实体企业成长和地区经济发展。…

数据结构与算法笔记:高级篇 - 向量空间:如何实现一个简单的音乐推荐系统?

概述 很多人喜都喜爱听歌&#xff0c;以前我们用 MP3 听歌&#xff0c;现在直接通过音乐 App 在线就能听歌。而且&#xff0c;各种音乐 App 的功能越来越强大&#xff0c;不仅可以自己选歌听&#xff0c;还可以根据你听歌的喜好&#xff0c;给你推荐你可能会喜好的音乐&#x…

文件安全存储面临的三大困扰?企业可轻松一键解决

企业文件存储是企业生产经营要解决的基础性问题&#xff0c;一般来说&#xff0c;企业常见的文件存储方式有如下几种&#xff1a; 直接附加存储&#xff08;DAS&#xff09;&#xff1a; 特点&#xff1a;数据备份和恢复会占用服务器主机资源&#xff08;如CPU、系统IO等&…

推荐一个shp修复工具

我们在《如何解决ArcGIS中数据显示乱码问题》一文中&#xff0c;为你分享过打开shp文件的乱码问题。 现在再为你分享一个shp文件的修复工具&#xff0c;你可以在文末查看该工具的领取方式。 shp文件修复工具 Shapefile&#xff08;简称SHP&#xff09;是Esri推出的一种广泛使…

Centos安装Snaped

本人操作系统为Centos 7 1. 安装epel 和 copr yum #第一步安装epel sudo yum install epel-release #第二步安装copr sudo yum install yum-plugin-copr 2. 添加存储库 sudo yum copr enable ngompa/snapcore-el7 3. 安装snapd软件包 sudo yum -y install snapd 等待安装完…

PDF处理篇:有哪些免费的PDF注释工具

PDF 是一种功能强大的格式&#xff0c;广泛用于处理和传输数据。您可以创建自己的 PDF 文件&#xff0c;也可以使用其他人创建的 PDF 文件。但是&#xff0c;有时您想在 PDF 文件中包含其他文本、图形和其他元素。这就是 PDF 注释器为您提供帮助的地方。 有许多可用的 PDF 注释…

去掉window11设备和驱动器中的百度网盘图标

背景 window系统设备驱动器中显示百度网盘图标&#xff0c;个人强迫症&#xff0c;要去掉&#xff01;&#xff01;&#xff01; 去掉window11->设备和驱动器->百度网盘 的图标 登录百度网盘点击”同步“ 点击设置 在基本设置里面去掉勾选“在我的电脑中显示百度网盘…

Node.js全栈指南:认识MIME和HTTP

MIME&#xff0c;全称 “多用途互联网邮件扩展类型”。 这名称相当学术&#xff0c;用人话来说就是&#xff1a; 我们浏览一个网页的时候&#xff0c;之所以能看到 html 文件展示成网页&#xff0c;图片可以正常显示&#xff0c;css 样式能正常影响网页效果&#xff0c;js 脚…

这5款Windows高质量软件,吊打付费,谁用谁爽

咱们话不多说&#xff0c;进入我的电脑。 一键远控 一个支持远程控制电脑、传输文件、观看视频、锁定电脑屏幕以及重启和关机的免费远程控制软件。 再输入对应的设备识别码和验证码后&#xff0c;就可以对另一台电脑进行各种操作&#xff0c;同时也支持多台设备同时也能控制。…

JOSEF约瑟 JOXL-J拉绳开关 整定范围宽

用途 双向拉绳开关的壳体采用金属材料铸造&#xff0c;具有足够的机械强度,抵抗并下工作时脱落的岩石&#xff0c;爆块等物体的撞击不被破坏&#xff0c;当胶带输送机发生紧急事故时&#xff0c;启动拉绳开关,可立即停机报警&#xff0c;防止事故的扩大,保证工作现场的人身安全…

杀手级AI应用前瞻,一文带你了解8个ai大语言模型

一、大模型解析&#xff08;LLM、MLLM、GLM&#xff09; 基础概念&#xff1a; Transformer&#xff1a;ChatGPT的核心结构是Transformer&#xff0c;这是一种采用自注意力机制的深度学习模型。通过自注意力机制&#xff0c;Transformer能够理解输入文本的上下文信息&#xf…