【C++风云录】加密的未来:现代C++库的密码学之旅

加密与安全的艺术:深入探索现代C++加密库

前言

随着数字化时代的到来,数据安全成为了一个不可忽视的重要问题。为了保护敏感数据和保障通信的安全性,开发人员需要选择适合的加密与安全解决方案。本文将介绍几个流行的C++加密库,包括Botan、OpenSSL、Crypto++、libsodium和Crypto库,探索它们的功能、特点和使用方法,为开发人员提供多种选择,保护数据的安全性。

欢迎订阅专栏:C++风云录

文章目录

  • 加密与安全的艺术:深入探索现代C++加密库
    • 前言
    • 1. Botan
      • 1.1 简介
      • 1.2 特点
      • 1.3 主要功能
    • 2. OpenSSL
      • 2.1 简介
      • 2.2 特点
      • 2.3 主要功能
    • 3. Crypto++
      • 3.1 简介
      • 3.2 特点
      • 3.3 主要功能
    • 4. libsodium
      • 4.1 简介
      • 4.2 特点
      • 4.3 主要功能
    • 总结:

1. Botan

1.1 简介

Botan 是一个用于实现密码学和安全功能的 C++ 加密库。它提供了大量的密码学算法和协议,包括对称加密、非对称加密、散列函数、消息认证码等。Botan 是一个跨平台的库,可以在多种操作系统上使用。它具有良好的性能和可靠的安全性,已经在各种实际应用中得到验证。Botan 提供了简单易用的 API,开发人员可以方便地使用它的功能。

1.2 特点

  • 跨平台:Botan 可以在多种操作系统上使用,包括 Windows、Linux、Mac 等。
  • 多样性:Botan 支持多种密码学算法和协议,满足不同场景下的加密和安全需求。
  • 性能优化:Botan 以性能为导向,通过优化算法和数据结构,提供高效的加密和解密过程。
  • 可靠安全:Botan 实现的密码学算法经过严格的测试和验证,保证其安全性和可靠性。
  • 简单易用:Botan 提供了简单易用的 API,开发人员可以方便地使用其功能。

1.3 主要功能

Botan 提供了丰富的密码学算法和功能,包括:

  • 对称加密算法:Botan 支持多种对称加密算法,如 AES、RC4、Blowfish 等,可以用于数据加密和解密。以下是一个使用 Botan 进行 AES 加密和解密的示例代码:
#include <botan/aes.h>
#include <botan/mode_pad.h>
#include <iostream>
#include <string>
#include <vector>std::vector<uint8_t> aes_encrypt(const std::vector<uint8_t>& plaintext, const std::vector<uint8_t>& key)
{Botan::AES_128_ECB aes;Botan::PKCS7_Padding padding;aes.set_key(key);std::vector<uint8_t> ciphertext(plaintext.size());aes.encrypt(plaintext.data(), ciphertext.data(), plaintext.size());return ciphertext;
}std::vector<uint8_t> aes_decrypt(const std::vector<uint8_t>& ciphertext, const std::vector<uint8_t>& key)
{Botan::AES_128_ECB aes;Botan::PKCS7_Padding padding;aes.set_key(key);std::vector<uint8_t> plaintext(ciphertext.size());aes.decrypt(ciphertext.data(), plaintext.data(), ciphertext.size());return plaintext;
}int main()
{std::vector<uint8_t> plaintext = {0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x21};std::vector<uint8_t> key = {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C};std::vector<uint8_t> ciphertext = aes_encrypt(plaintext, key);std::vector<uint8_t> decryptedtext = aes_decrypt(ciphertext, key);std::cout << "Plain text: ";for (uint8_t byte : plaintext) {std::cout << std::hex << static_cast<int>(byte) << " ";}std::cout << std::endl;std::cout << "Ciphertext: ";for (uint8_t byte : ciphertext) {std::cout << std::hex << static_cast<int>(byte) << " ";}std::cout << std::endl;std::cout << "Decrypted text: ";for (uint8_t byte : decryptedtext) {std::cout << std::hex << static_cast<int>(byte) << " ";}std::cout << std::endl;return 0;
}
  • 非对称加密算法:Botan 提供了多种非对称加密算法,如 RSA、DSA、ECIES 等,可以用于密钥交换和数字签名。以下是一个使用 Botan 进行 RSA 加密和解密的示例代码:
