[區塊鏈lab2] 構建具備加密功能的Web服務端

實驗目標:

掌握區塊鏈中密碼技術的工作原理。在基于Flask框架的服務端中實現哈希算法的加密功能。

實驗內容:

構建Flash Web服務器,實現哈希算法、非對稱加密算法的加密功能。

實驗步驟:

  1. 哈希算法的應用:創建hash_util.py文件,然后把相關代碼輸入文件,通過命令行執行如下命令“python hash_util.py”,得到”Hello World”哈希加密后結果。
  1. 引入hashlib 依賴包(默認已安裝)
  2. 定義需要加密的變量“Hello World”
  3. 通過hashlib 的sha256 方法加密
  4. 最后輸出加密結果

  1. 非對稱密碼算法的應用:創建crypto_util.py文件,然后把相關代碼輸入文件,實現ECC算法的簽名與驗簽
  1. 安裝ecdsa 依賴包,執行命令“pip install ecdsa”

  1. Ecdsa方法介紹:
  1. SigningKey/VerifyingKey
  2. s=sk.to_string()/SigningKey.from_string(s, curve)
  3. sk.to_pem() /SigningKey.from_pem()
  4. sign()/verify()

  1. 在服務器中實現加密功能
  1. 構建哈希算法的處理函數

在實驗一simple_app項目中加入services.py,并在其中加入哈希算法的加密功能,相關代碼如下:

import hashlib

def hash_encrypt(input):

????"""

????使用哈希算法加密

????:param input: 客戶端發送的數據

????:return: 返回給客戶端的加密數據

????"""

????hash_code = hashlib.sha256(input.encode()).hexdigest()

????return hash_code

  1. app.py文件中加入哈希算法處理的HTTP請求響應

@app.route('/encrypt', methods=['GET'])

def encrypt():

????"""

????哈希函數加密

????:return: 加密的字典對象

????"""

????data = request.args.get('data')

????res = services.hash_encrypt(data)

????return {

????????'res': res

}

注意,一定要引用services

使用Postman驗證接口正確性

實驗

  1. 利用ECC實現對“學號姓名”的簽名和驗簽。
from ecdsa import SigningKey, VerifyingKey, NIST256p
import hashlibdef generate_keys():"""生成ECC密鑰對"""private_key = SigningKey.generate(curve=NIST256p)public_key = private_key.get_verifying_key()return private_key, public_keydef sign_message(message, private_key):"""使用私鑰對消息進行簽名"""# 對消息進行哈希message_hash = hashlib.sha256(message.encode()).digest()# 使用私鑰簽名signature = private_key.sign(message_hash)return signaturedef verify_signature(message, signature, public_key):"""使用公鑰驗證簽名"""try:# 對消息進行哈希message_hash = hashlib.sha256(message.encode()).digest()# 驗證簽名public_key.verify(signature, message_hash)return Trueexcept:return Falsedef main():# 要簽名的消息message = "lvy"# 生成密鑰對private_key, public_key = generate_keys()# 簽名signature = sign_message(message, private_key)# 驗證簽名is_valid = verify_signature(message, signature, public_key)# 打印結果print("消息:", message)print("私鑰:", private_key.to_string().hex())print("公鑰:", public_key.to_string().hex())print("簽名:", signature.hex())print("驗證結果:", "簽名有效" if is_valid else "簽名無效")# 嘗試使用錯誤的消息驗證wrong_message = "023301794114明浩東1"is_valid_wrong = verify_signature(wrong_message, signature, public_key)print("\n使用錯誤消息驗證:")print("消息:", wrong_message)print("驗證結果:", "簽名有效" if is_valid_wrong else "簽名無效")if __name__ == "__main__":main() 

2.利用HTTP接口實現GET加密消息為:學號+姓名。

