• Rust区块琏开发——签名加密与私钥公钥


    签名与加密

    1.使用私钥加加密信息,然后用公钥解密信息,就是数学签名,签名的意义是保证信息的来源是私钥持有者。
    2.使用公钥加密,私钥解密,就是加密传输,是为保证信息即使暴露出来也只有私钥持有者才能解密读懂。
    3.要实现签名或者加密,一般分为三个步骤,生成密钥对算法,私钥签名算法,公钥验证算法。

    代码示例

    1.Rust提供了crypto库,它实现了包含了密码学中常用的对称密码、公钥密码、单向散列函数、消息认证码、数字签名、随机数生成器等算法等等。
    在这里插入图片描述
    2.这里签名要用到ed25519这人算法。

    依赖

    [dependencies]
    rust-crypto = "^0.2"
    secp256k1  = "0.23.1"
    hex = "0.4.3"
    sha256 = "1.0.3"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    对信息进行签名

    fn sign(seed_key : String,content:String) -> ([u8;64],[u8;32],[u8;64])
    {
        let seed_bytes = digest_bytes(seed_key.as_bytes());
    
        let seed_u8  = hex::decode(seed_bytes).expect("Invalid Hex String");
        let mut seed: [u8;32] = [0u8;32];
    
        let mut i = 0;
        for val in seed_u8
        {
            seed[i] = val;
            i = i+ 1;
        }
    
        let (private_key, public_key) = keypair(seed.as_ref()); //[U8,64]
        let sig = signature(content.as_bytes(), &private_key); //[U8,64]
        (private_key,public_key,sig)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    验证签名

    	let seed = "3nuhx-7yzml-5uet3-7eplx-kq4u5-roww3-zf6ju-vdvaf-s7q4u".to_string();
        let content = "13445927681169508792";
        let (private_key,public_key,signature) = sign(seed, content.to_string());
        print!("private key = {:?},\npublic key = {:?},\nsignature = {:?} \n",private_key,public_key,signature);
    
        print!("verify = {:?}",verify(content.as_bytes(), &public_key, &signature));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    private key = [189, 205, 57, 2, 52, 206, 172, 150, 110, 248, 19, 146, 86, 244, 107, 190, 49, 227, 130, 188, 139, 207, 157, 94, 226, 25, 27, 15, 172, 38, 160, 108, 19, 100, 112, 203, 240, 28, 155, 193, 252, 17, 194, 53, 43, 146, 165, 135, 131, 100, 154, 142, 226, 120, 180, 51, 203, 162, 168, 38, 156, 49, 115, 95],
    public key = [19, 100, 112, 203, 240, 28, 155, 193, 252, 17, 194, 53, 43, 146, 165, 135, 131, 100, 154, 142, 226, 120, 180, 51, 203, 162, 168, 38, 156, 49, 115, 95],
    signature = [222, 13, 90, 4, 73, 2, 58, 240, 183, 110, 19, 120, 251, 76, 219, 9, 125, 151, 156, 218, 3, 12, 237, 209, 3, 237, 176, 152, 42, 201, 186, 113, 79, 66, 6, 249, 245, 232, 102, 29, 54, 184, 249, 31, 49, 135, 226, 164, 158, 245, 76, 213, 36, 191, 161, 44, 122, 132, 47, 221, 172, 46, 144, 1] 
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    3.把签名转成String输出。

    fn au8_to_string(signature_code : [u8;64]) ->String
    {
        use std::fmt::Write;
        let mut signature_string = String::new();
        for a in signature_code.iter() 
        { 
            write!(signature_string, "{:02x}", a);
        }
        signature_string
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    "de0d5a0449023af0b76e1378fb4cdb097d979cda030cedd103edb0982ac9ba714f4206f9f5e8661d36b8f91f3187e2a49ef54cd524bfa12c7a842fddac2e9001"
    
    • 1
  • 相关阅读:
    【简单介绍下爬山算法】
    Opencv | 直方图
    【Java实现】链表中倒数第k个结点
    GDL学习笔记(二)——图基础知识:中心性
    白盒测试之测试用例设计方法
    k8s集群中ETCD备份和恢复
    Flink窗口
    网络编程套接字
    ABAP-SAP-整合事务码,整合平台,运维工具箱
    GDAL Linux离线源码编译(附源码及编译步骤)
  • 原文地址:https://blog.csdn.net/matt45m/article/details/125556712