#include <botan/auto_rng.h>
#include <botan/pkcs8.h>
#include <botan/rsa.h>
#include <botan/base64.h>
#include <iostream>
#include <string>std::string rsa_encrypt(const std::string& plaintext, const Botan::RSA_PublicKey& public_key)
{Botan::AutoSeeded_RNG rng;std::vector<uint8_t> ciphertext = public_key.encrypt(rng, Botan::CharVector(plaintext.begin(), plaintext.end()));return Botan::base64_encode(ciphertext);
}std::string rsa_decrypt(const std::string& ciphertext, const Botan::RSA_PrivateKey& private_key)
{Botan::AutoSeeded_RNG rng;std::vector<uint8_t> decrypted = private_key.decrypt(Botan::base64_decode(ciphertext), rng);return std::string(decrypted.begin(), decrypted.end());
}int main()
{Botan::AutoSeeded_RNG rng;Botan::RSA_PrivateKey private_key(rng, 1024);const Botan::RSA_PublicKey& public_key = private_key;std::string plaintext = "Hello, world!";std::string ciphertext = rsa_encrypt(plaintext, public_key);std::string decryptedtext = rsa_decrypt(ciphertext, private_key);std::cout << "Plain text: " << plaintext << std::endl;std::cout << "Ciphertext: " << ciphertext << std::endl;std::cout << "Decrypted text: " << decryptedtext << std::endl;return 0;
}
  • 散列函数:Botan 支持多种散列函数,如 SHA-1、SHA-256、MD5 等,可以用于数据的完整性验证。

  • 消息认证码:Botan 提供多种消息认证码算法,如 HMAC、CMAC 等,可以用于消息的完整性和真实性验证。

这些仅是 Botan 提供的一些功能和算法的示例,它还提供了更多的密码学功能和算法供开发人员使用。请注意,在实际应用中,需要小心选择适合具体需求的密码学算法,并遵循最佳实践来确保加密的安全性。

好的,我们继续填充内容。

2. OpenSSL

2.1 简介

OpenSSL 是一个开源的密码学工具包,提供了 SSL/TLS 协议实现以及其他密码学功能。它是一个非常成熟和广泛使用的库,在网络通信和数据安全领域有着重要的地位。

2.2 特点

  • 广泛应用:OpenSSL 在各种应用场景中被广泛使用,包括网络通信、数据加密、数字证书管理等。
  • 功能丰富:OpenSSL 提供了多种密码学算法和协议,支持对称加密、非对称加密、散列函数、消息认证码等功能。
  • 跨平台:OpenSSL 可以在多个操作系统和开发环境中使用,包括 Windows、Linux、Mac 等。
  • 安全可靠:OpenSSL 经过长期的发展和实践,具有良好的安全性和可靠性。

2.3 主要功能

OpenSSL 提供了许多密码学算法和工具,包括:

  • SSL/TLS 实现:OpenSSL 提供了完整的 SSL/TLS 协议实现,用于保护网络通信的安全性。

  • 密钥交换算法:OpenSSL 支持多种密钥交换算法,如 Diffie-Hellman、ECDH 等,可以实现安全的密钥交换。

  • 数字签名和验证:OpenSSL 支持多种数字签名算法,如 RSA、DSA、ECDSA 等,可以用于验证数据的真实性和完整性。

  • 数字证书管理:OpenSSL 提供了数字证书的生成、签发和验证功能,可以用于建立可信任的通信链路。以下是使用 OpenSSL 生成自签名数字证书的示例代码:

