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);// ------------------------------------------------------------------------}

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

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

相关文章

Microsoft .NET Framework 4.5.1 离线安装包

Microsoft .NET Framework 4.5.1 安装包&#xff1a; 一、离线安装包&#xff1a; 百度网盘 链接: https://pan.baidu.com/s/1IGEYT1vyruY6KFu6XEmerA 提取码: m6ix 离线安装包官方地址&#xff1a; https://www.microsoft.com/zh-cn/download/details.aspx?id40779 二、在…

如何在VSCode搭建ESP-IDF开发ESP32

文章目录 概要安装VScode安装ESP-IDF插件使用官方例程小结 概要 ESP-IDF(Espressif IoT Development Framework) 即乐鑫物联网开发框架&#xff0c;它基于 C/C 语言提供了一个自给自足的 SDK&#xff0c;可为在 Windows、Linux 和 macOS 系统平台上开发 ESP32 应用程序提供工具…

跳跃表原理及实现

一、跳表数据结构 跳表是有序表的一种&#xff0c;其底层是通过链表实现的。链表的特点是插入删除效率高&#xff0c;但是查找节点效率很低&#xff0c;最坏的时间复杂度是O(N)&#xff0c;那么跳表就是解决这一痛点而生的。 为了提高查询效率&#xff0c;我们可以给链表加上索…

天翼云云间高速实现租户跨地域内网互通

一、业务需求 用户业务在襄阳、武汉两个云池部署&#xff0c;希望通过云间高速产品将两个资源池云内资源通过云内专网实现内网互通。要求内网双向互通。 二、测试环境配置 云池vpc名称vpc网段子网内网ip/gweip主机名互联网带宽襄阳ceshi192.168.0.0/16192.168.1.0/24192.168.…

unity学习笔记----游戏练习02

一、阳光值的展示和消耗 1.创建一个文本组件用于显示阳光的数值&#xff0c;然后在脚本中得到这个UI。 在SunManger中得到这个组件的引用 public TextMeshProUGUI sunPointText; 写一个用于更新显示的方法 public void UpdataSunPointText() { sunPointText.tex…

FileZilla的使用主动模式与被动模式

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、FileZilla简介 1、FileZilla是什么&#xff1f; 2、FileZilla的应用场景 二、FileZilla的安装 1、下…

JVM篇:JVM内存结构

程序计数器 程序计数器英文名叫&#xff1a;Program Counter Register 作用&#xff1a;用来记录下一条jvm指令的地址行号。 先来查看一段jvm指令&#xff0c;这些指令对应的java代码就是输出1-5 操作系统运行该Java程序时具体流程如下 语言解释&#xff1a;源文件通过编译转…

光伏逆变器MPPT的作用、原理及算法

MPPT是逆变器非常核心的技术&#xff0c;MPPT电压在进行光伏电站设计时一项非常关键的参数。 一、什么是MPPT&#xff1f; &#xff08;单块光伏组件的I-V、P-V曲线&#xff09; 上图中&#xff0c;光伏组件的输出电压和电流遵循I-V曲线(绿色)、P-V曲线(蓝色)&#xff0c;如果…

NVMe over Fabrics:概念、应用和实现

对于大部分人来说&#xff0c;NVMe over Fabrics&#xff08;简称NVMf&#xff09;还是个新东西&#xff0c;因为其第一个正式版本的协议在今年6月份才发布。但是这并不影响人们对NVMf的关注&#xff0c;因为这项依托于NVMe的技术很可能继续改变存储市场格局。 NVMf的贡献在于…

labuladong日常刷题-双指针 | LeetCode 83删除排序链表中的重复元素 5最长回文子串

