Rust常用加密算法

news2024/11/25 0:46:08

哈希运算(以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 多平台发布

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

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

相关文章

Python中实例方法、类方法、静态方法的区别与作用

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 Python中至少有三种比较常见的方法类型&#xff0c;即实例方法&#xff0c;类方法、静态方法。 它们是如何定义的呢&#xff1f;如何调用的呢&#xff1f;它们又有何区别和作用呢&#xff1f;且看下文。 首先&#xf…

pdf.js构建时,报Cannot read property ‘createChildCompiler‘ of undefined #177的解决方法

在本地和CI工具进行构建时&#xff0c;报如下错误。 Cannot read property createChildCompiler of undefined #177解决方法&#xff1a; 找到vue.config.js&#xff0c;在 module.exports {parallel: false, //新增的一行chainWebpack(config) {....config.module.rule(&…

MySQL数据库管理高级语句

数据表高级操作 复制表及内容 #复制表及内容create table copy1 like zh1 ; #复制格式&#xff0c;通过LIKE方法&#xff0c;复制zh1表结构生成copy1表 insert into copy1 select * from zh1; #备份内容 克隆表 克隆表&#xff0c;将数据表的数据记录生成到新的表中C…

5个能提高效率的在线设计工具,真的很好用!

随着设计工作的不断变化&#xff0c;能在线使用的设计工具就成了设计师更需要的设计工具&#xff0c;它体量小&#xff0c;使用方便&#xff0c;不尽能帮助设计师完成正常的设计工作&#xff0c;还可以给设计师带来舒适的使用体验&#xff0c;今天本文收集整理了5款好用的在线设…

免费照片转绘画风格软件-FotoSketcher

FotoSketcher一款免费照片转绘画风格软件&#xff0c;只需点击几下鼠标即可自动将照片转换为艺术作品。支持从铅笔素描到水彩画或油画、钢笔画、墨水画、抽象艺术和卡通画&#xff0c;有 20 多种不同的风格可供选择&#xff0c;工具还可以修改原始照片增强对比度、锐化、简化图…

hive问题总结

往往用了很久的函数却只知道其单一的应用场景&#xff0c;本文将不断完善所遇到的好用的hive内置函数。 1.聚合函数或者求最大最小值函数搭配开窗函数使用可以实现滑动窗口 例&#xff1a; SELECT event,time,session_id,COLLECT_LIST(event) OVER (PARTITION BY session_id …

日本核污水今日入海,这帮黑客怒了!

自2011年东日本大地震以来&#xff0c;日本谋划已久的福岛核电站核污水排海计划已于8月24日下午起正式施行&#xff0c;预计排污周期长达30年&#xff0c;整个海洋及其生物都有可能遭受难不可逆的毁灭性打击。 据现场媒体报道&#xff0c;经过17分钟的流淌&#xff0c;核污染水…

Arduino程序设计(四)按键消抖+按键计数

按键消抖按键计数 前言一、按键消抖二、按键计数1、示例代码2、按键计数实验 参考资料 前言 本文主要介绍两种按键控制LED实验&#xff1a;第一种是采用软件消抖的方法检测按键按下的效果&#xff1b;第二种是根据按键按下次数&#xff0c;四个LED灯呈现不同的流水灯效果。 一…

mysql的登录与退出

mysql是c/s架构&#xff0c;意味着同时要有客户端和服务端 1 找到客户端。mysql.exe的安装目录 打开命令行 2 输入对应的服务器的ip&#xff0c;如果是本地&#xff0c;就是Localhost&#xff0c;如果是远程服务器&#xff0c;那就输入对应ip/域名。并且指定mysql监听的端口 …

10大开源工具,每个开发者都应该知道

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

通过仿真理解RLC串联电路和RLC并联电路的阻抗、导纳、品质因数等概念

一.RLC串联电路 1.阻抗 CSDN编辑公式太难受了。。。直接上PPT~ 2.RLC串联电路阻抗的仿真分析 仿真与理论计算&#xff0c;还是有些误差存在的。 二.RLC并联电路 1.导纳 2.RLC并联电路阻抗的仿真分析 3.RLC并联电路的“虚断”特性 三、LC电路的作用 四、品质因子Q 1.RLC串…

【keepalived双机热备与 lvs(DR)】

目录 一、概述 1.简介 2.原理 3.作用 二、安装 1.配置文件 2.配置项 三、功能模块 1.core 2.vrrp 3.check 四、配置双机热备 1.master 2.backup 五、验证 1.ping验证 2.服务验证 六、双机热备的脑裂现象 七、keepalivedlvs&#xff08;DR&#xff09; 1.作…

C++11特性详解

一、简介 在C11标准出来之前&#xff0c;一直是C98/03标准占引领地位&#xff0c;而C98/03标准是C98标准在2003年将存在的一些漏洞进行了修复&#xff0c;但并没有核心语法的改动。相比于C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140个新特性&…

通过Putty对Linux服务器进行文件的上传与下载

1、下载安装Putty&#xff0c;下载地址&#xff1a;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 2、打开cmd窗口&#xff0c;通过命令行进入安装路径&#xff0c;如&#xff1a; 3、上传文件 pscp 文件 用户名服务器ip:目录使用“ -l ”选项可以指定用户…

keepalived+lvs(DR)

目录 一&#xff0c;作用 二&#xff0c;调度器配置 1&#xff0c;安装keepalived 2&#xff0c; 安装ipvsadm 3&#xff0c; 配置keepalived 4. 查看lvs节点状态 5&#xff0c; web节点配置 1.1 调整ARP参数 1.2 配置虚拟IP地址 1.3添加回环路由 1.4安装nginx并写…

【Unity学习笔记】DOTween(2)官方案例

本文中大部分内容学习来自DOTween官方文档 此处无法展示动图&#xff08;懒得录GIF&#xff09;&#xff0c;请下载官方案例场景自行学习 文章目录 场景1 基本补间场景2 动态补间场景3 Shader修改场景4 路径拟合运动场景5 序列播放场景6 UGUI 场景1 基本补间 案例一展示了最基…

技术博客写作「个人经验分享」

技术博客写作「个人经验分享」 仔细想来&#xff0c;从19年我刚开始试着技术写作算起&#xff0c;已经过去了好几年时间。刚好趁着这次的[赠送奖牌活动(奖牌很好看&#xff0c;我很想要hhh&#x1f602;)],来分享一下我关于技术博客写作的一些个人经验~ 文章目录 技术博客写作「…

k8s 常用命令(四)

12、删除pod中的nginx服务及service [rootmaster ~]# kubectl delete deployment nginx -n kube-public [rootmaster ~]# kubectl delete svc -n kube-public nginx-service 13、查看endpoint的信息 [rootmaster ~]# kubectl get endpoints 14、修改/更新&#xff08;镜像、…

内网穿透实战应用-windwos10系统搭建我的世界服务器,内网穿透实现联机游戏Minecraft

文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …

Unbutu系统-Docker安装、JDK环境配置,Docker常用指令、Docker安装MySQL、Redis、Tomcat、Nginx,前端后分离项目部署

目录 1、防火墙 1.1、查看防火墙状态 1.2、开启防火墙 1.3、关闭防火墙 1.4、重启防火墙 1.5、查看防火墙版本 2、安装JDK 2.1、官网下载tar包 2.3、解压tar.gz文件 2.4、配置环境变量 2.4.1、查看安装路径 2.4.2、设置环境变量 2.4.3、执行该让环境变量生效 2.4…