[Day 11] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈中的加密技術

介紹

區塊鏈技術被認為是現代信息技術的重大突破之一,其應用範圍從加密貨幣到供應鏈管理、醫療健康等各個領域。加密技術在區塊鏈中扮演著至關重要的角色,確保了數據的安全性、完整性和不可篡改性。本文將深入探討區塊鏈中的加密技術,包括其基本概念、核心算法、實際應用和示例代碼。

1. 加密技術的基本概念

加密技術旨在保護信息的機密性,通過將原始數據轉換為密文,只有擁有相應密鑰的用戶才能解密並訪問數據。加密技術主要分為對稱加密和非對稱加密兩類。

  1. 對稱加密 在對稱加密中,使用相同的密鑰進行加密和解密。常見的對稱加密算法包括AES、DES和3DES等。

from Crypto.Cipher import AES
import base64# 定義填充函數,使明文的長度為16的倍數
def pad(text):while len(text) % 16 != 0:text += ' 'return textkey = 'This is a key123'  # AES密鑰(16字節)
message = 'Hello, World!'  # 明文# 初始化AES加密器,使用ECB模式
cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB)
padded_message = pad(message)  # 對明文進行填充encrypted = cipher.encrypt(padded_message.encode('utf-8'))  # 加密
encrypted_base64 = base64.b64encode(encrypted).decode('utf-8')  # 編碼為Base64格式
print(f'Encrypted message: {encrypted_base64}')decrypted = cipher.decrypt(base64.b64decode(encrypted_base64)).decode('utf-8').strip()  # 解密並去除填充
print(f'Decrypted message: {decrypted}')
  • 這段代碼演示了如何使用AES對稱加密算法進行加密和解密。首先,定義了一個填充函數來確保明文的長度是16的倍數。接下來,使用密鑰和ECB模式初始化AES加密器,然後對明文進行填充並加密,最終得到加密後的密文。解密過程則是對加密結果進行解密並去除填充。

非對稱加密 在非對稱加密中,使用公鑰進行加密,私鑰進行解密。這種方法提高了安全性,因為即使加密過程中的公鑰被暴露,沒有私鑰仍無法解密。常見的非對稱加密算法包括RSA、ECC等。以下是一個簡單的RSA加密和解密示例:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64# 生成RSA密鑰對
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()message = 'Hello, World!'.encode('utf-8')# 使用公鑰加密
rsa_public_key = RSA.import_key(public_key)
cipher = PKCS1_OAEP.new(rsa_public_key)
encrypted = cipher.encrypt(message)
encrypted_base64 = base64.b64encode(encrypted).decode('utf-8')
print(f'Encrypted message: {encrypted_base64}')# 使用私鑰解密
rsa_private_key = RSA.import_key(private_key)
cipher = PKCS1_OAEP.new(rsa_private_key)
decrypted = cipher.decrypt(base64.b64decode(encrypted_base64)).decode('utf-8')
print(f'Decrypted message: {decrypted}')

這段代碼演示了如何使用RSA非對稱加密算法進行加密和解密。首先,生成RSA密鑰對,並導出公鑰和私鑰。然後,使用公鑰初始化加密器,對明文進行加密並編碼為Base64格式。最後,使用私鑰初始化解密器,對加密結果進行解密,恢復原始明文。

2. 區塊鏈中的加密技術應用
  1. 數字簽名 數字簽名使用非對稱加密技術來驗證交易的真實性和完整性。在區塊鏈中,每個交易都需要用戶的私鑰進行簽名,驗證時使用對應的公鑰。以下是一個簡單的數字簽名示例

from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256message = 'This is a signed message'
rsa_private_key = RSA.import_key(private_key)
rsa_public_key = RSA.import_key(public_key)# 哈希消息
h = SHA256.new(message.encode('utf-8'))# 使用私鑰簽名哈希
signature = pkcs1_15.new(rsa_private_key).sign(h)
print(f'Signature: {base64.b64encode(signature).decode("utf-8")}')# 使用公鑰驗證簽名
try:pkcs1_15.new(rsa_public_key).verify(h, signature)print('The signature is valid.')
except (ValueError, TypeError):print('The signature is invalid.')

