当前位置: 首页 > 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…...

基于Altera Cyclone4 FPGA-EP4CE15F17C8核心板的硬件设计实战(原理图+PCB+AD09工程)

1. 从零开始搭建FPGA核心板硬件系统 第一次接触FPGA核心板设计时&#xff0c;我被密密麻麻的引脚和复杂的电源系统搞得头晕眼花。直到用AD09完整走完EP4CE15F17C8核心板的设计流程&#xff0c;才发现硬件开发就像搭积木——只要掌握模块化思维&#xff0c;菜鸟也能做出专业级设…...

PCB设计新手必看:从零开始掌握PCB设计全流程

1. PCB设计入门&#xff1a;从零开始的完整指南 刚接触PCB设计时&#xff0c;我完全被各种专业术语和复杂流程搞懵了。直到自己动手做了几块板子&#xff0c;才发现其实只要掌握正确的方法&#xff0c;PCB设计并没有想象中那么难。这篇文章就是把我踩过的坑和积累的经验&#x…...

OpenSpec 生成文件说明

proposal.md —— 为什么做、做什么&#xff08;产品/范围&#xff09; Why&#xff1a;要解决什么问题、机会是什么。What Changes&#xff1a;会新增/改掉/删掉哪些能力&#xff0c;有没有 BREAKING。Capabilities&#xff1a;会动到哪些能力名&#xff08;对应后面 specs/&l…...

Phi-4-Reasoning-Vision基础教程:双卡4090环境安装、镜像拉取与端口映射

Phi-4-Reasoning-Vision基础教程&#xff1a;双卡4090环境安装、镜像拉取与端口映射 1. 环境准备与快速部署 在开始之前&#xff0c;请确保您的系统满足以下要求&#xff1a; 硬件配置&#xff1a;至少两张NVIDIA RTX 4090显卡&#xff08;24GB显存&#xff09;软件环境&…...

从Word2Vec到BERT:聊聊Embedding技术这十年,我们踩过的‘坑’和收获的‘宝’

从Word2Vec到BERT&#xff1a;Embedding技术的十年演进与实战智慧 记得2013年第一次用Word2Vec处理电商评论时&#xff0c;我们团队对着"iPhone"和"安卓手机"的向量相似度兴奋不已——这两个在传统词袋模型里毫无关联的词&#xff0c;在向量空间中的余弦相…...

Redis 的核心机制

Redis 作为高性能内存数据库&#xff0c;在现代架构中早已超越了单纯的“缓存”角色&#xff0c;成为了支撑高并发、分布式系统的基石。深入理解其核心场景、持久化机制、内存管理及集群原理&#xff0c;是构建稳定、高效系统的关键。 以下结合具体业务场景&#xff0c;深度解析…...

微信小程序身份证检测实战:从createVKSession版本兼容到真机调试全解析

1. 微信小程序身份证检测功能开发概述 最近在开发一个需要身份证识别功能的小程序时&#xff0c;遇到了一个让人头疼的问题&#xff1a;在开发者工具中运行正常&#xff0c;但真机调试时却报错"createVKSession:fail The current device does not support version v1&quo…...

3个智能化解决方案让科研工作者实现投稿管理效率革命:Elsevier Tracker无缝集成工具

3个智能化解决方案让科研工作者实现投稿管理效率革命&#xff1a;Elsevier Tracker无缝集成工具 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 行业现状分析 学术出版领域数字化转型过程中&#xff0c;科研工作者…...

Path of Building:流放之路玩家必备的终极Build规划神器

Path of Building&#xff1a;流放之路玩家必备的终极Build规划神器 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 如果你正在玩《流放之路》并为复杂的Build规划感到头…...

QobuzDownloaderX-MOD:一站式高品质音乐下载解决方案

QobuzDownloaderX-MOD&#xff1a;一站式高品质音乐下载解决方案 【免费下载链接】QobuzDownloaderX-MOD Downloads streams directly from Qobuz. Experimental refactoring of QobuzDownloaderX by AiiR 项目地址: https://gitcode.com/gh_mirrors/qo/QobuzDownloaderX-MOD…...