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

Rust常用加密算法

哈希运算(以Sha256为例)


main.rs:

use crypto::digest::Digest;
use crypto::sha2::Sha256;

fn main() {
    let input = "dashen";
    let mut sha = Sha256::new();

    sha.input_str(input);

    println!("{}", sha.result_str());
}

Cargo.toml:

[package]
name = "crypto_test"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rustc-serialize = "0.3.24"
rust-crypto = "0.2.36"
rand = "0.8.5"

输出为:

6d65924d8e0580b9ac04d13da91c74c3ae28b08b4be4634ae06e647f42a88913

可以在线比对验证一下

alt



验证数据完整性(使用HMAC)


MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。 HMAC算法首先它是基于信息摘要算法的。目前主要集合了MD和SHA两大系列消息摘要算法。其中MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。

HMAC算法除了需要信息摘要算法外,还需要一个密钥。HMAC的密钥可以是任何长度,如果密钥的长度超过了摘要算法信息分组的长度,则首先使用摘要算法计算密钥的摘要作为新的密钥。一般不建议使用太短的密钥,因为密钥的长度与安全强度是相关的。通常选取密钥长度不小于所选用摘要算法输出的信息摘要的长度。


use std::iter::repeat;

use crypto::hmac::Hmac;
use crypto::mac::Mac;
use crypto::sha2::Sha256;
use rand::{RngCore, rngs::OsRng};
use rustc_serialize::base64::{STANDARD, ToBase64};
use rustc_serialize::hex::ToHex;

use crypto::aes::{self,KeySize};

fn main() {
    let mut key: Vec<u8> = repeat(0u8).take(32).collect();
    println!("key1: {:?}", key);
    OsRng.fill_bytes(&mut key);

    println!("key2: {:?}", key);
    println!("key: {}", key.to_base64(STANDARD));


    let message = "dashen.tech";
    let mut hmac = Hmac::new(Sha256::new(), &key);
    hmac.input(message.as_bytes());
    println!("HMAC digest: {}", hmac.result().code().to_hex());
}

输出:

key1: [00000000000000000000000000000000]
key2: [2221562381219222104217162904424025212510347217104378113815191432041821035112314892255]
key: 3pzuAdveaNmiWizw/H1nL9loJVGKD78rzLZnM3uUXP8=
HMAC digest: 33f440b743d37078d428796c028f47237400f91bb638cc843508224f224f4407

可以在线比对[1]验证一下:

alt

发现不一致...

用Go实现一下:

package main

import (
 "crypto/hmac"
 "crypto/sha256"
 "encoding/hex"
 "fmt"
)

func main() {

 rs := hmacSha256("dashen.tech""3pzuAdveaNmiWizw/H1nL9loJVGKD78rzLZnM3uUXP8=")

 fmt.Println("结果为:", rs)
}

func hmacSha256(data string, secret string) string {
 h := hmac.New(sha256.New, []byte(secret))
 h.Write([]byte(data))
 return hex.EncodeToString(h.Sum(nil))
}

结果为: 019cb6bd005949a61eca8bd8900b03bb481803348a497340b65bfe9c3e4816e5


和在线工具计算出的结果一致,说明rust版的实现有问题...以后再研究下原因




加密内容(以AES为例)


高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES加密原理: 采用对称分组密码体制,密钥的长度最少支持为128、192、256位;加密分组长度128位,如果数据块及密钥长度不足时,会补齐进行加密。

aes加密中的iv是什么[2]

关于AES加解密中CBC模式的IV初始化向量的安全性问题[3]

use std::iter::repeat;

use rand::{RngCore, rngs::OsRng};
use rustc_serialize::base64::{STANDARD, ToBase64};

use crypto::aes::{self, KeySize};
use crypto::symmetriccipher::SynchronousStreamCipher;