from flask import Flask, jsonify, request
from ecdsa import SigningKey, VerifyingKey, NIST256p
import hashlib
import jsonapp = Flask(__name__)# 全局變量存儲密鑰對
private_key = None
public_key = None
signature = Nonedef generate_keys():"""生成ECC密鑰對"""global private_key, public_keyprivate_key = SigningKey.generate(curve=NIST256p)public_key = private_key.get_verifying_key()return private_key, public_keydef sign_message(message):"""使用私鑰對消息進行簽名"""global private_key, signatureif private_key is None:private_key, _ = generate_keys()# 對消息進行哈希message_hash = hashlib.sha256(message.encode()).digest()# 使用私鑰簽名signature = private_key.sign(message_hash)return signaturedef verify_signature(message, signature):"""使用公鑰驗證簽名"""global public_keyif public_key is None:_, public_key = generate_keys()try:# 對消息進行哈希message_hash = hashlib.sha256(message.encode()).digest()# 驗證簽名public_key.verify(signature, message_hash)return Trueexcept:return False@app.route('/encrypt', methods=['GET'])
def encrypt():"""通過GET參數獲取要加密的數據"""data = request.args.get('data', 'lvy')  # 如果沒有提供data參數,使用默認值# 對數據進行哈希加密encrypted = hashlib.sha256(data.encode()).hexdigest()return jsonify({"res": encrypted})@app.route('/get_encrypted_student_info', methods=['GET'])
def get_encrypted_student_info():"""獲取加密后的學號和姓名信息"""student_info = "lvy"# 確保有密鑰對if private_key is None:generate_keys()# 簽名消息signature = sign_message(student_info)return jsonify({'status': 'success','student_info': student_info,'signature': signature.hex(),'public_key': public_key.to_string().hex()})@app.route('/generate_keys', methods=['GET'])
def api_generate_keys():"""生成新的密鑰對"""private_key, public_key = generate_keys()return jsonify({'status': 'success','private_key': private_key.to_string().hex(),'public_key': public_key.to_string().hex()})@app.route('/sign', methods=['POST'])
def api_sign():"""對消息進行簽名"""data = request.get_json()if not data or 'message' not in data:return jsonify({'status': 'error', 'message': '請提供消息內容'}), 400message = data['message']signature = sign_message(message)return jsonify({'status': 'success','message': message,'signature': signature.hex(),'public_key': public_key.to_string().hex()})@app.route('/verify', methods=['POST'])
def api_verify():"""驗證簽名"""data = request.get_json()if not data or 'message' not in data or 'signature' not in data:return jsonify({'status': 'error', 'message': '請提供消息和簽名'}), 400message = data['message']signature_hex = data['signature']try:signature = bytes.fromhex(signature_hex)except:return jsonify({'status': 'error', 'message': '簽名格式錯誤'}), 400is_valid = verify_signature(message, signature)return jsonify({'status': 'success','message': message,'is_valid': is_valid})if __name__ == '__main__':# 初始化密鑰對generate_keys()app.run(debug=True, port=5000) 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77735.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77735.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77735.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯之前綴和

一維前綴 解題思路 看到“區間之和”問題,直接想到“前綴和” 前綴和的核心公式: sum[i]sum[i?1]a[i] 利用前綴和求區間和 [l,r] 的公式: 區間和sum[r]?sum[l?1] 解題步驟模板 輸入數組: 讀取數組長度 n 和查詢次數 m。 讀…

【學習筆記】計算機網絡(八)—— 音頻/視頻服務

第8章 互聯網上的音頻/視頻服務 文章目錄 第8章 互聯網上的音頻/視頻服務8.1概述8.2 流式存儲音頻/視頻8.2.1 具有元文件的萬維網服務器8.2.2 媒體服務器8.2.3 實時流式協議 RTSP 8.3 交互式音頻/視頻8.3.1 IP 電話概述8.3.2 IP電話所需要的幾種應用協議8.3.3 實時運輸協議 RTP…

【WRF運行】解決metgrid生成文件太大無內存!

目錄 方法:改變工作目錄運行 metgrid.exe參考由于我的運行內存過小,當研究區較大時,metgrid生成文件內存太大,導致每次運行都報錯,此時可更改工作目錄(空余文件夾)以運行 metgrid.exe(并非必須在wrf安裝目錄下運行!!!)。 metgrid.exe 本身不支持直接通過參數或 nam…

基于 Django 進行 Python 開發

基于 Django 進行 Python 開發涉及多個方面的知識點,以下為你詳細介紹: 1. Django 基礎 項目與應用創建 借助django-admin startproject project_name來創建新的 Django 項目。利用python manage.py startapp app_name創建新的應用。項目結構 理解項目各文件和目錄的作用,像…

【sylar-webserver】8 HOOK模塊

文章目錄 知識點HOOK實現方式非侵入式hook侵入式hook ??? 覆蓋系統調用接口獲取被全局符號介入機制覆蓋的系統調用接口 具體實現C 模板成員函數繼承 和 成員函數指針類型匹配 ?????FdCtx 和 FdManager ??判斷socket的小技巧FdCtxFdManager connect hook ?do_io模板 …

SpringAI+DeepSeek大模型應用開發——1 AI概述

AI領域常用詞匯 LLM(LargeLanguage Model,大語言模型) 能理解和生成自然語言的巨型AI模型,通過海量文本訓練。例子:GPT-4、Claude、DeepSeek、文心一言、通義干問。 G(Generative)生成式: 根據上…

SpringBoot 基本原理

SpringBoot 為我們做的自動配置,確實方便快捷,但一直搞不明白它的內部啟動原理,這次就來一步步解開 SpringBoot 的神秘面紗,讓它不再神秘。 目錄 SpringBootApplication 背后的秘密 Configuration ComponentScan EnableAutoC…

