Entwicklung der Rust-Blockchain – Signaturverschlüsselung und privater Schlüssel, öffentlicher Schlüssel

Signatur und Verschlüsselung

1. Verwenden Sie den privaten Schlüssel, um verschlüsselte Informationen hinzuzufügen, und verwenden Sie dann den öffentlichen Schlüssel, um die Informationen zu entschlüsseln, bei denen es sich um eine mathematische Signatur handelt. Die Bedeutung der Signatur besteht darin, sicherzustellen, dass die Quelle der Informationen der Inhaber des privaten Schlüssels ist.
2. Bei der Verschlüsselung mit dem öffentlichen Schlüssel und bei der Entschlüsselung mit dem privaten Schlüssel handelt es sich um eine verschlüsselte Übertragung, um sicherzustellen, dass selbst wenn die Informationen offengelegt werden, nur der Inhaber des privaten Schlüssels sie entschlüsseln und verstehen kann.
3. Die Implementierung der Signatur oder Verschlüsselung erfolgt im Allgemeinen in drei Schritte: Generieren eines Schlüsselpaaralgorithmus, Signaturalgorithmus für private Schlüssel und Verifizierungsalgorithmus für öffentliche Schlüssel.

Codebeispiel

1. Rust stellt eine Kryptobibliothek bereit, die in der Kryptografie häufig verwendete Algorithmen implementiert, einschließlich symmetrischer Kryptografie, Public-Key-Kryptografie, Einweg-Hash-Funktionen, Nachrichtenauthentifizierungscodes, digitale Signaturen, Zufallszahlengeneratoren usw.
Fügen Sie hier eine Bildbeschreibung ein
2. Die Signatur verwendet hier den ed25519-Algorithmus.

vertrauen

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

unterschreiben Sie die Nachricht

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

Signatur überprüfen

	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] 

Fügen Sie hier eine Bildbeschreibung ein
3. Konvertieren Sie die Signatur in eine String-Ausgabe.

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"

Acho que você gosta

Origin blog.csdn.net/matt45m/article/details/125556712
Recomendado
Clasificación