#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/x509v3.h>
#include <openssl/pem.h>
#include <iostream>X509* generate_self_signed_certificate(EVP_PKEY* privateKey)
{X509* x509 = X509_new();X509_NAME* name = X509_get_subject_name(x509);// 设置证书信息X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, (const unsigned char*)"example.com", -1, -1, 0);X509_set_issuer_name(x509, name);X509_gmtime_adj(X509_get_notBefore(x509), 0);X509_gmtime_adj(X509_get_notAfter(x509), 365 * 24 * 60 * 60);X509_set_pubkey(x509, privateKey);X509_sign(x509, privateKey, EVP_sha256());return x509;
}int main()
{// 生成 RSA 密钥对EVP_PKEY* privateKey = EVP_PKEY_new();RSA* rsa = RSA_new();RSA_generate_key_ex(rsa, 2048, NULL, NULL);EVP_PKEY_assign_RSA(privateKey, rsa);// 生成自签名数字证书X509* certificate = generate_self_signed_certificate(privateKey);// 将证书保存到文件FILE* file = fopen("certificate.pem", "wb");PEM_write_X509(file, certificate);fclose(file);// 释放资源X509_free(certificate);EVP_PKEY_free(privateKey);return 0;
}
  • 散列函数:OpenSSL 支持多种散列函数,如 SHA-1、SHA-256、MD5 等,可用于数据的完整性验证和密码哈希。

  • 消息认证码:OpenSSL 支持多种消息认证码算法,如 HMAC、CMAC 等,可用于消息的完整性和真实性验证。

这些仅是 OpenSSL 提供的一些功能和算法的示例,它还提供了更多的密码学功能和算法供开发人员使用。要正确使用 OpenSSL,需要仔细考虑算法的安全性和选项的配置,并遵循最佳实践来确保系统的安全性。

好的,我们继续填充内容。

3. Crypto++

3.1 简介

Crypto++ 是一个开源的密码学库,提供了丰富的密码学算法和工具。它是用 C++ 编写的,可以在多个平台上使用,并具有高性能和可靠的安全性。

3.2 特点

  • 密码学算法:Crypto++ 支持多种密码学算法,包括对称加密、非对称加密、散列函数、消息认证码等。
  • 简洁易用:Crypto++ 提供了简单易用的 API,方便开发人员使用其功能。
  • 跨平台:Crypto++ 可以在多个操作系统上使用,包括 Windows、Linux、Mac 等。
  • 高性能:Crypto++ 通过优化算法和数据结构,提供高性能的密码学运算。

3.3 主要功能

Crypto++ 提供了丰富的密码学算法和功能,包括:

  • 对称加密算法:Crypto++ 支持多种对称加密算法,如 AES、3DES、Blowfish 等,用于数据加密和解密。以下是使用 Crypto++ 进行 AES 加密和解密的示例代码:
#include <iostream>
#include <string>
#include <cryptopp/aes.h>
#include <cryptopp/modes.h>std::string aes_encrypt(const std::string& plaintext, const std::string& key)
{std::string ciphertext;CryptoPP::AES::Encryption aesEncryption((byte*)key.c_str(), CryptoPP::AES::DEFAULT_KEYLENGTH);CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, (byte*)key.c_str());CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink(ciphertext));stfEncryptor.Put(reinterpret_cast<const unsigned char*>(plaintext.c_str()), plaintext.length() + 1);stfEncryptor.MessageEnd();return ciphertext;
}std::string aes_decrypt(const std::string& ciphertext, const std::string& key)
{std::string decryptedtext;CryptoPP::AES::Decryption aesDecryption((byte*)key.c_str(), CryptoPP::AES::DEFAULT_KEYLENGTH);CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, (byte*)key.c_str());CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink(decryptedtext));stfDecryptor.Put(reinterpret_cast<const unsigned char*>(ciphertext.c_str()), ciphertext.length());stfDecryptor.MessageEnd();return decryptedtext;
}int main()
{std::string plaintext = "Hello, World!";std::string key = "0123456789abcdef";std::string ciphertext = aes_encrypt(plaintext, key);std::string decryptedtext = aes_decrypt(ciphertext, key);std::cout << "Plain text: " << plaintext << std::endl;std::cout << "Ciphertext: " << ciphertext << std::endl;std::cout << "Decrypted text: " << decryptedtext << std::endl;return 0;
}
  • 非对称加密算法:Crypto++ 提供了多种非对称加密算法,如 RSA、DSA、ECIES 等,用于密钥交换和数字签名。

  • 散列函数:Crypto++ 支持多种散列函数,如 SHA-1、SHA-256、MD5 等,用于数据的完整性验证和密码哈希。

  • 消息认证码:Crypto++ 提供多种消息认证码算法,如 HMAC、CMAC 等,用于消息的完整性和真实性验证。

