当前位置:网站首页>Rust blockchain development - signature encryption and private key public key

Rust blockchain development - signature encryption and private key public key

2022-07-05 03:59:00 He who knows what comes will go against it

Signature and encryption

1. Use the private key and encrypt the information , Then decrypt the information with the public key , It's mathematical signature , The meaning of signature is to ensure that the source of information is the private key holder .
2. Use public key encryption , Private key decryption , Encrypted transmission , It is to ensure that only the private key holder can decrypt and read the information even if it is exposed .
3. To implement signature or encryption , There are generally three steps , Key pair generation algorithm , Private key signature algorithm , Public key verification algorithm .

Code example

1.Rust Provides crypto library , It realizes the symmetric password commonly used in cryptography 、 Public key password 、 One way hash function 、 Message authentication code 、 digital signature 、 Random number generator and other algorithms .
 Insert picture description here
2. The signature here needs ed25519 This man's algorithm .

rely on

[dependencies]
rust-crypto = "^0.2"
secp256k1  = "0.23.1"
hex = "0.4.3"
sha256 = "1.0.3"

Sign information

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)
}

Verify the signature

	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));
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] 

 Insert picture description here
3. Turn the signature into String Output .

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
}
"de0d5a0449023af0b76e1378fb4cdb097d979cda030cedd103edb0982ac9ba714f4206f9f5e8661d36b8f91f3187e2a49ef54cd524bfa12c7a842fddac2e9001"
原网站

版权声明
本文为[He who knows what comes will go against it]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207050340022216.html