這段代碼演示了如何使用RSA進行數字簽名和驗證。首先,使用SHA-256對消息進行哈希,生成哈希值。然後,使用私鑰對哈希值進行簽名,生成數字簽名。最後,使用公鑰驗證簽名的真實性。如果簽名有效,則表示消息未被篡改。

哈希函數 哈希函數將任意長度的數據轉換為固定長度的哈希值。在區塊鏈中,哈希函數用於生成區塊哈希值、交易哈希值等。常見的哈希算法包括SHA-256、SHA-3等。以下是一個簡單的SHA-256哈希示例:

from Crypto.Hash import SHA256message = 'Hello, World!'
h = SHA256.new(message.encode('utf-8'))
print(f'SHA-256 hash: {h.hexdigest()}')

這段代碼演示了如何使用SHA-256哈希函數對消息進行哈希。首先,將消息編碼為字節數組,然後使用SHA-256算法生成哈希值。最終輸出的是固定長度的哈希值,確保了數據的完整性。

默克爾樹 默克爾樹是基於哈希函數構建的一種數據結構,用於快速且安全地驗證數據。區塊鏈中,每個區塊的交易都會構建一棵默克爾樹,根哈希值存儲在區塊頭中。以下是一個簡單的默克爾樹構建示例:

import hashlibclass MerkleTree:def __init__(self, transactions):self.transactions = transactionsself.tree = []self.build_tree()def hash_leaf(self, data):return hashlib.sha256(data.encode('utf-8')).hexdigest()def build_tree(self):leaves = [self.hash_leaf(tx) for tx in self.transactions]self.tree.append(leaves)while len(leaves) > 1:if len(leaves) % 2 != 0:leaves.append(leaves[-1])new_level = []for i in range(0, len(leaves), 2):combined_hash = hashlib.sha256((leaves[i] + leaves[i+1]).encode('utf-8')).hexdigest()new_level.append(combined_hash)self.tree.append(new_level)leaves = new_leveldef get_root(self):if len(self.tree) == 0:return Nonereturn self.tree[-1][0]transactions = ['tx1', 'tx2', 'tx3', 'tx4']
merkle_tree = MerkleTree(transactions)
print(f'Merkle root: {merkle_tree.get_root()}')

這段代碼演示了如何構建一棵默克爾樹。首先,對每個交易進行哈希計算,生成葉子節點。然後,迭代合併相鄰的葉子節點並進行哈希計算,生成新的一層節點。最終,頂層節點即為默克爾根。

