乐趣区

关于后端: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

能够在线比对验证一下


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

<font size=1 color=”grey”>
MAC(Message Authentication Code,音讯认证码算法)是含有密钥散列函数算法,兼容了 MD 和 SHA 算法的个性,并在此基础上加上了密钥。因而 MAC 算法也常常被称作 HMAC 算法。
HMAC 算法首先它是基于信息摘要算法的。目前次要汇合了 MD 和 SHA 两大系列音讯摘要算法。其中 MD 系列的算法有 HmacMD2、HmacMD4、HmacMD5 三种算法;SHA 系列的算法有 HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512 五种算法。

HMAC 算法除了须要信息摘要算法外,还须要一个密钥。HMAC 的密钥能够是任何长度,如果密钥的长度超过了摘要算法信息分组的长度,则首先应用摘要算法计算密钥的摘要作为新的密钥。个别不倡议应用太短的密钥,因为密钥的长度与平安强度是相干的。通常选取密钥长度不小于所选用摘要算法输入的信息摘要的长度。

</font>

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: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
key2: [222, 156, 238, 1, 219, 222, 104, 217, 162, 90, 44, 240, 252, 125, 103, 47, 217, 104, 37, 81, 138, 15, 191, 43, 204, 182, 103, 51, 123, 148, 92, 255]
key: 3pzuAdveaNmiWizw/H1nL9loJVGKD78rzLZnM3uUXP8=
HMAC digest: 33f440b743d37078d428796c028f47237400f91bb638cc843508224f224f4407

能够在线比对验证一下:

发现不统一 …

用 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 为例)

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

AES 加密原理:
采纳对称分组明码体制,密钥的长度起码反对为 128、192、256 位;加密分组长度 128 位,如果数据块及密钥长度有余时,会补齐进行加密。
</font>

aes 加密中的 iv 是什么

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

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: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
key2: [199, 203, 0, 244, 50, 50, 159, 132, 73, 176, 74, 56, 85, 31, 15, 218]
key: x8sA9DIyn4RJsEo4VR8P2g==
iv1:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
iv2:[74, 79, 85, 77, 17, 214, 64, 71, 35, 240, 34, 105, 42, 80, 40, 226]
iv: Sk9VTRHWQEcj8CJpKlAo4g==
最终后果为:b4NBF3CKKLfYuLg=

本文由 mdnice 多平台公布

退出移动版