fn main() {
    let mut key: Vec<u8> = repeat(0u8).take(16).collect();
    println!("key1: {:?}", key);
    OsRng.fill_bytes(&mut key);
    println!("key2: {:?}", key);
    println!("key: {}", key.to_base64(STANDARD));

    let mut iv: Vec<u8> = repeat(0u8).take(16).collect();
    println!("iv1:{:?}", iv);
    OsRng.fill_bytes(&mut iv);
    println!("iv2:{:?}", iv);
    println!("iv: {}", iv.to_base64(STANDARD));


    let mut cipher = aes::ctr(KeySize::KeySize128, &key, &iv);
    let secret = "dashen.tech";
    let mut output: Vec<u8> = repeat(0u8).take(secret.len()).collect();
    cipher.process(secret.as_bytes(), &mut output[..]);
    println!("最终结果为:{}", output.to_base64(STANDARD));
}

输出:

key1: [0000000000000000]
key2: [19920302445050159132731767456853115218]
key: x8sA9DIyn4RJsEo4VR8P2g==
iv1:[0000000000000000]
iv2:[747985771721464713524034105428040226]
iv: Sk9VTRHWQEcj8CJpKlAo4g==
最终结果为:b4NBF3CKKLfYuLg=

参考资料

[1]

在线比对: http://www.metools.info/code/c25.html

[2]

aes加密中的iv是什么: https://blog.csdn.net/weixin_39559119/article/details/111180758

[3]

关于AES加解密中CBC模式的IV初始化向量的安全性问题: https://www.jianshu.com/p/45848dd484a9

本文由 mdnice 多平台发布

相关文章:

Rust常用加密算法

哈希运算(以Sha256为例) main.rs: use crypto::digest::Digest;use crypto::sha2::Sha256;fn main() { let input "dashen"; let mut sha Sha256::new(); sha.input_str(input); println!("{}", sha.result_str());} Cargo.toml: [package]n…...

[管理与领导-55]:IT基层管理者 - 扩展技能 - 1 - 时间管理 -2- 自律与自身作则,管理者管好自己时间的五步法

前言&#xff1a; 管理好自己的时间&#xff0c;不仅仅是理念&#xff0c;也是方法和流程。 步骤1&#xff1a;理清各种待办事项 当提到工作事项时&#xff0c;这通常指的是要完成或处理的工作任务或事务。这些事项可以包括以下内容&#xff1a; 任务分配&#xff1a;根据工作…...

电子商务员考试题库及答案(中级)--判断题

电子商务员题库 一、判断题 1&#xff0e;EDI就是按照商定的协议&#xff0c;将商业文件分类&#xff0c;并通过计算机网络&#xff0c;在贸易伙伴的计算机网络系统之间进行数据交换和自动处理。〔〕 2.相互通信的EDI的用户必须使用相同类型的计算机。〔 〕 3.EDI采用共同…...

(WAF)Web应用程序防火墙介绍

&#xff08;WAF&#xff09;Web应用程序防火墙介绍 1. WAF概述 ​ Web应用程序防火墙&#xff08;WAF&#xff09;是一种关键的网络安全解决方案&#xff0c;用于保护Web应用程序免受各种网络攻击和威胁。随着互联网的不断发展&#xff0c;Web应用程序变得越来越复杂&#x…...

SpringMVC拦截器常见应用场景

在Spring MVC中&#xff0c;拦截器是通过实现HandlerInterceptor接口来定义的。该接口包含了三个方法&#xff1a; preHandle&#xff1a;在请求到达处理器之前执行&#xff0c;可以进行一些预处理操作。如果返回false&#xff0c;则请求将被拦截&#xff0c;不再继续执行后续的…...

爬虫:绕过5秒盾Cloudflare和DDoS-GUARD

本文章仅供技术研究参考&#xff0c;勿做它用&#xff01; 5秒盾的特点 <title>Just a moment...</title> 返回的页面中不是目标数据&#xff0c;而是包含上面的代码&#xff1a;Just a moment... 或者第一次打开网页的时候&#xff1a; 这几个特征就是被Cloud…...

数据仓库环境下的超市进销存系统结构

传统的进销存系统建立的以单一数据库为中心的数据组织模式&#xff0c;已经无 法满足决策分析对数据库系统的要求&#xff0c;而数据仓库技术的出现和发展&#xff0c;为上述问题 的解决提供了强有力的工具和手段。数据仓库是一种对多个分布式的、异构的数据 库提供统一查询…...

leetcode:2011. 执行操作后的变量值(python3解法)