3. 區塊鏈的核心加密算法
  1. SHA-256 SHA-256是比特幣區塊鏈中使用的主要哈希算法,用於生成交易哈希、區塊哈希等。SHA-256的輸出長度為256位。以下是一個簡單的SHA-256哈希示例:

    from Crypto.Hash import SHA256data = 'Hello, Blockchain!'
    hash_obj = SHA256.new(data.encode('utf-8'))
    print(f'SHA-256 hash: {hash_obj.hexdigest()}')
    

    這段代碼展示了如何使用SHA-256對數據進行哈希。首先,將數據編碼為字節數組,然後使用SHA-256算法生成哈希值,最終輸出固定長度的哈希值。

  2. ECDSA 橢圓曲線數字簽名算法(ECDSA)是一種基於橢圓曲線的非對稱加密算法,常用於數字簽名和密鑰交換。比特幣使用的私鑰和公鑰即是通過ECDSA生成的。以下是一個簡單的ECDSA簽名和驗證示例:

    from ecdsa import SigningKey, NIST384pmessage = 'This is a signed message using ECDSA'
    sk = SigningKey.generate(curve=NIST384p)
    vk = sk.verifying_keysignature = sk.sign(message.encode('utf-8'))
    print(f'Signature: {base64.b64encode(signature).decode("utf-8")}')assert vk.verify(signature, message.encode('utf-8'))
    print('The ECDSA signature is valid.')
    

    這段代碼展示了如何使用ECDSA進行簽名和驗證。首先,生成一對橢圓曲線密鑰,然後使用私鑰對消息進行簽名,生成數字簽名。最後,使用公鑰驗證簽名,確保消息未被篡改。

  3. AES AES(高級加密標準)是一種對稱加密算法,主要用於保護數據的機密性。雖然在區塊鏈中較少直接使用,但在某些應用中仍有其地位。以下是一個簡單的AES加密和解密示例:

    from Crypto.Cipher import AES
    import base64def pad(text):while len(text) % 16 != 0:text += ' 'return textkey = 'This is a key123'
    message = 'Hello, Blockchain!'cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB)
    padded_message = pad(message)encrypted = cipher.encrypt(padded_message.encode('utf-8'))
    encrypted_base64 = base64.b64encode(encrypted).decode('utf-8')
    print(f'Encrypted message: {encrypted_base64}')decrypted = cipher.decrypt(base64.b64decode(encrypted_base64)).decode('utf-8').strip()
    print(f'Decrypted message: {decrypted}')
    

    這段代碼展示了如何使用AES對稱加密算法進行加密和解密。首先,定義了一個填充函數來確保明文的長度是16的倍數。接下來,使用密鑰和ECB模式初始化AES加密器,然後對明文進行填充並加密,最終得到加密後的密文。解密過程則是對加密結果進行解密並去除填充。

  4. 實際應用案例
    1. 比特幣 比特幣區塊鏈使用SHA-256進行挖礦和生成區塊哈希值,使用ECDSA生成和驗證交易簽名,確保交易的真實性和不可篡改性。以下是一個簡單的工作量證明(Proof of Work)示例:

      from hashlib import sha256def proof_of_work(last_proof):incrementor = last_proof + 1while not (incrementor % 9 == 0 and incrementor % last_proof == 0):incrementor += 1return incrementorlast_proof = 100
      proof = proof_of_work(last_proof)
      print(f'Proof of work: {proof}')
      

      這段代碼展示了簡單的工作量證明機制。首先,定義了一個工作量證明函數,該函數不斷遞增計數器,直到找到一個數,使其滿足一定條件。這模擬了比特幣挖礦過程中解決工作量證明問題的過程。

    2. 以太坊 以太坊使用Keccak-256(SHA-3)進行哈希運算,並使用ECDSA進行交易簽名和驗證。同時,以太坊的智能合約開發中也經常涉及到各種加密技術。以下是一個簡單的Keccak-256哈希示例:

      from Crypto.Hash import keccakdata = 'Hello, Ethereum!'
      hash_obj = keccak.new(digest_bits=256)
      hash_obj.update(data.encode('utf-8'))
      print(f'Keccak-256 hash: {hash_obj.hexdigest()}')
      

      這段代碼展示了如何使用Keccak-256對數據進行哈希。首先,將數據編碼為字節數組,然後使用Keccak-256算法生成哈希值,最終輸出固定長度的哈希值。

5. 未來發展趨勢

隨著區塊鏈技術的不斷發展,新的加密技術和算法將不斷湧現,以應對日益增長的安全需求。例如,量子計算的發展將可能威脅現有的加密算法,這促使研究人員尋求抗量子計算的加密方法。

  1. 抗量子計算的加密技術 量子計算威脅到現有的非對稱加密技術,如RSA和ECDSA。因此,研究抗量子計算的加密算法,如基於格理論的加密技術,成為重要的研究方向。

  2. 混合加密技術 混合加密技術結合了對稱加密和非對稱加密的優點,提高了安全性和效率。在區塊鏈應用中,混合加密技術可能會得到更多的應用。

總結