双指针操作链表与字符串 LeetCode 83 删除排序链表中的重复元素 2023.12.28 题目链接labuladong讲解[链接] ListNode* deleteDuplicates(ListNode* head) {/*暴力求解ListNode* cur new ListNode();ListNode* prenode cur;cur->next head;cur cur->next;while(cu…

web自动化(4)——POM设计重构

1. 什么是POM Page Object Model 是ui自动化测试中常见的封装方式。 原理&#xff1a;将页面封装为PO对象&#xff0c;然后通过面向对象的方式实现UI自动化 2. 封装原则 PO无需包含全部UI元素PO应当验证元素PO不应该包含断言PO不应该暴露元素 3. 怎么进行POM封装 面向对象…

架构设计系列 5:常见架构介绍

前面讲了架构是什么&#xff0c;架构的发展史&#xff0c;架构设计的基础理论&#xff0c;这次针对常见架构设计风格进行介绍和分析。 一、MVC&#xff1a;三层架构经典 经典的 MVC 架构&#xff08;Model-View-Controller&#xff09;架构是软件系统架构设计中的经典&#xf…

数据结构与算法教程,数据结构C语言版教程!(第二部分、线性表详解:数据结构线性表10分钟入门)一

第二部分、线性表详解&#xff1a;数据结构线性表10分钟入门 线性表&#xff0c;数据结构中最简单的一种存储结构&#xff0c;专门用于存储逻辑关系为"一对一"的数据。 线性表&#xff0c;基于数据在实际物理空间中的存储状态&#xff0c;又可细分为顺序表&#xff…

NFC物联网构建移动智能仓储系统解决方案

仓储管理作为企业研发生产活动的重要环节&#xff0c;正朝着标准化、信息化方向发展。高新作为典型的资产密集 技术密集型企业,原料样品为代表的资产数量巨大品种繁杂&#xff0c;对仓库管理的实时性及准确性要求较高。传统的人工作业模式和管理方法逐渐难以满足仓储管理对高效…

【 YOLOv5】目标检测 YOLOv5 开源代码项目调试与讲解实战(4)-自制数据集及训练(使用makesense标注数据集)

如何制作和训练自己的数据集 看yolov5官网创建数据集1.搜索需要的图片2.创建标签标注数据集地址&#xff1a;放入图片后选择目标检测创建文档&#xff0c;每个标签写在单独的一行上传结果此处可以编辑类别把车框选选择类别即可导出数据 3.新建一个目录放数据写yaml文件 4. 测试…

【赠书第14期】AI短视频制作一本通:文本生成视频+图片生成视频+视频生成视频

文章目录 前言 1 前期准备 2 拍摄与录制 3 后期编辑 4 技巧与注意事项 5 推荐图书 6 粉丝福利 前言 随着智能技术的迅猛发展&#xff0c;AI 短视频制作成为了一种新兴而创新的表达方式&#xff0c;广泛应用于社交媒体、广告营销、教育培训等领域。本文将介绍 AI 短视频…

JavaScript介绍,特点及组成(详解)

✨前言✨   本章将介绍 JavaScript 的基本概念、编写方法&#xff0c;并带领大家编写第一个 avaScript 程序。 &#x1f352;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f352;博主将持续更新学习记录收获&#xff0c;友友们有任何…

垃圾收集器与内存分配策略

内存分配和回收原则 对象优先在Eden区分配 大对象直接进入老年代 长期存活的对象进入老年代 什么是内存泄漏 不再使用的对象在系统中未被回收&#xff0c;内存泄漏的积累可能会导致内存溢出 自动垃圾回收与手动垃圾回收 自动垃圾回收&#xff1a;由虚拟机来自动回收对象…

什么是高并发系统?

1.1 什么是高并发&#xff1f; 高并发&#xff08;High Concurrency&#xff09;&#xff0c;通常是指通过设计保证系统能够同时处理很多请求。即在同一个时间点&#xff0c;有很多的请求同时访问同一个接口。高并发意味着大流量&#xff0c;需要运用技术手段去抵抗这种大流量…

用通俗易懂的方式讲解大模型:Prompt 提示词在开发中的使用

OpenAI 的 ChatGPT 是一种领先的人工智能模型&#xff0c;它以其出色的语言理解和生成能力&#xff0c;为我们提供了一种全新的与机器交流的方式。但不是每个问题都可以得到令人满意的答案&#xff0c;如果想得到你所要的回答就要构建好你的提示词 Prompt。本文将探讨 Prompt 提…