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_FILErsa_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_FILErsa_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            0x13void 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_FILErsa_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_FILErsa_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            0x13void 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 测试过程

同上,不再赘述

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

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

相关文章

前端 CSS 经典:mix-blend-mode 属性

前言&#xff1a;这是一个混合属性&#xff0c;作用是将两个颜色混合生成一个新颜色。可以将视频和文字相融合&#xff0c;产生动态文字效果。 效果 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" />&l…

cuav系列飞控关于MAIN-IO 的输出数量控制

在无人机设置中&#xff0c;经常涉及到使用AUX辅助通道来控制附属设备&#xff0c;或者直接把主控输出通道放到AUX。但是CUAV系列飞控按照常规设置并不能正常启用AUX输出&#xff0c;通过查看飞控源码找到 原因 一些机型例如24001使用了12个电机&#xff0c;常规主通道只有8个&…

【神经网络】CNN网络:深入理解卷积神经网络

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&#xff01; CNN网络&#xff1a;深入理解…

常用的企业级快速传输大文件平台

在当今企业运营中&#xff0c;数据管理成了一项不可或缺的任务。企业每日需处理庞大的数据量&#xff0c;这包括高清视频、大量数据集和复杂的设计图纸等大型文件。然而&#xff0c;传统的文件传输手段&#xff0c;比如通过电子邮件发送附件或使用FTP服务&#xff0c;已经难以满…

完成一个有趣的Web期末大作业(html、css、javascript、MySQL、Node.js)

题目&#xff1a;学校老师的要求很开放&#xff0c;要自己做一个感兴趣的网页&#xff0c;要求使用基础的html、css和javascript&#xff0c;后端要使用数据库。 网上都是各种管理系统&#xff0c;看多了觉得没啥意思&#xff0c;要做一个自己感兴趣的网站。近几年沉迷犬夜叉这…

“论大数据处理架构及其应用”写作框架,软考高级,系统架构设计师

论文真题 大数据处理架构是专门用于处理和分析巨量复杂数据集的软件架构。它通常包括数据收集、存储、处理、分析和可视化等多个层面&#xff0c;旨在从海量、多样化的数据中提取有价值的信息。Lambda架构是大数据平台里最成熟、最稳定的架构&#xff0c;它是一种将批处理和流…

AI图书下载:《ChatGPT百万富翁-最快赚钱之道》

《ChatGPT百万富翁-最快赚钱之道》&#xff08;ChatGPT Millionaire. The Fastest Way To Make Real Money&#xff09;是一本集合了五本书内容的作品&#xff0c;由Harper Hanz编写&#xff0c;旨在探讨如何利用ChatGPT这一强大的自然语言处理系统创造被动收入。 以下是该书各…

Mysql索引和事务

一、索引是做什么的? 很多时候&#xff0c;当你的应用程序进行SQL查询速度很慢时&#xff0c;应该想想是否可以建索引。 大多数MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)在B树中存储。只是空间列类型的索引使用R-树&#xff0c;并且MEMORY表还支持hash索引。 索引是…

Ubuntu-22.04 安装禅道

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

螺栓的拧紧扭矩计算

对于采用控制扭矩方式拧紧的螺栓连接而言&#xff0c;螺栓扭矩是一个非常重要的参数&#xff0c;扭矩的大小决定了螺栓预紧力的大小&#xff0c;而螺栓预紧力又是预紧型螺栓连接的灵魂。前文讨论了螺栓扭矩的校验&#xff0c;即如何验证螺栓扭矩是否满足设计要求&#xff0c;与…

python-登录界面-demo

文章目录 前言python-登录界面-demo 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! python-…

Flask之表单

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、HTML表单 二、使用Flask-WTF处理表单 2.1、定义WTForms表单类 2.2、输出HTML代码 2.3、在模板中渲染表单 三、处理表单数据 3.1、提…

geojson文件默认已有的style会导致webGL渲染错误处理办法

geojson文件默认已有的style会导致webGL渲染错误处理办法 相关链接&#xff1a; 功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 代码&#xff1a; export function showDraw(isFlyTo) {removeLayer()graphicLayer new mars3d.layer.GeoJsonLayer({data: {type: &quo…

有两个长方柱,其高、宽、长分别为12,20,25;10,14,20。求它们的体积。编写一个基于对象的程序,在类中用带参数的构造函数对数据成员初始化

在上一篇文章中的构造函数不带参数&#xff0c;在函数体中对数据成员赋初值。这种方式使该类的每一个对象的数据成员都得到同一组初值&#xff08;例中各个对象的数据成员的初值均为0)。但有时用户希望对不同的对象赋予不同的初值&#xff0c;这时就无法使用上面的办法来解决了…

Open AI 前 Superalignment部门研究员Leopold Aschenbrenner的关于Superintelligence担忧的真挚长文

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

理解MySQL数据库主键:从基础概念到实践

一、前言 在关系型数据库中&#xff0c;主键&#xff08;Primary Key&#xff09;是一个至关重要的概念。它不仅用于唯一标识表中的每一行数据&#xff0c;还在保证数据完整性和执行高效查询方面发挥着重要作用。本篇文章将深入探讨MySQL数据库主键的相关知识&#xff0c;包括…

基于ESP8266串口WIFI模块ESP-01S在Station模式(即接收无线信号( WiFi))下实现STC单片机与手机端网路串口助手相互通信功能

基于ESP8266串口WIFI模块ESP-01S在Station模式(即接收无线信号( WiFi))下实现STC单片机与手机端网路串口助手相互通信功能 ESP8266_01S引脚功能图ESP8266_01S原理图ESP8266_01S尺寸图检验工作1、USB-TTL串口工具(推荐使用搭载CP2102芯片的安信可USB-T1串口)与ESP8266_01S…

基于前馈神经网络的姓氏分类任务(基础)

1、认识前馈神经网络 What is it 图1-1 前馈神经网络结构 人们大多使用多层感知机&#xff08;英语&#xff1a;Multilayer Perceptron&#xff0c;缩写&#xff1a;MLP&#xff09;作为前馈神经网络的代名词&#xff0c;但是除了MLP之外&#xff0c;卷积神经网络&#xff08…

Orangepi Zero2使用外设驱动库wiringOP驱动蜂鸣器

目录 一、安装外设驱动库 1.1 wiringPi外设SDK安装&#xff1a; 二、使用wiringOP库驱动蜂鸣器 2.1 蜂鸣器的硬件连接&#xff1a; 2.2 使用wiringOP库实现蜂鸣器滴滴响&#xff1a; 2.3 设置vim代码显示格式&#xff1a; 一、安装外设驱动库 1.1 wiringPi外设SDK安装&a…

Free Pascal语言基础学习:定义变量、数据类型、循环语句、case语句、条件判断、with语句、运算符

Pascal是一种结构化编程语言&#xff0c;而Free Pascal作为其现代编译器&#xff0c;不仅支持跨多种操作系统和处理器架构&#xff0c;还提供了高效的内存使用和函数重载等先进功能。Free Pascal继承了Pascal语言的核心特性&#xff0c;同时进行了扩展和优化&#xff0c;使其成…