加密技術在區塊鏈中的應用至關重要,確保了數據的安全性、完整性和不可篡改性。本文深入探討了區塊鏈中的加密技術,包括對稱加密、非對稱加密、哈希函數和默克爾樹等。同時,介紹了比特幣和以太坊中的實際應用案例,並展望了未來的發展趨勢。隨著區塊鏈技術的不斷演進,加密技術將繼續發揮其關鍵作用,保障數據的安全和可靠。

-----------------------------------------------------------------------點個讚收藏吧, 讓我回回血-----------------------------------------------------------------------
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/28304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重装系统,以及设置 深度 学习环境

因为联想y7000在ubantu系统上连不到wifi,所以打算弄双系统 第一步:下载win10镜像,之后在系统用gparted新建个分区,格式化成ntfs,用来装win10系统 第二步,制作win10启动盘,这个需要先把u盘用disks格式化&a…

跨语言翻译的突破:使用强化学习与人类反馈提升机器翻译质量

在人工智能领域,知识问答系统的性能优化一直是研究者们关注的焦点。现有的系统通常面临知识更新频繁、检索成本高、以及用户提问多样性等挑战。尽管采用了如RAG(Retrieval-Augmented Generation)和微调等技术,但它们各有利弊&…

C++ 45 之 赋值运算符的重载

#include <iostream> #include <string> #include <cstring> using namespace std;class Students05{ public:int m_age;char* m_name;Students05(){}Students05(const char* name,int age){// 申请堆空间保存m_name;this->m_name new char[strlen(name)…

案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序

案例 Cacheable 是 Spring Framework 提供的一个注解&#xff0c;用于在方法执行前先检查缓存&#xff0c;如果缓存中已存在对应的值&#xff0c;则直接返回缓存中的值&#xff0c;而不执行该方法体。如果缓存中不存在对应的值&#xff0c;则执行方法体&#xff0c;并将方法的…

免费下载全球逐日气象站点数据

环境气象数据服务平台近期升级了NOAA GSOD 全球逐日气象站点数据&#xff08;NOAA Global Surface Summary of the Day &#xff09;的检索方式&#xff0c;升级后&#xff0c;用户无需注册&#xff0c;即可以在平台上下载全球逐日气象站点数据。 检索方式&#xff1a; 1. 访…

Redis数据结构之字符串(sds)