难度&#xff1a;简单 存在一种仅支持 4 种操作和 1 个变量 X 的编程语言&#xff1a; X 和 X 使变量 X 的值 加 1--X 和 X-- 使变量 X 的值 减 1 最初&#xff0c;X 的值是 0 给你一个字符串数组 operations &#xff0c;这是由操作组成的一个列表&#xff0c;返回执行所有操作…...

ubuntu下mysql

安装&#xff1a; sudo apt update sudo apt install my_sql 安装客户端&#xff1a; sudo apt-get install mysql-client sudo apt-get install libmysqlclient-dev 启动服务 启动方式之一&#xff1a; sudo service mysql start 检查服务器状态方式之一&#xff1a;sudo …...

大模型从入门到应用——LangChain:链(Chains)-[链与索引:检索式问答]

分类目录&#xff1a;《大模型从入门到应用》总目录 下面这个示例展示了如何在索引上进行问答&#xff1a; from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.text_splitter import CharacterTextSplitte…...

【LeetCode-中等题】142. 环形链表 II

文章目录 题目方法一&#xff1a;哈希表set去重方法二&#xff1a;快慢指针 题目 方法一&#xff1a;哈希表set去重 思路&#xff1a;我们遍历链表中的每个节点&#xff0c;并将它记录下来&#xff1b;一旦遇到了此前遍历过的节点&#xff0c;就可以判定链表中存在环。借助哈希…...

Android TV开发之VerticalGridView

Android TV应用开发和手机应用开发是一样的&#xff0c;只是多了焦点控制&#xff0c;即选中变色。 androidx.leanback.widget.VerticalGridView 继承 BaseGridView &#xff0c; BaseGridView 继承 RecyclerView 。 所以 VerticalGridView 就是 RecyclerView &#xff0c;使…...

SpringBoot+Vue项目添加腾讯云人脸识别

一、引言 人脸识别是一种基于人脸特征进行身份认证和识别的技术。它使用计算机视觉和模式识别的方法&#xff0c;通过分析图像或视频中的人脸特征&#xff0c;例如脸部轮廓、眼睛、鼻子、嘴巴等&#xff0c;来验证一个人的身份或识别出他们是谁。 人脸识别可以应用在多个领域…...

什么是IPv4?什么又是IPv6?

IPv4网络IPv4地址 IPv6网络IPv6地址 路由总结感谢 &#x1f496; hello大家好&#x1f60a; IPv4网络 IPv4&#xff08;Internet Protocol Version 4&#xff09;是当今互联网上使用的主要网络协议。 IPv4地址 IPv4 地址有32位&#xff0c;通常使用点号分隔的四个十进制八位…...

飞腾FT-2000/4、D2000 log报错指导(3)

在爱好者群中遇见了很多的固件问题,这里总结记录了大家的交流内容和调试心得。主要是飞腾桌面CPU FT-2000/4 D2000相关的,包含uboot和UEFI。希望对大家调试有所帮助。 这个专题会持续更新,凑够一些就发。 23 在s3 唤醒时报错如下 check suspend ,Platform exception report…...

基于安卓的考研助手系统app 微信小程序

&#xff0c;设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。HBuilder技术作为当前最流行的操作平台&#xff0c;自然也存在着大量的应用服务需求。 本课题研究的是基于HBuilder技术平台的安卓的考研助手APP&#xff0c;开发这款安卓的考研助手APP主要是为了…...

Leetcode:238. 除自身以外数组的乘积【题解超详细】

纯C语言实现&#xff08;小白也能看明白&#xff09; 题目 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数…...

基于单片机的智能数字电子秤proteus仿真设计

一、系统方案 1、当电子称开机时&#xff0c;单片机会进入一系列初始化&#xff0c;进入1602显示模式设定&#xff0c;如开关显示、光标有无设置、光标闪烁设置&#xff0c;定时器初始化&#xff0c;进入定时器模式&#xff0c;如初始值赋值。之后液晶会显示Welcome To Use Ele…...

大数据(二)大数据行业相关统计数据

大数据&#xff08;二&#xff09;大数据行业相关统计数据 目录 一、大数据相关的各种资讯 二、转载自网络的大数据统计数据 2.1、国家大数据政策 2.2、产业结构分析 2.3、应用结构分析 2.4、数据中心 2.5、云计算 一、大数据相关的各种资讯 1. 据IDC预测&#xff0…...