以上代码和示例只是 Crypto++ 库提供功能的部分范例,实际使用时需要根据需要选择适当的算法和安全选项,并进行必要的错误处理和安全性的考虑。

好的,我们继续填充内容。

4. libsodium

4.1 简介

libsodium 是一个易于使用的加密库,提供了现代密码学的安全性。它采用 C 语言编写,为开发人员提供了简单高效的加密功能。

4.2 特点

  • 简单易用:libsodium 提供了一套简单易用的 API,屏蔽了复杂的密码学细节,使开发人员能够轻松地使用其功能。
  • 高性能:libsodium 具有良好的性能,通过使用优化的算法和数据结构来提高加密速度。
  • 高安全性:libsodium 使用现代密码学技术,防范了许多已知的攻击,保证代码和数据的安全性。

4.3 主要功能

libsodium 提供了许多密码学功能和工具,包括:

  • 对称加密算法:libsodium 支持多种对称加密算法,如 AES、ChaCha20、Salsa20 等,用于数据加密和解密。以下是使用 libsodium 进行 AES 加密和解密的示例代码:
#include <sodium.h>
#include <iostream>
#include <vector>std::vector<uint8_t> aes_encrypt(const std::vector<uint8_t>& plaintext, const std::vector<uint8_t>& key)
{std::vector<uint8_t> ciphertext(plaintext.size() + crypto_secretbox_MACBYTES);crypto_secretbox_easy(ciphertext.data(), plaintext.data(), plaintext.size(), key.data(), crypto_secretbox_KEYBYTES);return ciphertext;
}std::vector<uint8_t> aes_decrypt(const std::vector<uint8_t>& ciphertext, const std::vector<uint8_t>& key)
{std::vector<uint8_t> decryptedtext(ciphertext.size() - crypto_secretbox_MACBYTES);if (crypto_secretbox_open_easy(decryptedtext.data(), ciphertext.data(), ciphertext.size(), key.data(), crypto_secretbox_KEYBYTES) != 0) {std::cerr << "Decryption failed" << std::endl;return {};}return decryptedtext;
}int main()
{if (sodium_init() < 0) {std::cerr << "sodium_init() failed" << std::endl;return 1;}std::vector<uint8_t> plaintext = {0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x21};std::vector<uint8_t> key(crypto_secretbox_KEYBYTES);randombytes_buf(key.data(), key.size());std::vector<uint8_t> ciphertext = aes_encrypt(plaintext, key);std::vector<uint8_t> decryptedtext = aes_decrypt(ciphertext, key);if (decryptedtext.empty()) {std::cerr << "Decryption failed" << std::endl;return 1;}std::cout << "Plain text: ";for (uint8_t byte : plaintext) {std::cout << std::hex << static_cast<int>(byte) << " ";}std::cout << std::endl;std::cout << "Ciphertext: ";for (uint8_t byte : ciphertext) {std::cout << std::hex << static_cast<int>(byte) << " ";}std::cout << std::endl;std::cout << "Decrypted text: ";for (uint8_t byte : decryptedtext) {std::cout << std::hex << static_cast<int>(byte) << " ";}std::cout << std::endl;return 0;
}
  • 非对称加密算法:libsodium 支持多种非对称加密算法,如 X25519、Ed25519 等,用于密钥交换和数字签名。

  • 散列函数:libsodium 支持多种散列函数,如 SHA-256、Blake2b 等,用于数据的完整性验证和密码哈希。

  • 密码学安全随机数生成器:libsodium 提供了用于生成密码学安全随机数的 API,用于密钥和随机值的生成。

