当前位置: 首页 > news >正文

Rust 实战练习 - 9. 文本编码,URL编码,加密解密

编解码

编程工作中,很复杂的一个环节的就是编解码和多语言。这里只讨论编解码的工作。

目标:

  • 常见文本编码的转换(GBK, Shift-JIS, UTF8, Unicode, ASCII)
  • Web中常用的编码
  • 常见的加密算法(md5, sha1, HMAC, AES/DES, RSA)

encoding/decoding

在官方的库中搜索一下:

https://docs.rs/

简单了解一下

(吐槽一下,rust官方的std库支持的太少了,啥都要第三方库! 找起来参莠不齐,这点体验不太好)

[dependencies]
encoding = "*" # 各种字符编码
urlencoding = "*" # url path 对有影响的字符进行编码
base64 = "*" # base64的支持,提供细节定制功能
rsa = "*" # pcks1,pcks8的rsa支持,还可以互相转换

code

use std::mem::size_of;
use base64::Engine;
use encoding::{all::{ASCII, EUC_JP, GB18030, GBK}, Encoding};
use base64::engine::general_purpose;fn main() {println!("\r\n1. Rust内部使用UTF-8编码, char类型用4个字节.");let a1 = "hello, 我是Andy!🍓";println!("Bin: {:?}", a1.as_bytes());// 英文用1字符,中文用3个,emoji用4个.println!("{}, len: {}, chars len: {}", a1, a1.len(), a1.chars().count());// char 是一个 Unicode 标量值, 是除 代理代码点(0xD800 到 0xDFFF) 之外的任何 Unicode 代码点。// 大小始终为四个字节. 范围 0 到 0x10FFF.println!("char size: {}", size_of::<char>());println!("\r\n2. rust str to ASCII,GBK,GB18030...");// https://zhuanlan.zhihu.com/p/453675608// 编码范围从小到大: ASCII(1) => GB2312(2) => GBK(2) => GB18030(1-4)// UTF-8 to GBK, GB18030let b1 = "a 1 王 🍓";println!("Rust old: {:?}", b1.as_bytes());if let Ok(raw) = ASCII.encode(b1, encoding::EncoderTrap::Ignore) {println!("ASCII: {:?}", raw); // 中文和emoji不能转换println!("ASCII Decode: {:?}", ASCII.decode(raw.as_slice(), encoding::DecoderTrap::Ignore));}if let Ok(raw) = GBK.encode(b1, encoding::EncoderTrap::Ignore) {println!("GBK: {:?}", raw); // emoji不能转换println!("GBK Decode: {:?}", GBK.decode(raw.as_slice(), encoding::DecoderTrap::Ignore));}if let Ok(raw) = GB18030.encode(b1, encoding::EncoderTrap::Strict) {println!("GB18030: {:?}", raw); // 全部都能转换println!("GB18030 Decode: {:?}", GB18030.decode(raw.as_slice(), encoding::DecoderTrap::Ignore));}// include Shift-JISif let Ok(raw) = EUC_JP.encode(b1, encoding::EncoderTrap::Ignore) {println!("JP 932: {:?}", raw); // emoji不能转换println!("JP Decode: {:?}", EUC_JP.decode(raw.as_slice(), encoding::DecoderTrap::Ignore));}println!("\r\n3. url path encode and decode...");let c1 = "http://www.test.com/api/get?id=123+你好-🍓";println!("url encode: {}", urlencoding::encode(c1)); // 所有可能影响url的字符都被编码了println!("url decode: {}", urlencoding::decode("%F0%9F%91%BE%20Exterminate%21").unwrap());println!("\r\n4. base64 encode and decode...");// 当输入长度不是 3 个字节的偶数倍时,规范的 base64 编码器会在末尾插入填充字符,以便输出 长度始终是 4 的倍数let d1 = "hello, 123, @?&=-_, 啊";let d1_1 = general_purpose::STANDARD.encode(d1);let d1_2 = general_purpose::STANDARD.decode(d1_1.clone()).unwrap();println!("base64 encode: {}", d1_1);println!("base64 decode: {}", String::from_utf8(d1_2).unwrap());
}

加密和解密

https://zhuanlan.zhihu.com/p/347114235

目前没有比较全面的库,有一个目标类似,但是没有1.0的库:https://docs.rs/cryptocol/latest/cryptocol/.

缺失的部分可以使用 https://docs.rs/rsa/latest/rsa/

非对称加密