Ruoyi安装部署(linux环境、前后端不分离版本)

目录 简介 1 新建目录 2 安装jdk 2.1 jdk下载 2.2 解压并移动文件夹到/data/service目录 2.3 配置环境变量 3 安装maven 3.1 进入官网下载最新的maven 3.2 解压并移动文件夹到/data//service目录 3.3 配置环境变量 3.4 配置本地仓库地址与阿里云镜像 4 安装git 4.…...

终极RPG Maker游戏资源解密工具:无需安装的浏览器解决方案

终极RPG Maker游戏资源解密工具&#xff1a;无需安装的浏览器解决方案 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https://git…...

深入LTPI状态机:为什么你的链路配置总失败?Advertise与Configure状态详解

深入LTPI状态机&#xff1a;为什么你的链路配置总失败&#xff1f;Advertise与Configure状态详解 在LTPI协议的实际部署中&#xff0c;许多工程师都会遇到一个令人困惑的现象&#xff1a;明明按照规范完成了链路训练&#xff0c;却在配置阶段频繁出现回退到Link Detect状态的情…...

DataStore vs SharedPreferences 迁移指南:告别 ANR,拥抱类型安全

DataStore vs SharedPreferences 迁移指南&#xff1a;告别 ANR&#xff0c;拥抱类型安全 一句话收益&#xff1a;掌握从 SharedPreferences 迁移到 Jetpack DataStore 的完整路径&#xff0c;彻底消除主线程 I/O 阻塞与类型安全隐患。 适用版本&#xff1a;Android API 21&…...

嵌入式条码扫描头:从核心原理到八大行业应用实战

1. 项目概述&#xff1a;从“扫码”到“感知”的嵌入式革命每次在超市收银台听到“嘀”的一声&#xff0c;或者在快递驿站看到工作人员拿着手持设备快速扫过包裹&#xff0c;我们都在与条码扫描技术打交道。但你是否想过&#xff0c;这些看似简单的“扫码”动作背后&#xff0c…...

从零开发游戏需要学习的c#模块,第二十一章(精灵动画 —— 让角色走起来)

今天我们要学习的内容是 理解精灵图集的原理 加载精灵图集并切帧 实现四方向行走动画 静止时显示待机帧 第一步&#xff1a;准备精灵图集 精灵图集就是一张大图里包含多个小图&#xff08;帧&#xff09;&#xff0c;播放时依次显示每一帧&#xff0c;形成动画效果。 一…...

技术人的收入结构优化:工资、副业、投资的三支柱模型

在软件测试的世界里&#xff0c;我们熟知一个真理&#xff1a;没有任何单一测试策略能保证系统的绝对健壮。一个高质量的系统&#xff0c;必然建立在单元测试、集成测试、系统测试和验收测试所构成的稳固金字塔上。同样的逻辑&#xff0c;也适用于我们技术人的财务健康。过度依…...

破解安卓设备标识获取难题:Android_CN_OAID的全栈兼容解决方案

破解安卓设备标识获取难题&#xff1a;Android_CN_OAID的全栈兼容解决方案 【免费下载链接】Android_CN_OAID 安卓设备唯一标识解决方案&#xff0c;可替代移动安全联盟&#xff08;MSA&#xff09;统一 SDK 闭源方案。包括国内手机厂商的开放匿名标识&#xff08;OAID&#xf…...

Python API认证与授权实战:从Basic Auth到OAuth2.0

Python API认证与授权实战&#xff1a;从Basic Auth到OAuth2.0 引言 API安全是后端开发中至关重要的一环。作为从Python转向Rust的后端开发者&#xff0c;我深刻体会到认证与授权机制的重要性。一个安全可靠的API需要完善的认证体系来保护敏感数据和资源。本文将从实战角度出…...

效率直接起飞 2026 最新!降AIGC工具测评与推荐

2026年真正好用的AI论文降重与改写工具&#xff0c;核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...

为openclaw配置taotoken作为其ai供应商的详细步骤指南

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为OpenClaw配置Taotoken作为其AI供应商的详细步骤指南 OpenClaw是一款流行的AI智能体开发工具&#xff0c;它允许开发者通过配置来…...