libsodium 提供的功能和算法示例只是它丰富功能的一小部分。开发人员可以根据具体需求,选择适当的算法和方法,并遵循最佳实践来保护数据和代码的安全性。

总结:

保护数据的安全性对于现代应用程序至关重要。本文介绍了几个流行的C++加密库,包括Botan、OpenSSL、Crypto++、libsodium和Crypto库。这些库提供了丰富的密码学算法和功能,如对称加密、非对称加密、散列函数和消息认证码等。通过使用这些库,开发人员可以选择适合自己需求的加密与安全解决方案,确保数据的保密性、完整性和可靠性。无论是网络通信、数据存储还是数字签名,这些库都能提供可靠的加密和安全功能,为应用程序的数据保护提供有力支持。

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

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

相关文章

ArcGIS 10.8中文版详细安装教程(附安装包)

ArcGIS 10.8中文版详细安装教程&#xff08;附安装包&#xff09; 关键词&#xff1a;ArcGIS 10.8中文版安装 1.概述 ArcGIS Desktop 10.8中文版是由ESRI公司开发的一款专业的地理信息系统&#xff0c;一套完整的桌面GIS软件套件&#xff0c;它包含ArcMap、ArcCatalog、ArcG…

C++——模板初阶

泛型编程 C语言中交换两个变量数据的内容一般是这样实现的 #include<iostream>using namespace std;void swap(int* x, int* y) {int tmp *x;*x *y;*y tmp; } int main() {int x 5;int y 7;swap(&x,&y);cout << "x" << x << …

最优算法100例之30-表示数值的字符串

专栏主页&#xff1a;计算机专业基础知识总结&#xff08;适用于期末复习考研刷题求职面试&#xff09;系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。例如&a…

easyexcel 动态列导出