use cryptocol::hash::{MD5, SHA1};fn main() {println!("\r\n1. md5");let e1 = "some thing what can be any thing!";let mut md5= MD5::new();md5.digest_str(e1);println!("MD5  : {} - {:?}", md5.get_hash_value_in_string(), md5.get_hash_value_in_vec());md5.ruminate_str(2, e1); // 双重md5println!("MD5*2: {} - {:?}", md5.get_hash_value_in_string(), md5.get_hash_value_in_vec());println!("\r\n2. sha1");let mut sha1 = SHA1::new();sha1.digest_str(e1);println!("sha1  : {} - {:?}", sha1.get_hash_value_in_string(), sha1.get_hash_value_in_vec());sha1.ruminate_str(2, e1); // 双重sha1println!("sha1*2: {} - {:?}", sha1.get_hash_value_in_string(), sha1.get_hash_value_in_vec());
}

RSA

use rsa::{ pkcs8::{DecodePublicKey, EncodePublicKey}, RsaPublicKey};fn main() {println!("\r\n1. RSA pkcs8 public key for pem");let pem = "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtsQsUV8QpqrygsY+2+JC
Q6Fw8/omM71IM2N/R8pPbzbgOl0p78MZGsgPOQ2HSznjD0FPzsH8oO2B5Uftws04
LHb2HJAYlz25+lN5cqfHAfa3fgmC38FfwBkn7l582UtPWZ/wcBOnyCgb3yLcvJrX
yrt8QxHJgvWO23ITrUVYszImbXQ67YGS0YhMrbixRzmo2tpm3JcIBtnHrEUMsT0N
fFdfsZhTT8YbxBvA8FdODgEwx7u/vf3J9qbi4+Kv8cvqyJuleIRSjVXPsIMnoejI
n04APPKIjpMyQdnWlby7rNyQtE4+CV+jcFjqJbE/Xilcvqxt6DirjFCvYeKYl1uH
LwIDAQAB
-----END PUBLIC KEY-----";let public_key = RsaPublicKey::from_public_key_pem(pem).unwrap();println!("Public Key: {:?}", public_key);let pem2 = RsaPublicKey::to_public_key_pem(&public_key, rsa::pkcs8::LineEnding::CRLF).unwrap();println!("Public Key pem: {}", pem2); // 与pem相同// 公钥和私钥互相可解密对方加密的数据// 公钥是可以通过私钥生成的,所以公布了私钥很危险,但是公布公钥没问题// https://www.cnblogs.com/Dogwei/p/13412976.html
}

相关文章:

Rust 实战练习 - 9. 文本编码,URL编码,加密解密

编解码 编程工作中&#xff0c;很复杂的一个环节的就是编解码和多语言。这里只讨论编解码的工作。 目标&#xff1a; 常见文本编码的转换&#xff08;GBK, Shift-JIS, UTF8, Unicode, ASCII)Web中常用的编码常见的加密算法(md5, sha1, HMAC, AES/DES, RSA) encoding/decodi…...

linux环境openfile限制

/etc/security/limits.conf 是 Linux 系统中用于设置用户资源限制的配置文件。这个文件允许系统管理员为每个用户或用户组设置各种资源限制&#xff0c;以防止用户滥用系统资源。 这个文件中的每一行都定义了一个资源限制。每一行通常包含以下字段&#xff08;由空格或冒号分隔…...

python之pandas数据导入和导出

目录 Pandas 常用数据导入Pandas 常用数据导出数据导入示例CSV 文件&#xff1a;指定导入文件的编码格式添加列标题 Excel 文件&#xff1a;JSON 文件&#xff1a;数据库&#xff1a;HTML 表格&#xff1a;Clipboard&#xff1a;HDF5 文件&#xff1a;Feather 文件&#xff1a;…...

Docker 集成 redis,并在nacos进行配置时需要注意点

安装redis镜像 docker pull redis:6.0.6redis配置文件 创建相关配置文件 mkdir /apps/redis cd /apps/redis touch redis.conf vim redis.confredis.conf内容&#xff1a; #开启保护 protected-mode yes #开启远程连接 bind 0.0.0.0 #自定义密码 port 6379 timeout 0 # 900s内…...

数据库系统工程师考试大纲

数据库系统工程师考试大纲主要包括以下几个方面的考试要求&#xff1a; 1.掌握计算机体系结构以及各主要部件的性能和基本工作原理。 2.掌握操作系统、程序设计语言的基础知识&#xff0c;了解编译程序的基本概念。 3.熟练掌握常用数据结构和常用算法。 4.熟悉软件工程和软件开…...

(Java)数据结构——图(第七节)Folyd实现多源最短路径