Redis数据结构之字符串(sds) redisObject 定义如下 struct redisObject {unsigned type:4; //数据类型unsigned encoding:4; /*encoding 编码格式&#xff0c;及存储数据使用的数据结构&#xff0c;同一类型的数据&#xff0c;Redis 会根据数据量&#xff0c;占用内…

Python学习打卡:day07

day7 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day753、列表的常用操作课后练习题54、列表的循环遍历列表的遍历—— while 循环列表的遍历—— for 循环while 循环和 for 循环的对比练习 55、元组…

PCL 点云区域生长分割

点云区域生长分割 一、代码示例二、运行结果🙋 前言 区域生长分割(RegionGrowing):是一种改进的ICP(Iterative Closest Point)算法,用于处理3D点云配准问题,特别是在存在噪声、外点(不匹配点)或数据分布不均等复杂情况下。 基本思想:首先依据点的曲率值对点进行排序…

一个简单的玩具机器人代码

编写一个玩具机器人脚本通常取决于机器人的硬件、接口和具体功能。然而&#xff0c;由于我们不能直接控制一个真实的硬件机器人&#xff0c;所以只是写一个模拟的C语言脚本示例&#xff0c;该脚本描述了一个简单的玩具机器人可能执行的一些基本操作。 假设我们的“玩具机器人”…

3 高频小信号放大器

分类与质量指标 分类 质量指标 增益 电压与功率的放大倍数。 通频带 放大效果比较好的频率范围。 选择性 放大目标信号以滤除其他信号的综合能力。 稳定性 噪声系数 晶体管高频等效电路 混合Π等效电路 共射三极管的等效电路。 Y参数等效电路 混合Π与Y参数等效电路的转换 单…

蚂蚁集团:2023年科研投入211.9亿元

6月13日&#xff0c;蚂蚁集团发布2023年可持续发展报告。报告显示&#xff0c;2023年蚂蚁集团科研投入达到211.9亿元&#xff0c;再创历史新高&#xff0c;蚂蚁科技投入的重点是人工智能和数据要素技术。 蚂蚁集团董事长兼CEO井贤栋在报告致辞中说&#xff0c;面向未来&#x…

【LeetCode 动态规划】买卖股票的最佳时机问题合集

文章目录 1. 买卖股票的最佳时机含冷冻期 1. 买卖股票的最佳时机含冷冻期 题目链接&#x1f517; &#x1f34e;题目思路&#xff1a; &#x1f34e;题目代码&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();ve…

NVIDIA Triton系列01-应用概论

NVIDIA Triton系列01-应用概论 推理识别是人工智能最重要的落地应用&#xff0c;其他与深度学习相关的数据收集、标注、模型训练等工作&#xff0c;都是为了得到更好的最终推理性能与效果。 几乎每一种深度学习框架都能执行个别的推理工作&#xff0c;包括 Tensorflow、Pytorc…

STL——set、map、multiset、multimap的介绍及使用

文章目录 关联式容器键值对树形结构与哈希结构setset的介绍set的使用set的模板参数列表set的构造set的使用set的迭代器使用演示 multisetmultiset演示 mapmap的定义方式map的插入map的查找map的[ ]运算符重载map的迭代器遍历multimapmultimap的介绍multimap的使用 在OJ中的使用…

tsp可视化python

随机生成点的坐标并依据点集生成距离矩阵&#xff0c;通过点的坐标实现可视化 c代码看我的这篇文章tsp动态规划递归解法c from typing import List, Tuple import matplotlib.pyplot as plt from random import randintN: int 4 MAX: int 0x7f7f7f7fdistances: List[List[in…

Codeforces Round 953 (Div. 2) A - C 题解

因为有事只做了A-C&#xff0c;都比较简单&#xff0c;全是很简单的思维&#xff0c;明天有空还会添加上D&#xff0c;如果有人需要可以明天常来看看&#xff01; 进入正题&#xff1a; A. Alice and Books 题意&#xff1a;给你n个数字&#xff0c;将这些数字分到两堆里&am…

杂谈-Android和Ios的对比

在当前的智能手机市场中&#xff0c;Android和iOS两大操作系统占据了主导地位。它们各自拥有独特的优势和劣势&#xff0c;为用户提供了不同的使用体验和选择。以下是对Android和iOS系统优缺点的详细对比&#xff0c;旨在帮助用户更全面地了解两大系统。 一、Android系统 优点…

Hadoop生态圈中的各个组件的介绍

hdfs namenode 维护目录树&#xff0c;维护命名空间。负责确定指定的文件块到具体的Datanode结点的映射关系。&#xff08;在客户端与Datanode之间共享数据&#xff09;管理Datanode结点的状态报告 datanode 负责管理它所在结点上存储的数据的读写&#xff0c;及存储数据。…

【Android面试八股文】你来说一说Java对象是如何晋升为老年代的?

文章目录 一、对象年龄达到阈值1.1 演示过程1.2 结论二、大对象直接进入老年代三、分配担保机制空间分配担保为什么要进行空间担保 ?`Minor Gc`后的对象太多无法放入`Survivor`区怎么办?如果`Minor gc`后新生代的对象都存活下来,然后需要全部转移到`老年代`,但是老年代空间…

@AliasFor 使用

AliasFor 使用 AliasFor 它允许开发者为一个注解的属性指定别名。通过使用AliasFor&#xff0c;我们可以提供多个名称来引用同一属性&#xff0c;从而增加了代码的灵活性和可读性 定义一个注解 package com.example.demo.aspect;import org.springframework.core.annotation…