1. 引入easyexcel <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version></dependency> 2.导出write public void export(HttpServletResponse response) {try {String f…

c++中有哪些常用的关键字

C中有许多常用的关键字&#xff0c;这些关键字在编程中扮演着重要的角色。以下是一些C中常用的关键字及其基本用途&#xff1a; 数据类型相关&#xff1a; bool&#xff1a;布尔类型&#xff0c;用于表示真或假。true 和 false&#xff1a;是 bool 类型的字面量&#xff0c;分…

基于ArrayList实现简单洗牌

前言 在之前的那篇文章中&#xff0c;我们已经认识了顺序表—>http://t.csdnimg.cn/2I3fE 基于此&#xff0c;便好理解ArrayList和后面的洗牌游戏了。 什么是ArrayList? ArrayList底层是一段连续的空间&#xff0c;并且可以动态扩容&#xff0c;是一个动态类型的顺序表&…

Java方法的参数传递机制与递归总结

文章目录 1、方法的参数传递机制1.1、形参和实参1.2、 参数传递机制&#xff1a;值传递1.3、 举例1.4 练习 2、 递归(recursion)方法 1、方法的参数传递机制 1.1、形参和实参 若方法含有参数&#xff1a; 形参&#xff08;formal parameter&#xff09;&#xff1a;在定义方…

QT背景介绍

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、QT背景 1.1什么是QT 1.2QT的发展历史 1.3什么是框架、库 1.4QT支持的平台 1.5QT的优点 1.6QT的…

BIM转Power BI数据集

在本博客中&#xff0c;我们将了解如何使用从 SSAS 表格、Power BI Desktop 或 Power BI 服务数据集中提取的 Model.bim 文件在本地或 PBI 服务上生成新数据集。 1、设置&#xff08;SSAS 表格和 PBI 服务通用&#xff09; 我建议你创建一个专门用于此任务的新 Python 环境&a…

old photo老照片图像复原数据集

来源 本来想拿DA-CLIP 训练一下old photo&#xff0c;训练代码没成功&#xff0c;毕设没时间就不研究了 github搜old photo复原论文原作者好像没开源训练数据集&#xff0c;所以用了这个SynOld 训练集500对测试集200对 但是readme写的很差&#xff0c;其他什么也没交代 展示…

Centos-Linux安装部署MySQL-8.0

linux搭建mysql 1.使用系统的root账户 2.切换到 /usr/local 目录下 3.下载mysql wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz也可以直接在官方下载最新版本 官方下载 选择linux 4.解压mysql tar xvJf mysql-8.0.21-l…

【MySQL】MySQL事务的问题:脏读、幻读、不可重复读

MySQL事务的问题&#xff1a;脏读、幻读、不可重复读 在上一篇文章中&#xff0c;我们已经学习过了事务相关的基础知识&#xff0c;今天&#xff0c;我们继续学习事务有可能带来的一些问题。其实在一次请求和连接中&#xff0c;事务是不会出现什么问题的&#xff0c;毕竟在一个…

C易错注意之const修饰指针,含char类型计算,位段及相关经典易错例题

目录 前言 一&#xff1a;const修饰指针 1.const修饰变量 2.const 修饰指针 1.const int*p&m; 2. int* const p&m; 3. int const *p&m; 4. int const *const p&m; 5.总结 总之一句话为&#xff1a;左定值有定向 二&#xff1a;关于计算中char类型…

Windows创建远程线程学习

CreateRemoteThread是一个Windows API函数,它能够创建一个在其它进程地址空间中运行的线程; 下面来简单做一下,配合procexp工具; VC代码如下,我是写到一个菜单单击处理函数中, void CCrrmthView::OnMenuitem32771() {// TODO: Add your command handler code hereHAN…

C语言:动态内存管理(二)

目录 前言 1.3 realloc​编辑 3、常见动态内存管理错误 3.1 对空指针的解引用操作 3.2 对动态开辟的空间进行越界访问 3.3 对非动态开辟内存使用free释放 3.4 使用free释放一块动态内存开辟的一部分 3.5 对同一块空间的多次释放 3.6 动态内存开辟之后忘记释放 总结 前…

杨氏矩阵(C语言)

文章目录 问题技术名词解释思路关键代码运行代码 问题 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于O(N); 技术名词解释 杨氏矩阵&…

自动化测试框架Robot Framework入门

什么是RF RF是一个基于 Python 的、可扩展的关键字驱动的自动化 验收测试框架、验收测试驱动开发 &#xff08;ATDD&#xff09;、 行为驱动开发 &#xff08;BDD&#xff09; 和机器人流程自动化 &#xff08;RPA&#xff09;。它 可用于分布式、异构环境&#xff0c;其中自动…

Spring Security——04,认证_校验

认证_校验 一、认证过滤器二、配置过滤器三、测试过滤器3.1 登录接口3.2 非登录接口3.3 结果 一键三连有没有捏~~ 一、认证过滤器 创建一个filter包&#xff0c;创建一个过滤器 代码如下&#xff1a; Component public class JwtAuthenticationTokenFilter extends OncePerR…

LeetCode | 数组 | 双指针法 | 27. 移除元素【C++】

题目链接 1. 题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑…

在集群中使用deepspeed如果端口被占用可以使用deepspeed参数更改

在集群中使用deepspeed如果端口被占用可以使用deepspeed参数更改 这一次G老师不好使了 在集群中使用deepspeed默认的端口号29500被占用&#xff0c;显示更改居然不起作用 G老师给的方法也不好使 #!/bin/bash MASTER_ADDRlocalhost MASTER_PORT29501 # 选择一个未被占用的端…