前言 本博客是博主用于复习数据结构以及算法的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 Folyd实现原理 中心点的概念 感觉像是充当一个桥梁的作用 还是这个图 我们常在一些讲解视频中看到&#xff0c;就比如dist&#xff08;-1&#xff09;&#xff0…...

使用Python进行高效的多线程HTTP请求

在处理网络请求时&#xff0c;尤其是当需要大量请求相同或不同的URL时&#xff0c;采用多线程的方式可以显著提高效率。本文介绍了如何使用Python的concurrent.futures模块实现多线程HTTP请求。 为什么使用多线程&#xff1f; 多线程可以让CPU和网络资源得到更有效的利用。在…...

如何利用OceanBase v4.2的 外部表简化外部数据处理

为什么需要使用外表 在日常的业务场景中&#xff0c;经常遇到需要在数据库中处理外部数据的情况&#xff0c;这些数据可能来源于应用程序&#xff0c;或者是其他业务系统。一般来说&#xff0c;常是通过ETL工具将外部数据库的数据导入到数据库内部的表中&#xff0c;再进行分析…...

【灵境矩阵】零代码创建AI智能体之行业词句助手

欢迎来到《小5讲堂》 这是《灵境矩阵》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 创建智能体选择创建方式零代码 基础配置头像名称简介指令开场白…...

springboot 防抖操作

大佬的代码&#xff1a;看这里 原理&#xff1a; 通过aop切面编程&#xff0c;在调用接口前缓存接口信息&#xff0c;将信息缓存到redis中&#xff0c;在规定时间内重复调用接口&#xff0c;会被拦截请求 有个地方感觉不太合理&#xff0c;在使用中我将其修改了 //前略 publi…...

Playwright录制脚本 —— web自动化测试!

简介&#xff1a; 在编写 web 自动化测试用例时&#xff0c;代码编写的速度是否快&#xff0c;会影响框架的使用体验。现在很多的框架都会提供一些辅助功能&#xff0c;帮助我们更快的去编写自动化测试代码&#xff0c;而录制功能是几乎所有的web自动化工具都会带的功能。在实际…...

什么是工业级物联网智能网关?如何远程控制PLC?

在数字化浪潮席卷全球的今天&#xff0c;工业物联网&#xff08;IIoT&#xff09;已经成为推动工业转型升级的关键力量。而在工业物联网的大家庭中&#xff0c;工业级物联网智能网关扮演着举足轻重的角色。那么&#xff0c;究竟什么是工业级物联网智能网关&#xff1f;又该如何…...

AI推介-大语言模型LLMs论文速览(arXiv方向):2024.04.05-2024.04.10

文章目录~ 1.Learn from Failure: Fine-Tuning LLMs with Trial-and-Error Data for Intuitionistic Propositional Logic Proving2.Continuous Language Model Interpolation for Dynamic and Controllable Text Generation3.Event Grounded Criminal Court View Generation w…...

javascript:call()、apply()、bind()的区别和使用

javascript&#xff1a;call()、apply()、bind()的区别和使用 1 前言 记录javascript的call、apply、bind方法绑定this的区别以及使用。 call、apply、bind的区别&#xff1a; 【相同点】&#xff1a;作用相同&#xff0c;都是动态修改this指向&#xff1b;都不会修改原先函…...

ubuntu系统安装systemc-2.3.4流程

背景&#xff1a;systemC编程在linux下的基础环境配置 1&#xff0c;下载安装包&#xff0c;并解压 &#xff08;先下载了最新的3.0.0&#xff0c;安装时候显示sc_cmnhdr.h:115:5: error: #error **** SystemC requires a C compiler version of at least C17 **** &#xff…...

Java开发中的entity、vo和pojo

Java开发中的entity、vo和pojo 1.Entity实体2.vo3.pojo 1.Entity实体 定义&#xff1a; Entity 通常指的是与数据库表对应的对象。它包含了与数据库表字段相对应的属性和一些业务逻辑方法。Entity 通常用于数据的持久化操作&#xff0c;如增删改查。使用场景&#xff1a; 当需…...

通过IPV6+DDNS实现路由器远程管理和Win远程桌面控制

前期需要的准备&#xff1a; 软路由&#xff0c;什么系统都可以&#xff0c;要支持IPV6&#xff0c;能够自动添加解析 光猫的管理员账号&#xff0c;能够进入光猫修改配置&#xff0c;拨号上网账号 域名账号和DNS服务 主要步骤&#xff1a; 利用管理员账号&#xff0c;进入…...

数据湖/数据仓库

