C语言实现RSA算法加解密
使用c语言实现了RSA加解密算法,可以加解密文件和字符串。
rsa算法原理
- 选择两个大素数p和q;
- 计算n = p * q;
- 计算φ(n)=(p-1)(q-1);
- 选择与φ(n)互素的整数d;
- 由de=1 mod φ(n)计算得到e;
- 公钥是(e, n), 私钥是(d, n);
- 假设明文是M(一个整数),则密文C =
mod n,此为加密过程; - 解密过程为M =
mod n;
rsa.h
#pragma once
#include <iostream>
#include <fstream>
#include <tommath.h>
#include <time.h>
#include <Windows.h>
#include <string>#define SUBKEY_LENGTH 78 // >512 bit#define FILE_NAME_LENGTH 99#define PLAINTEXT_LENGTH 64#define BINARY_LENGTH 512using namespace std;void initial();int Get_char_bit(char c, int pos);void Create_prime_number(mp_int *number);void Generate_key(char *key_name);void Write_key_2_File(char *file_name, mp_int *key, mp_int *n);void ADD_0(char *binary, int mode);void rsa_decrypt(char *src, char *dst, char *key_name, int mode);void rsa_encrypt(char *src, char *dst, char *key_name, int mode);void mp_print(mp_int *number);void Get_key_from_file(mp_int *key, mp_int *n, char *key_name, int mode);void Create_number(mp_int *number, int mode);int Miller_rabin(mp_int *number);void Char_2_binary(char *text, char *binary, int len);void Binary_2_char(char *binary, char *text, int binary_len);void quick_pow(mp_int *a, mp_int *b, mp_int *c, mp_int *d);int Get_file_length(char *filename);
rsa.cpp
#include "rsa.h"mp_int two;
mp_int five;
mp_int zero;
mp_int one;int Get_char_bit(char c, int pos)
{return ((c >> (7 - pos)) & 1);
}// mode 0: number of n digits
// mode 1: 2 <= number <= n - 2 for miller rabin test
void Create_number(mp_int *number, int mode)
{int i;srand((unsigned)time(NULL));char temp_number[SUBKEY_LENGTH + 1];temp_number[0] = rand() % 9 + 1 + 48;if (0 == mode){int temp;for (i = 1; i <= SUBKEY_LENGTH - 2; i++)temp_number[i] = rand() % 10 + 48;temp = rand() % 10;if (0 == temp % 2)temp++;if (5 == temp)temp = 7;temp_number[SUBKEY_LENGTH - 1] = temp + 48;temp_number[SUBKEY_LENGTH] = '\0';}else if (1 == mode){int digit = rand() % (SUBKEY_LENGTH - 2) + 2;for (i = 1; i <= digit - 1; i++)temp_number[i] = rand() % 10 + 48;temp_number[digit] = '\0';}mp_read_radix(number, temp_number, 10);
}int Miller_rabin(mp_int *number)
{int result;mp_int base;mp_init_size(&base, SUBKEY_LENGTH);Create_number(&base, 1);mp_prime_miller_rabin(number, &base, &result);mp_clear(&base);return result;
}void Create_prime_number(mp_int *number)
{mp_int r;mp_init(&r);int time = 100;int result;int i;Create_number(number, 0);while (1){mp_prime_is_divisible(number, &result);if (0 != result){do{mp_add(number, &two, number);mp_mod(number, &five, &r);} while (MP_EQ == mp_cmp_mag(&zero, &r));continue;}for (i = 0; i < time; i++){if (!Miller_rabin(number))break;}if (i == time)return;else{do{mp_add(number, &two, number);mp_mod(number, &five, &r);} while (MP_EQ == mp_cmp_mag(&zero, &r));}}
}void Generate_key(char *key_name)
{mp_int p, q, n, f, e, d;mp_init_size(&p, SUBKEY_LENGTH);mp_init_size(&q, SUBKEY_LENGTH);mp_init_size(&n, SUBKEY_LENGTH * 2);mp_init_size(&f, SUBKEY_LENGTH * 2);mp_init_size(&d, SUBKEY_LENGTH * 2);mp_init_size(&e, SUBKEY_LENGTH * 2);Create_prime_number(&p);Sleep(1000);Create_prime_number(&q);mp_mul(&p, &q, &n);mp_sub(&p, &one, &p);mp_sub(&q, &one, &q);mp_mul(&p, &q, &f);mp_set_int(&d, 127);mp_int gcd;mp_init_size(&gcd, SUBKEY_LENGTH * 2);do{mp_add(&d, &two, &d);mp_gcd(&d, &f, &gcd);} while (MP_EQ != mp_cmp_mag(&gcd, &one));mp_invmod(&d, &f, &e);char PUBLIC_KEY[FILE_NAME_LENGTH] = "d:\\public_key_";char PRIVATE_KEY[FILE_NAME_LENGTH] = "d:\\private_key_";strcat(PUBLIC_KEY, key_name);strcat(PRIVATE_KEY, key_name);Write_key_2_File(PUBLIC_KEY, &d, &n);Write_key_2_File(PRIVATE_KEY, &e, &n);mp_clear_multi(&p, &q, &e, &d, &f, &n, &gcd, NULL);
}void initial()
{mp_init_set_int(&two, 2);mp_init_set_int(&five, 5);mp_init_set_int(&zero, 0);mp_init_set_int(&one, 1);
}void Write_key_2_File(char *file_name, mp_int *key, mp_int *n)
{remove(file_name);FILE *fp = fopen(file_name, "w+");if (NULL == fp){cout << "open file error!" << endl;return;}char key_str[SUBKEY_LENGTH * 2 + 1];char n_str[SUBKEY_LENGTH * 2 + 1];mp_toradix(key, key_str, 10);mp_toradix(n, n_str, 10);fprintf(fp, "%s\n", n_str);fprintf(fp, "%s", key_str);fclose(fp);
}void mp_print(mp_int *number)
{char str[SUBKEY_LENGTH * 2 + 1];mp_toradix(number, str, 10);cout << str << endl;
}// mode 0: get public key
// mode 1: get private keyvoid Get_key_from_file(mp_int *key, mp_int *n, char *key_name, int mode)
{FILE *fp = NULL;char PUBLIC_KEY[FILE_NAME_LENGTH] = "";char PRIVATE_KEY[FILE_NAME_LENGTH] = "";if (0 == mode){strcat(PUBLIC_KEY, key_name);fp = fopen(PUBLIC_KEY, "r+");}else if (1 == mode){strcat(PRIVATE_KEY, key_name);fp = fopen(PRIVATE_KEY, "r+");}if (NULL == fp){cout << "open file error!" << endl;return;}char key_str[SUBKEY_LENGTH * 2 + 1];char n_str[SUBKEY_LENGTH * 2 + 1];fscanf(fp, "%s\n", n_str);fscanf(fp, "%s", key_str);mp_read_radix(n, n_str, 10);mp_read_radix(key, key_str, 10);fclose(fp);
}void Char_2_binary(char *text, char *binary, int len)
{int i;int j;int k = 0;for (i = 0; i <= len - 1; i++){for (j = 0; j <= 7; j++)binary[k++] = Get_char_bit(text[i], j) + '0';}binary[k] = '\0';
}void Binary_2_char(char *binary, char *text, int binary_len)
{int i;int j = 0;int k = 0;int sum = 0;for (i = 0; i <= binary_len - 1; i++){sum = sum + pow(2, 7 - j)*(int)((binary[i]) - '0');j++;if (8 == j){text[k++] = sum;sum = 0;j = 0;}}
}// mode 0: encrypt char*
// mode 1: encrypt file
void rsa_encrypt(char *src, char *dst, char *key_name, int mode)
{mp_int n;mp_int public_key;mp_int plain_number;mp_int cipher_number;mp_init_size(&n, SUBKEY_LENGTH * 2);mp_init_size(&public_key, SUBKEY_LENGTH * 2);mp_init_size(&plain_number, SUBKEY_LENGTH * 2);mp_init_size(&cipher_number, SUBKEY_LENGTH * 2);Get_key_from_file(&public_key, &n, key_name, 0);char plain_text[PLAINTEXT_LENGTH + 1];char cipher_text[PLAINTEXT_LENGTH + 2];char plain_binary[BINARY_LENGTH + 1];char cipher_binary[BINARY_LENGTH + 9];int i;int j;int k;int l;if (0 == mode){int round = ceil(strlen(src) / 64.0);for (i = 0; i < round; i++){for (l = 0; l <= BINARY_LENGTH; l++)plain_binary[l] = '\0';for (l = 0; l <= BINARY_LENGTH + 8; l++)cipher_binary[l] = '\0';for (l = 0; l <= PLAINTEXT_LENGTH; l++)plain_text[l] = '\0';for (l = 0; l <= PLAINTEXT_LENGTH + 1; l++)cipher_text[l] = '\0';for (j = 0; j <= PLAINTEXT_LENGTH - 1; j++){plain_text[j] = src[i * PLAINTEXT_LENGTH + j];if ('\0' == plain_text[j]){for (k = j + 1; k <= PLAINTEXT_LENGTH - 1; k++)plain_text[k] = '\0';break;}}plain_text[PLAINTEXT_LENGTH] = '\0';Char_2_binary(plain_text, plain_binary, PLAINTEXT_LENGTH);mp_zero(&plain_number);mp_read_radix(&plain_number, plain_binary, 2);mp_zero(&cipher_number);// ----------------------------------------------------------------mp_exptmod(&plain_number, &public_key, &n, &cipher_number);//quick_pow(&plain_number, &public_key, &n, &cipher_number);// ----------------------------------------------------------------mp_toradix(&cipher_number, cipher_binary, 2);ADD_0(cipher_binary, 0);Binary_2_char(cipher_binary, cipher_text, BINARY_LENGTH + 8);for (l = 0; l <= PLAINTEXT_LENGTH; l++)dst[i*(PLAINTEXT_LENGTH + 1) + l] = cipher_text[l];}dst[round * (PLAINTEXT_LENGTH + 1)] = '\0';mp_clear_multi(&n, &public_key, &plain_number, &cipher_number, NULL);}else if (1 == mode){ifstream fin;ofstream fout;fin.open(src, ios::binary);fout.open(dst, ios::binary);char ch;int i = 0;int len = Get_file_length(src) % 64;fout << len << endl;while (1){fin.get(ch);plain_text[i++] = ch;if (i == PLAINTEXT_LENGTH || fin.eof()){if (i == PLAINTEXT_LENGTH)plain_text[i] = '\0';else{for (k = i - 1; k <= PLAINTEXT_LENGTH; k++)plain_text[k] = '\0';}for (l = 0; l <= BINARY_LENGTH; l++)plain_binary[l] = '\0';for (l = 0; l <= BINARY_LENGTH + 8; l++)cipher_binary[l] = '\0';for (l = 0; l <= PLAINTEXT_LENGTH + 1; l++)cipher_text[l] = '\0';Char_2_binary(plain_text, plain_binary, PLAINTEXT_LENGTH);mp_zero(&plain_number);mp_read_radix(&plain_number, plain_binary, 2);mp_zero(&cipher_number);// ----------------------------------------------------------------mp_exptmod(&plain_number, &public_key, &n, &cipher_number);//quick_pow(&plain_number, &public_key, &n, &cipher_number);// ----------------------------------------------------------------mp_toradix(&cipher_number, cipher_binary, 2);ADD_0(cipher_binary, 0);Binary_2_char(cipher_binary, cipher_text, BINARY_LENGTH + 8);for (l = 0; l <= PLAINTEXT_LENGTH; l++)fout << cipher_text[l];for (l = 0; l <= PLAINTEXT_LENGTH; l++)plain_text[l] = '\0';i = 0;}if (fin.eof())break;}fin.close();fout.close();mp_clear_multi(&n, &public_key, &plain_number, &cipher_number, NULL);}
}// mode 0: for encrypt
// mode 1: for decrypt
void ADD_0(char *binary, int mode)
{int i;int difference;if (0 == mode)difference = BINARY_LENGTH + 8 - strlen(binary);else if(1 == mode)difference = BINARY_LENGTH - strlen(binary);;for (i = strlen(binary); i >= 0; i--)binary[i + difference] = binary[i];for (i = 0; i < difference; i++)binary[i] = '0';
}// mode 0: decrypt char*
// mode 1: decrypt file
void rsa_decrypt(char *src, char *dst, char *key_name, int mode)
{mp_int n;mp_int private_key;mp_int plain_number;mp_int cipher_number;mp_init_size(&n, SUBKEY_LENGTH * 2);mp_init_size(&private_key, SUBKEY_LENGTH * 2);mp_init_size(&plain_number, SUBKEY_LENGTH * 2);mp_init_size(&cipher_number, SUBKEY_LENGTH * 2);Get_key_from_file(&private_key, &n, key_name, 1);char plain_text[PLAINTEXT_LENGTH + 1];char cipher_text[PLAINTEXT_LENGTH + 2];char plain_binary[BINARY_LENGTH + 1];char cipher_binary[BINARY_LENGTH + 9];int j;int k;int l;if (0 == mode){k = -1;do{k++;for (l = 0; l <= PLAINTEXT_LENGTH; l++)plain_text[l] = '\0';for (l = 0; l <= BINARY_LENGTH; l++)plain_binary[l] = '\0';for (l = 0; l <= BINARY_LENGTH + 8; l++)cipher_binary[l] = '\0';for (j = 0; j <= PLAINTEXT_LENGTH; j++)cipher_text[j] = src[k * (PLAINTEXT_LENGTH + 1) + j];cipher_text[PLAINTEXT_LENGTH + 1] = '\0';Char_2_binary(cipher_text, cipher_binary, PLAINTEXT_LENGTH + 1);mp_zero(&cipher_number);mp_read_radix(&cipher_number, cipher_binary, 2);mp_zero(&plain_number);// ----------------------------------------------------------------mp_exptmod(&cipher_number, &private_key, &n, &plain_number);//quick_pow(&cipher_number, &private_key, &n, &plain_number);// ----------------------------------------------------------------mp_toradix(&plain_number, plain_binary, 2);ADD_0(plain_binary, 1);Binary_2_char(plain_binary, plain_text, BINARY_LENGTH);for (l = 0; l <= PLAINTEXT_LENGTH - 1; l++) dst[k*PLAINTEXT_LENGTH + l] = plain_text[l];} while ('\0' != src[(k + 1)*(PLAINTEXT_LENGTH + 1)]);dst[(k + 1) * PLAINTEXT_LENGTH] = '\0';}else if (1 == mode){ifstream fin;ofstream fout;fin.open(src, ios::binary);fout.open(dst, ios::binary);int i = 0;int limit = PLAINTEXT_LENGTH;char ch;string temp = "";while (1){fin.get(ch);if ('\n' == ch)break;temp += ch;}int len = atoi(temp.c_str());while (1){fin.get(ch);cipher_text[i++] = ch;if (i == PLAINTEXT_LENGTH + 1){if (i == PLAINTEXT_LENGTH + 1) cipher_text[i] = '\0';elsecipher_text[i - 1] = '\0';for (l = 0; l <= BINARY_LENGTH + 8; l++)cipher_binary[l] = '\0';for (l = 0; l <= PLAINTEXT_LENGTH; l++)plain_text[l] = '\0';for (l = 0; l <= BINARY_LENGTH; l++)plain_binary[l] = '\0';Char_2_binary(cipher_text, cipher_binary, PLAINTEXT_LENGTH + 1);mp_zero(&cipher_number);mp_read_radix(&cipher_number, cipher_binary, 2);mp_zero(&plain_number);// ----------------------------------------------------------------mp_exptmod(&cipher_number, &private_key, &n, &plain_number);//quick_pow(&cipher_number, &private_key, &n, &plain_number);// ----------------------------------------------------------------mp_toradix(&plain_number, plain_binary, 2);ADD_0(plain_binary, 1);Binary_2_char(plain_binary, plain_text, BINARY_LENGTH);if (fin.peek() == EOF)limit = len;for (l = 0; l < limit; l++)fout << plain_text[l];for (l = 0; l <= PLAINTEXT_LENGTH + 1; l++)cipher_text[l] = '\0';i = 0;}if (fin.eof())break;}fin.close();fout.close();}mp_clear_multi(&n, &private_key, &plain_number, &cipher_number, NULL);
}// compute d = a ^ b (mod c)
void quick_pow(mp_int *a, mp_int *b, mp_int *c, mp_int *d)
{mp_int temp;mp_int temp_a;mp_int temp_b;mp_init_size(&temp, SUBKEY_LENGTH * 2);mp_init_size(&temp_a, SUBKEY_LENGTH * 2);mp_init_size(&temp_b, SUBKEY_LENGTH * 2);mp_copy(a, &temp_a);mp_copy(b, &temp_b);mp_set_int(d, 1);mp_mod(&temp_a, c, &temp_a);while (MP_GT == mp_cmp(&temp_b, &zero)){mp_mod(&temp_b, &two, &temp);if (MP_EQ == mp_cmp(&one, &temp)){mp_mul(d, &temp_a, d);mp_mod(d, c, d);}mp_div_2(&temp_b, &temp_b);mp_mul(&temp_a, &temp_a, &temp_a);mp_mod(&temp_a, c, &temp_a);}mp_clear_multi(&temp, &temp_a, &temp_b, NULL);
}int Get_file_length(char *filename)
{FILE *fp = fopen(filename, "rb");if (NULL == fp)return -1;fseek(fp, 0, SEEK_END);int temp = ftell(fp);fclose(fp);return temp;
}
main.h
#pragma once
#include "rsa.h"
main.cpp
#include "main.h"// example
void main()
{initial();// generate key belong to arg " "Generate_key("hello_world");// ----------------------example: encrypt char* ---------------------------char a[200] = "to_be_or_not_to_be_it_is_a_question";char b[400];char c[200];//rsa_encrypt(a, b, "hello_world", 0);//rsa_decrypt(b, c, "hello_world", 0);cout << "c: " << c << endl;// ------------------------------------------------------------------------// ----------------------example: encrypt file ----------------------------rsa_encrypt("d:\\a.gif", "d:\\m", "d:\\public_key_hello_world", 1);rsa_decrypt("d:\\m", "D:\\b.gif", "d:\\private_key_hello_world", 1);// ------------------------------------------------------------------------}
相关文章:
C语言实现RSA算法加解密
使用c语言实现了RSA加解密算法,可以加解密文件和字符串。 rsa算法原理 选择两个大素数p和q;计算n p * q;计算φ(n)(p-1)(q-1);选择与φ(n)互素的整数d;由de1 mod φ(n)计算得到e;公钥是(e, n), 私钥是(d, n);假设明…...
如何设计前后端分离的系统架构?
如何将前端页面和后端Java代码进行集成? 将前端页面和后端Java代码进行集成通常需要使用一些特定的工具和技术。以下是一些常见的方法: 使用RESTful API:REST(Representational State Transfer)是一种基于HTTP协议构…...
【强化学习】SARAS代码实现
前言 SARAS,假设环境状态和动作状态都是离散的。利用动作价值矩阵来进行行为的预测。其主要就是利用时序差分的思想,对动作价值矩阵进行更新。 代码实现 import gymnasium as gym import numpy as npclass sarsa():def __init__(self, states_n, acti…...
P1019 [NOIP2000 提高组] 单词接龙 刷题笔记
P1019 [NOIP2000 提高组] 单词接龙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路来自 大佬 Chardo 的个人中心 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 匹配 : 将 第一个字符串末尾 和第二个字符串第一个开始匹配 如果 j<i这段走完了 flag还没…...
如何实现WinApp的UI自动化测试?
WinApp(WindowsAPP)是运行在Windows操作系统上的应用程序,通常会提供一个可视的界面,用于和用户交互。例如运行在Windows系统上的Microsoft Office、PyCharm、Visual Studio Code、Chrome,都属于WinApp。常见的WinApp&…...
chrome扩展程序开发之在目标页面运行自己的JS
原文地址:https://qdgithub.com/home/index/article/aid/247.html chrome 插件开发的入门介绍,实现利用 chrome 扩展实现在目标网页运行我们的 js 的功能。关于 chrome 扩展的详细内容,可以通过官网了解。 开发工具很简单,记事本…...
NLP项目之语种识别
目录 1. 代码及解读2. 知识点n-grams仅保留最常见的1000个n-grams。意思是n1000 ? 1. 代码及解读 in_f open(data.csv) lines in_f.readlines() in_f.close() dataset [(line.strip()[:-3], line.strip()[-2:]) for line in lines] print(dataset[:5])[(1 december wereld…...
Linux lpr命令教程:如何使用lpr命令打印文件(附案例详解和注意事项)
Linux lpr命令介绍 lpr命令在Unix-like操作系统中用于提交打印任务。如果在命令行中指定了文件名,那么这些文件将被发送到指定的打印机(如果没有指定目的地,则发送到默认目的地)。如果命令行中没有列出文件,lpr将从标…...
浅谈C语言inline关键字
对于C开发者来说,inline是个再熟悉不过的关键字,因为默认的成员函数都是inline,也是常规高校教材中宣扬C的“优势”之一。 但是C语言其实也是支持inline关键字的,而且是很早期的gcc就支持了该关键字。在Linux0.12版本内核代码中也…...
Flink1.17实战教程(第六篇:容错机制)
系列文章目录 Flink1.17实战教程(第一篇:概念、部署、架构) Flink1.17实战教程(第二篇:DataStream API) Flink1.17实战教程(第三篇:时间和窗口) Flink1.17实战教程&…...
OpenCV实战 -- 维生素药片的检测记数
文章目录 检测记数原图经过操作开始进行消除粘连性--形态学变换总结实现方法1. 读取图片:2. 形态学处理:3. 二值化:4. 提取轮廓:5. 轮廓筛选和计数: 分水岭算法:逐行解释在基于距离变换的分水岭算法中&…...
【AI】注意力机制与深度学习模型
目录 一、注意力机制 二、了解发展历程 2.1 早期萌芽: 2.2 真正意义的注意力机制: 2.3 2015 年及以后: 2.4 自注意力与 Transformer: 2.5 BERT 与预训练模型: 三、基本框架 1. 打分函数(Score Fun…...
HTML5和JS实现新年礼花效果
HTML5和JS实现新年礼花效果 2023兔年再见,2024龙年来临了! 祝愿读者朋友们在2024年里,身体健康,心灵愉悦,梦想成真。 下面是用HTML5和JS实现新年礼花效果: 源码如下: <!DOCTYPE html>…...
【owt-server】一些构建项目梳理
【owt-server】清理日志:owt、srs、ffmpeg 【owt】p2p client mfc 工程梳理【m98】webrtc vs2017构建带符号的debug库【OWT】梳理构建的webrtc和owt mfc工程 m79的mfc客户端及owt-client...
Linux shell编程学习笔记38:history命令
目录 0 前言 1 history命令的功能、格式和退出状态1.1 history命令的功能1.2 history命令的格式1.3退出状态2 命令应用实例2.1 history:显示命令历史列表2.2 history -a:将当前会话的命令行历史追加到历史文件~/.bash_history中2.3 history -c…...
elasticsearch安装教程(超详细)
1.1 创建网络(单点部署) 因为我们还需要部署 kibana 容器,因此需要让 es 和 kibana 容器互联,所有先创建一个网络: docker network create es-net 1.2.加载镜像 采用的版本为 7.12.1 的 elasticsearch;…...
arkts中@Watch监听的使用
概述 Watch用于监听状态变量的变化,当状态变量变化时,Watch的回调方法将被调用。Watch在ArkUI框架内部判断数值有无更新使用的是严格相等(),遵循严格相等规范。当在严格相等为false的情况下,就会触发Watch的…...
【Jmeter】Jmeter基础9-BeanShell介绍
3、BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法。 3.1、Jmeter中使用的BeanShell 在Jmeter中,除了配置元件,其他类型的元件中都有BeanShell。BeanShell 是一种完全符合Java语法规范的脚本语言,并且又拥…...
详解数组的轮转
𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…...
html 表格 笔记
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>第二个页面</title><meta name"language" content"cn"> </head> <body><h2 sytle"width:500px;…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