2025.4.17總結

工作:今天對需求的測試設計進行了完善,然后,對測試設計進行了評審,最后提了個問題單。 反思這個過程,要說不足的地方,就是評審的時候總覺得自己吐字不清晰,表達能力早就想提升了,但…

2021-11-14 C++三七二十一數

緣由c編程怎么寫&#xff0c;緊急求解-編程語言-CSDN問答 void 三七二十一數() {//緣由https://ask.csdn.net/questions/7566632?spm1005.2025.3001.5141int n 0, a 0, b 0, p 1;std::cin >> n;while (n--){std::cin >> a >> b;while (a<b){if (a %…

大模型面經 | DeepSpeed中ZeRO-1、ZeRO-2和ZeRO-3的區別是什么?

大家好,我是皮先生!! 今天給大家分享一些關于大模型面試常見的面試題,希望對大家的面試有所幫助。 往期回顧: 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題一) 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題二) 大模型面經 | 春招、秋招算法…

spring boot 文件上傳

1.編寫文件上傳的表單頁面 <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><meta http-equiv"Content-Type" content"text/html; charsetUTF-8&qu…

機器學習核心算法全解析:從基礎到進階的 18 大算法模型

在機器學習領域&#xff0c;算法模型是解決實際問題的核心工具。 不同的算法適用于不同的數據場景和任務需求&#xff0c;理解它們的原理與應用是掌握機器學習的關鍵。 以下將詳細解析 18 個核心算法模型&#xff0c;涵蓋監督學習、無監督學習、集成學習和深度學習等多個領域…

5G網絡切片:精準分配資源,提升網絡效率的關鍵技術

5G網絡切片&#xff1a;精準分配資源&#xff0c;提升網絡效率的關鍵技術 隨著5G技術的廣泛應用&#xff0c;網絡切片&#xff08;Network Slicing&#xff09;作為其核心創新之一&#xff0c;正在改變傳統網絡架構。它通過將物理網絡劃分為多個邏輯網絡&#xff08;切片&…

Spring Boot中Excel處理完全指南

文章目錄 1. Excel處理基礎知識1.1 為什么需要在應用中處理Excel文件&#xff1f;1.2 Java中的Excel處理庫介紹1.2.1 Apache POI1.2.2 EasyExcel1.2.3 JExcel1.2.4 Apache POI SXSSF 1.3 Spring Boot中集成Excel處理 2. 在Spring Boot中集成Excel處理庫2.1 集成Apache POI2.1.1…

Elasticsearch 8.18 中提供了原生連接 (Native Joins)

作者&#xff1a;來自 Elastic Costin Leau 探索 LOOKUP JOIN&#xff0c;這是一條在 Elasticsearch 8.18 的技術預覽中提供的新 ES|QL 命令。 很高興宣布 LOOKUP JOIN —— 這是一條在 Elasticsearch 8.18 的技術預覽中提供的新 ES|QL 命令&#xff0c;旨在執行左 joins 以進行…

2025年滲透測試面試題總結-拷打題庫03(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 2025年滲透測試面試題總結-拷打題庫03 一、Windows與Linux系統提權思路 Windows提權 Linux提權 二、…

【華為】OSPF震蕩引起CPU占用率高怎么解決?

原創&#xff1a;廈門微思網絡 現象描述 如圖所示&#xff0c;Switch_1、Switch_2、Switch_3和Switch_4配置了OSPF協議&#xff0c;發現Switch_1設備的CPU占用率高&#xff0c;ROUT任務占用率明顯高于其他任務并且產生路由震蕩。 故障組網圖 原因分析 網絡中IP地址沖突導致…

Everything 安裝教程與使用教程(附安裝包)

文章目錄 前言一、Everything 介紹二、Everything 安裝教程1.Everything 安裝包下載2.選擇安裝文件3.選擇安裝語言4.接受許可協議5.選擇安裝位置6.配置安裝選項7.完成安裝 三、Everything 使用教程1.啟動軟件2.簡單關鍵詞搜索3.按類型搜索 前言 在日常使用電腦時&#xff0c;隨…

極狐GitLab CI/CD 流水線計算分鐘數如何管理?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 計算分鐘管理 (PREMIUM SELF) 在極狐GitLab 16.1 中&#xff0c;從 CI/CD 分鐘數重命名為計算配額或計算分鐘數。 管理員可…

Containerd 1.7.2 離線安裝與配置全指南(生產級優化)

Containerd 1.7.2 離線安裝與配置全指南&#xff08;生產級優化&#xff09; 摘要&#xff1a;本文詳細講解在無外網環境下部署 Containerd 1.7.2 容器運行時的完整流程&#xff0c;涵蓋二進制包安裝、私有鏡像倉庫配置、Systemd服務集成等關鍵步驟&#xff0c;并提供生產環境…