数据湖&#xff08;Data Lake&#xff09;和数据仓库&#xff08;Data Warehouse&#xff09;的主要区别在于它们的目的、存储的数据类型、数据处理方式、数据结构、数据安全性以及数据应用。以下是相关介绍&#xff1a; 目的。数据湖旨在作为一个集中的存储库&#xff0c;存储…...

万兆以太网MAC设计(2)MAC_RX模块

文章目录 前言一、模块功能二、代码三、仿真波形 前言 上文我们打通了了万兆以太网物理层和数据链路层&#xff0c;其实就是会使用IP核了&#xff0c;本文将正式开始MAC层设计第一篇&#xff0c;接收端设计。 一、模块功能 MAC_RX模块功能如下&#xff1a; 解析接收的报文&…...

D. Solve The Maze Codeforces Round 648 (Div. 2)

题目链接&#xff1a; Problem - 1365D - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/problemset/problem/1365/D 题目大意&#xff1a; 有一张地图n行m列&#xff08;地图外面全是墙&#xff09;&#xff0c…...

CPU核心数、线程数都是什么意思?

最早&#xff0c;每个物理 cpu 上只有一个核心&#xff0c;对操作系统而言&#xff0c;也就是同一时刻只能运行一个进程/线程。 为了提高性能&#xff0c;cpu 厂商开始在单个物理 cpu 上增加核心&#xff08;实实在在的硬件存在&#xff09;&#xff0c;也就出现了多核 cpu&…...

每日一篇 4.12

misstep&#xff1a;失误 epic proportions.&#xff1a;史无前例 arguably&#xff1a;按理来说 assembly&#xff1a;组装 performed &#xff1a;执行 underpins&#xff1a;支撑 holds a monopoly&#xff1a;垄断了 shipped&#xff1a;发货 a market capitalizati…...

鸿蒙南向开发:【智能烟感】

样例简介 智能烟感系统通过实时监测环境中烟雾浓度&#xff0c;当烟雾浓度超标时&#xff0c;及时向用户发出警报。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可以远程配置智能烟感系统的报警阈值&#xff0c;远程接收智能烟感系统报警信息。实现对危险及时报…...

【主题广|检索稳定】2024年生态工程与农业科技国际会议 (EEAT 2024)

2024年生态工程与农业科技国际会议 (EEAT 2024) 2024 International Conference on Ecological Engineering and Agricultural Technology 【会议简介】 2024年生态工程与农业科技国际会议即将在贵阳召开。本次会议将汇集全球生态工程与农业科技领域的专家学者&#xff0c;共…...

代码随想录算法训练营第三十八天|509. 斐波那契数、 70. 爬楼梯、746. 使用最小花费爬楼梯

509 题目&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c…...

07-app端文章搜索

app端文章搜索 1) 今日内容介绍 1.1)App端搜索-效果图 1.2)今日内容 文章搜索 ElasticSearch环境搭建 索引库创建 文章搜索多条件复合查询 索引数据同步 搜索历史记录 Mongodb环境搭建 异步保存搜索历史 查看搜索历史列表 删除搜索历史 联想词查询 联想词的来源 联…...

✔ ★Java项目——设计一个消息队列(二)

Java项目——设计一个消息队列 四. 项⽬创建五. 创建核⼼类创建 Exchange&#xff08;名字、类型、持久化&#xff09;创建 MSGQueue&#xff08;名字、持久化、独占标识&#xff09;创建 Binding&#xff08;交换机名字、队列名字、bindingKey用于与routingKey匹配&#xff09…...

Java语言实现生产者/消费者问题

经典例题&#xff1a;生产者/消费者问题 生产者(Productor)将产品放在柜台(Counter)&#xff0c;而消费者(Customer)从柜台 处取走产品&#xff0c;生产者一次只能生产固定数量的产品(比如:1&#xff09;&#xff0c; 这时柜台中不能 再放产品,此时生产者应停止生产等待消费者…...

bugku-web-file_get_contents

<?php extract($_GET); if (!empty($ac)){$f trim(file_get_contents($fn));if ($ac $f){echo "<p>This is flag:" ." $flag</p>";}else{echo "<p>sorry!</p>";} } ?> 这里涉及到几个不常用的函数 这里直接构…...

Python数据处理和常用库(如NumPy、Pandas)

Python是一种功能强大的编程语言&#xff0c;广泛应用于数据处理和分析领域。在Python中&#xff0c;有一些常用的库可以帮助我们进行数据处理和分析&#xff0c;其中包括NumPy和Pandas。下面是关于这两个库的简介和使用示例&#xff1a;NumPy&#xff08;Numerical Python&…...