-
本工具原则上仅可用于 CTF 比赛解题或测试链开发,请勿在具有经济价值的公链中使用。
-
在使用
Blockchain
模块时,你始终应该使用全新生成的账户,而不是导入常用的具有实际价值的账户,以确保你的账户安全。 -
Blockchain
模块的所有功能在Goerli, Sepolia, Mumbai
测试网络中均正常通过检验。 -
如果你在使用过程中遇到了其他问题,或者有任何好的想法和建议,欢迎提issue进行反馈。
pip install -U poseidon-python
本模块可用于与任何以太坊同构链(即通常所说的 EVM 链)进行交互,支持常用的链上交互操作。
主要基于Web3.py实现。
基本的使用方法可以参考我之前参加比赛时写的 WriteUps:
- ACTF 2023 Blockchain Writeup
- VNCTF 2023 Blockchain Writeup
- 第五届“强网”拟态防御国际精英挑战赛线上预选赛 区块链方向题解
- 2023 RealWorldCTF 体验赛 Blockchain Writeup
或者查看example中的示例。
from Poseidon.Blockchain import *
Chain 是区块链实例,后续的所有链上交互的操作都将经由该指定节点处理。
Chain(RPCUrl: str, RequestParams: Optional[dict] = None)
:
初始化。根据给定的节点 RPC 地址以 HTTP/HTTPS 方式进行连接,可通过代理访问。当连接节点失败时会抛出异常。
参数:
RPCUrl (str): 节点 RPC 地址
RequestParams (可选)(Optional[dict]): 连接时使用的 request 参数,默认为 None。
例如当需要使用代理进行访问时,则传入 RequestParams={"proxies": {"http": "http://localhost:<ProxyPort>","https": "http://localhost:<ProxyPort>"}}
成员变量:
ChainId (int): 链 ID
Node (Web3.HTTPProvider): web3.py 原生的 HTTP 交互器实例
Eth (Web3.HTTPProvider.eth): HTTP 交互器实例中的 eth 模块
Chain.GetBasicInformation(ShowTimeslot: bool = True) -> ChainBasicInformationData
:
获取区块链基本信息。包括 ChainId 、BlockNumber 、GasPrice 、(Timeslot)、ClientVersion 。
参数:
ShowTimeslot (bool): 是否获取并显示 Timeslot 。该操作比较耗时,在主动调用时默认为 True , 在 Chain 实例初始化时默认为 False 。
返回值:
BasicInformation (Poseidon.ChainBasicInformationData): 区块链基本信息。
{"ChainId"|"BlockNumber"|"GasPrice"|("Timeslot")|"ClientVersion"}
Chain.GetTransactionInformationByHash(TransactionHash: str) -> TransactionReceiptData
:
根据交易哈希查询该交易的详细回执信息。包括交易哈希、所在区块号、交易索引号、交易状态、交易类型、交易行为、发送者、接收者、(部署的合约地址)、(GasPrice 或 (MaxFeePerGas 和 MaxPriorityFeePerGas))、GasLimit、GasUsed、Nonce、Value、R、S、V、Logs、InputData。
参数:
TransactionHash (str): 要查询的交易的哈希
返回值:
TransactionInformation (Poseidon.TransactionReceiptData): 交易信息。当出现异常时返回 None 。
{"TransactionHash"|"BlockNumber"|"TransactionIndex"|"Status"|"Type"|"Action"|"From"|"To"|("ContractAddress")|<"GasPrice"|("MaxFeePerGas"&"MaxPriorityFeePerGas")>|"GasLimit"|"GasUsed"|"Nonce"|"Value"|"R"|"S"|"V"|"Logs"|"InputData"}
Chain.GetTransactionInformationByBlockIdAndIndex(BlockID: Union[str, int], TransactionIndex: int) -> TransactionReceiptData
:
根据区块 ID 和交易在块中的索引来查询该交易的详细回执信息。包括交易哈希、所在区块号、交易索引号、交易状态、交易类型、交易行为、发送者、接收者、(部署的合约地址)、(GasPrice 或 (MaxFeePerGas 和 MaxPriorityFeePerGas))、GasLimit、GasUsed、Nonce、Value、R、S、V、Logs、InputData。
参数:
BlockID (Union[str,int]): 区块 ID 。可为区块号数值或 'latest', 'earliest', 'pending' 。
TransactionIndex (int): 交易在块中的索引
返回值:
TransactionInformation (Poseidon.TransactionReceiptData): 交易信息。当出现异常时返回 None 。
{"TransactionHash"|"BlockNumber"|"TransactionIndex"|"Status"|"Type"|"Action"|"From"|"To"|("ContractAddress")|<"GasPrice"|("MaxFeePerGas"&"MaxPriorityFeePerGas")>|"GasLimit"|"GasUsed"|"Nonce"|"Value"|"R"|"S"|"V"|"Logs"|"InputData"}
Chain.GetBlockInformation(BlockID: Union[str, int]) -> BlockInformationData
:
根据区块 ID 获取该区块的详细信息。包括区块号、区块哈希、矿工、时间戳、GasLimit、GasUsed、块内交易的哈希集合。
参数:
BlockID (Union[str,int]): 区块 ID 。可为区块号数值或 'latest', 'earliest', 'pending' 。
返回值:
BlockInformation (Poseidon.BlockInformationData): 区块信息。当出现异常时返回 None 。
{"BlockNumber"|"BlockHash"|"Miner"|"TimeStamp"|"GasLimit"|"GasUsed"|"Transactions"}
Chain.GetBalance(Address: str) -> int
:
根据账户地址获取其网络原生代币余额。
参数:
Address (str): 账户地址
返回值:
Balance (int): 账户网络原生代币余额,单位为 wei 。当出现异常时返回 None 。
Chain.GetCode(Address: str) -> str
:
根据合约地址获取其已部署字节码。
参数:
Address (str): 合约地址
返回值:
Code (str): 合约已部署字节码。当出现异常时返回 None 。
Chain.GetStorage(Address: str, SlotIndex: int) -> str
:
根据合约地址和存储插槽索引获取存储值。
参数:
Address (str): 合约地址
SlotIndex (int): 存储插槽索引
返回值:
Data (str): 存储值。当出现异常时返回 None 。
Chain.DumpStorage(Address: str, Count: int) -> list
:
根据合约地址和指定插槽数量值,从插槽 0 开始批量遍历存储插槽并获取值。
参数:
Address (str): 合约地址
Count (int): 指定插槽数量值
返回值:
Data (List[str]): 存储值列表。当出现异常时返回 None 。
Chain.GetPublicKeyByTransactionHash(TransactionHash: str) -> tuple
:
通过一笔已在链上确认的交易哈希,获取账户公钥。
参数:
TransactionHash (str): 交易哈希
返回值:
(Address, PublicKey) (tuple): 由账户地址和账户公钥组成的元组。当出现异常时返回 None 。
Account 是账户实例,后续的交易将经由该指定账户发送至链上。
Account(Chain: Chain, PrivateKey: str)
:
初始化。通过私钥导入账户并与 Chain 实例绑定,后续的交易将经由该指定账户发送至链上。当导入账户失败时将会抛出异常。
参数:
Chain (Poseidon.Blockchain.Chain): 区块链实例
PrivateKey (str): 账户私钥。
成员变量:
EthAccount (eth_account.Account): eth_account 的原生 Account 对象实例
Account.RequestAuthorizationBeforeSendTransaction(Open: bool = True)
:
设置在通过该账户发送每一笔交易之前是否请求授权。开启后会在每笔交易即将发送前暂停流程,在终端询问是否发送该笔交易。
参数:
Open (bool): 请求授权开关。主动调用时默认值为 True ,但在 Account 实例初始化时默认设置为 False 。
Account.GetSelfBalance() -> int
:
获取自身账户的网络原生代币余额。
返回值:
Balance (int): 自身账户网络原生代币余额,单位为 wei 。当出现异常时返回 None 。
Account.Transfer(To: str, Value: int, Data: str = "0x", GasPrice: Optional[int] = None, GasLimit: int = 100000) -> TransactionReceiptData
:
向指定账户转账指定数量的网络原生代币,可附带信息。若 120 秒内交易未确认则作超时处理。
参数:
To (str): 接收方地址
Value (int): 发送的网络原生代币数量,单位为 wei 。
Data (可选)(str): 交易数据。含 0x 前缀的十六进制形式。默认值为 "0x" 。
GasPrice (可选)(Optional[int]): Gas 价格,单位为 wei ,默认使用 RPC 建议的 gas_price 。
GasLimit (可选)(int): Gas 最大使用量,单位为 wei ,默认为 100000 wei 。
返回值:
TransactionInformation (Poseidon.TransactionReceiptData): 交易信息,通过 Chain.GetTransactionInformationByHash 获取。当出现异常时返回 None 。
Account.SendTransaction(To: str, Data: str, Value: int = 0, GasPrice: Optional[int] = None, GasLimit: int = 1000000) -> TransactionReceiptData
:
以传统方式发送一笔自定义交易。若 120 秒内交易未确认则作超时处理。
参数:
To (str): 接收方地址
Data (str): 交易数据。含 0x 前缀的十六进制形式。
Value (可选)(int): 随交易发送的网络原生代币数量,单位为 wei ,默认为 0 wei 。
GasPrice (可选)(Optional[int]): Gas 价格,单位为 wei ,默认使用 RPC 建议的 gas_price 。
GasLimit (可选)(int): Gas 最大使用量,单位为 wei ,默认为 1000000 wei 。
返回值:
TransactionInformation (Poseidon.TransactionReceiptData): 交易信息,通过 Chain.GetTransactionInformationByHash 获取。当出现异常时返回 None 。
Account.SendTransactionByEIP1559(To: str, Data: str, Value: int = 0, BaseFee: Optional[int] = None, MaxPriorityFee: Optional[int] = None, GasLimit: int = 1000000) -> TransactionReceiptData
:
以 EIP-1559 方式发送一笔自定义交易。若 120 秒内交易未确认则作超时处理。
参数:
To (str): 接收方地址
Data (str): 交易数据。含 0x 前缀的十六进制形式。
Value (可选)(int): 随交易发送的网络原生代币数量,单位为 wei ,默认为 0 wei 。
BaseFee (可选)(Optional[int]): BaseFee 价格,单位为 wei ,默认使用 RPC 建议的 gas_price 。
MaxPriorityFee (可选)(Optional[int]): MaxPriorityFee 价格,单位为 wei ,默认使用 RPC 建议的 max_priority_fee 。
GasLimit (可选)(int): Gas 最大使用量,单位为 wei ,默认为 1000000 wei 。
返回值:
TransactionInformation (Poseidon.TransactionReceiptData): 交易信息,通过 Chain.GetTransactionInformationByHash 获取。当出现异常时返回 None 。
Account.DeployContract(ABI: dict, Bytecode: str, Value: int = 0, GasPrice: Optional[int] = None, *Arguments: Optional[Any]) -> TransactionReceiptData
:
部署合约。若 120 秒内交易未确认则作超时处理。
参数:
ABI (dict): 合约 ABI
Bytecode (str): 合约部署字节码。
Value (可选)(int): 随交易发送给合约的网络原生代币数量,单位为 wei ,默认为 0 wei 。
GasPrice (可选)(Optional[int]): Gas 价格,单位为 wei ,默认使用 RPC 建议的 gas_price 。
*Arguments (可选)(Optional[Any]): 传给合约构造函数的参数,默认为空。
返回值:
TransactionInformation (Poseidon.TransactionReceiptData): 交易信息,通过 Chain.GetTransactionInformationByHash 获取。当出现异常时返回 None 。
当合约部署成功时,返回值中会额外添加"Contract"字段,该变量是已实例化的 Contract 对象,若失败则为 None。
Account.DeployContractWithoutABI(Bytecode: str, Value: int = 0, GasPrice: Optional[int] = None, GasLimit: int = 3000000) -> TransactionReceiptData
:
在没有 ABI 的情况下,仅使用字节码来部署合约。若 120 秒内交易未确认则作超时处理。
参数:
Bytecode (str): 合约部署字节码。
Value (可选)(int): 随交易发送给合约的网络原生代币数量,单位为 wei ,默认为 0 wei 。
GasPrice (可选)(Optional[int]): Gas 价格,单位为 wei ,默认使用 RPC 建议的 gas_price 。
GasLimit (可选)(int): Gas 最大使用量,单位为 wei ,默认为 3000000 wei 。
返回值:
TransactionInformation (Poseidon.TransactionReceiptData): 交易信息,通过 Chain.GetTransactionInformationByHash 获取。当出现异常时返回 None 。
Account.SignMessage(Message: str) -> SignedMessageData
:
消息字符串进行签名。
参数:
Message (str): 待签名消息字符串
返回值:
SignatureData (Poseidon.SignedMessageData): 签名数据。当出现异常时返回 None 。
{"SignerAddress"|"Message"|"MessageHash"|"Signature"|"R"|"S"|"V"}
Account.SignMessageHash(MessageHash: str) -> SignedMessageData
:
对消息哈希进行签名。
参数:
MessageHash (str): 待签名消息哈希
返回值:
SignatureData (Poseidon.SignedMessageData): 签名数据。当出现异常时返回 None 。
{"SignerAddress"|"MessageHash"|"Signature"|"R"|"S"|"V"}
Contract 是合约实例,作为与指定合约进行交互的基础。
Contract(Account: Account, Address: str, ABI: dict)
:
初始化。通过合约地址与 ABI 来实例化合约,并与 Account 绑定,后续所有对该合约的调用都会由这一账户发起。当合约实例化失败时会抛出异常。
参数:
Account (Poseidon.Blockchain.Account): 账户实例
Address (str): 合约地址
ABI (str): 合约 ABI
成员变量:
Instance (Web3.eth.Contract): web3.py 原生 contract 对象实例
Address (str): 合约地址
Contract.CallFunction(FunctionName: str, *FunctionArguments: Optional[Any]) -> TransactionReceiptData
:
通过传入函数名及参数来调用该合约内的函数。
参数:
FunctionName (str): 函数名称
*FunctionArguments (可选)(Optional[Any]): 函数参数,默认为空。
返回值:
TransactionInformation (Poseidon.TransactionReceiptData): 交易信息,通过 Chain.GetTransactionInformationByHash 获取。当出现异常时返回 None 。
Contract.CallFunctionWithParameters(Value: int, GasPrice: Optional[int], GasLimit: int, FunctionName: str, *FunctionArguments: Optional[Any]) -> TransactionReceiptData
:
通过传入函数名及参数来调用该合约内的函数。支持自定义 Value 和 GasLimit 。
参数:
Value (int): 随交易发送的网络原生代币数量,单位为 wei 。
GasPrice (Optional[int]): Gas 价格,单位为 wei ,默认使用 RPC 建议的 gas_price 。
GasLimit (int): Gas 最大使用量,单位为 wei 。
FunctionName (str): 函数名称
*FunctionArguments (Optional[Any]): 函数参数,默认为空。
返回值:
TransactionInformation (Poseidon.TransactionReceiptData): 交易信息,通过 Chain.GetTransactionInformationByHash 获取。当出现异常时返回 None 。
Contract.ReadOnlyCallFunction(FunctionName: str, *FunctionArguments: Optional[Any]) -> Any
:
通过传入函数名及参数来调用该合约内的只读函数。
参数:
FunctionName (str): 函数名称
*FunctionArguments (可选)(Optional[Any]): 函数参数,默认为空。
返回值:
Result (Any): 调用函数后得到的返回值。当出现异常时返回 None 。
Contract.EncodeABI(FunctionName: str, *FunctionArguments: Optional[Any]) -> str
:
通过传入函数名及参数进行编码,相当于生成调用该函数的 CallData 。
参数:
FunctionName (str): 函数名称
*FunctionArguments (可选)(Optional[Any]): 函数参数,默认为空。
返回值:
CallData (str): 调用数据编码。含 0x 前缀的十六进制形式。当出现异常时返回 None 。
Contract.DecodeFunctionInputData(InputData: str) -> tuple
:
解码对当前合约执行调用的 InputData ,得出所调用的函数及其参数值。
参数:
InputData (str): 对当前合约执行调用的 InputData
返回值:
Result (tuple): 函数及其参数值
通用工具集,整合了常用的链下操作。静态类,无需实例化。
BlockchainUtils.SwitchSolidityVersion(SolidityVersion: str)
:
设置当前使用的 Solidity 版本,若该版本未安装则会自动安装。
参数:
SolidityVersion (str): Solidity 版本号
BlockchainUtils.Compile(FileCourse: str, ContractName: str, SolidityVersion: Optional[str] = None, Optimize: Optional[bool] = None, OptimizeRuns: Optional[int] = None, BasePaths: Optional[str] = None, AllowPaths: Optional[str] = None, EvmVersion: Optional[str] = None) -> tuple
:
根据给定的参数使用 py-solc-x 编译合约。当编译失败时会抛出异常。
参数:
FileCourse (str): 合约文件完整路径。当合约文件与脚本文件在同一目录下时可直接使用文件名。
ContractName (str): 要编译的合约名称
SolidityVersion (可选)(Optional[str]): 指定使用的 Solidity 版本。若不指定则会使用当前已激活的 Solidity 版本进行编译。默认为 None ,使用目前已激活的 solc 版本。
Optimize (可选)(bool): 是否开启优化器。默认为 None ,不开启优化器。
OptimizeRuns (可选)(int): 优化运行次数。默认为 None ,不开启优化器。
BasePaths (可选)(Optional[str]): 指定基础路径。在编译时可能会出现 BasePaths 相关错误可在这里解决。默认为 None 。
AllowPaths (可选)(Optional[str]): 指定许可路径。在编译时可能会出现 AllowPaths 相关错误可在这里解决。默认为 None 。
EvmVersion (可选)(Optional[str]): 指定编译时使用的 EVM 版本。默认为 None ,使用当前 solc 支持的最新的 EVM 版本。
返回值:
(ABI, Bytecode) (tuple): 由 ABI 和 Bytecode 组成的元组
BlockchainUtils.ImportABI(FileCourse: str) -> str
:
导入指定的 ABI 文件内容。
参数:
FileCourse (str): ABI 文件完整路径。当 ABI 文件与脚本文件在同一目录下时可直接使用文件名。
返回值:
Result (str): ABI 内容
BlockchainUtils.CreateNewAccount() -> tuple
:
创建新账户。
返回值:
(Address, PrivateKey) (tuple): 由账户地址和私钥组成的元组
BlockchainUtils.MnemonicToAddressAndPrivateKey(Mnemonic: str, PassPhrase: str = "", AccountPath: str = "m/44'/60'/0'/0/0") -> tuple
:
将助记词转换为账户地址与私钥。参考 BIP-32 标准。
参数:
Mnemonic (str): 助记词字符串。以空格进行分隔。
PassPhrase (str): 助记词密码。默认为 "" 。
AccountPath (str): 账户路径。默认为 EVM 地址路径 "m/44'/60'/0'/0/0" 。
返回值:
(Address, PrivateKey) (tuple): 由账户地址和私钥组成的元组。当出现异常时返回 None 。
BlockchainUtils.GweiToWei(Value: Union[int, float]) -> int
:
将一个正整数或浮点数按照 Gwei 为单位直接转化为 wei 为单位的正整数。即假设传入 Value = 1,将返回 1000000000 。
参数:
Value (Union[int,float]): 假设以 Gwei 为单位的待转换值。
返回值:
Result (int): 已转换为以 wei 为单位的值。当出现异常时返回 None 。
BlockchainUtils.WeiToGwei(Value: int) -> float
:
将一个正整数按照 wei 为单位直接转化为 Gwei 为单位的正整数。即假设传入 Value = 1000000000,将返回 1 。
参数:
Value (int): 假设以 wei 为单位的待转换值。
返回值:
Result (float): 已转换为以 Gwei 为单位的值。当出现异常时返回 None 。
BlockchainUtils.FromWei(Number: int, Unit: str) -> Union[int, decimal.Decimal]
:
Web3.from_wei 的简单封装。
参数:
Number (int): 待转换值。
Unit (str): 原单位名称。
返回值:
Result (Union[int, decimal.Decimal]): 转换后的值。
BlockchainUtils.ToWei(Number: Union[int, float, str, decimal.Decimal], Unit: str) -> int
:
Web3.to_wei 的简单封装。
参数:
Number (Union[int, float, str, decimal.Decimal]): 待转换值。
Unit (str): 原单位名称。
返回值:
Result (int): 转换后的值。
BlockchainUtils.AssemblyToBytecode(Assembly: str) -> str
:
将 EVM Assembly 转为 EVM Bytecode 。
参数:
Assembly (str): EVM Assembly
返回值:
Bytecode (str): EVM Bytecode 。含 0x 前缀的六进制形式。当出现异常时返回 None 。
BlockchainUtils.BytecodeToAssembly(Bytecode: str) -> str
:
将 EVM Bytecode 转为 EVM Assembly 。
参数:
Bytecode (str): EVM Bytecode 。含 0x 前缀的十六进制形式。
返回值:
Assembly (str): EVM Assembly 。当出现异常时返回 None 。
BlockchainUtils.SignatureToRSV(Signature: str) -> SignatureData
:
将签名解析成 R S V 。
参数:
Signature (str): 签名。含 0x 前缀的十六进制形式。
返回值:
Result (SignatureData): 解析结果。当出现异常时返回 None 。
{"Signature"|"R"|"S"|"V"}
BlockchainUtils.RSVToSignature(R: str, S: str, V: str) -> SignatureData
:
将 R S V 合并成签名。
参数:
R (str): 签名 r 值。含 0x 前缀的十六进制形式。
S (str): 签名 s 值。含 0x 前缀的十六进制形式。
V (int): 签名 v 值。含 0x 前缀的十六进制形式。
返回值:
Result (SignatureData): 合并结果。当出现异常时返回 None 。
{"Signature"|"R"|"S"|"V"}
BlockchainUtils.GetFunctionSelector(FunctionName: str, FunctionParameters: Optional[List[str]] = None) -> str
:
获取四字节函数选择器。
参数:
FunctionName (str): 函数名称。
FunctionParameters (可选)(Optional[List[str]]): 函数参数列表。默认为空。
返回值:
Result (str): 四字节函数选择器。含 0x 前缀的十六进制形式
BlockchainUtils.RecoverMessage(Message: str, Signature: str) -> str
:
通过消息原文和签名还原出签署者的账户地址。
参数:
Message (str): 消息原文
Signature (str): 签名
返回值:
Signer (str): 签署者的账户地址。当出现异常时返回 None 。
BlockchainUtils.RecoverMessageByHash(MessageHash: str, Signature: str) -> str
:
通过消息哈希和签名还原出签署者的账户地址。
参数:
MessageHash (str): 消息哈希
Signature (str): 签名
返回值:
Signer (str): 签署者的账户地址。当出现异常时返回 None 。
BlockchainUtils.RecoverRawTransaction(RawTransactionData: str) -> str
:
获取签署此交易的账户地址。
参数:
RawTransactionData (str): 原生交易数据。含 0x 前缀的十六进制形式。
返回值:
Address (str): 账户地址。当出现异常时返回 None 。
BlockchainUtils.CrackSelector(SourceFunctionName: str, SourceFunctionParameters: List[str], ToGenerateFunctionParameters: List[str]) -> str
:
根据源函数名、参数与想要碰撞生成的函数的参数,碰撞生成出一个函数名,以使得这两个函数的选择器签名相等。
参数:
SourceFunctionName (str): 目标函数名
SourceFunctionParameters (List[str]): 目标函数参数列表
ToGenerateFunctionParameters (List[str]): 想要碰撞生成的函数的参数列表
返回值:
ToGenerateFunction (str): 碰撞出的函数的名称与参数完整表示。当出现异常时返回 None 。
BlockchainUtils.GetContractAddressByCREATE(Deployer: str, Nonce: int) -> str
:
获取某账户以 CREATE 方式部署的合约的地址。
参数:
Deployer (str): 部署者地址
Nonce (int): 部署者发送合约部署交易的 nonce 值
返回值:
Address (str): 计算出的合约地址
BlockchainUtils.GetContractAddressByCREATE2(Deployer: str, Salt: str, CreationCode: str) -> str
:
获取某合约账户以 CREATE2 方式部署的另一个合约的地址。
参数:
Deployer (str): 部署者地址
Salt (str): 盐值
CreationCode (str): 合约的创建时字节码
返回值:
Address (str): 计算出的合约地址
本模块用于解决常见的密码学问题。
from Poseidon.Cryptography import ModernCryptoUtils, ClassicalCryptoUtils, MiscUtils
本模块用于解决现代密码学问题。
Base64_Encrypt(Text: str) -> str
:
用于对字符串进行 Base64 编码。
参数:
Text (str): 待编码的字符串
返回值:
EncryptedText (str): Base64 编码后的字符串
Base64_Decrypt(Text: str) -> str
:
用于对 Base64 编码的字符串进行解码。
参数:
Text (str): 待解码的 Base64 编码字符串
返回值:
DecryptedText (str): Base64 解码后的字符串
Base32_Encrypt(Text: str) -> str
:
用于对字符串进行 Base32 编码。
参数:
Text (str): 待编码的字符串
返回值:
EncryptedText (str): Base32 编码后的字符串
Base32_Decrypt(Text: str) -> str
:
用于对 Base32 编码的字符串进行解码。
参数:
Text (str): 待解码的 Base32 编码字符串
返回值:
DecryptedText (str): Base32 解码后的字符串
Base16_Encrypt(Text: str) -> str
:
用于对字符串进行 Base16 编码。
参数:
Text (str): 待编码的字符串
返回值:
EncryptedText (str): Base16 编码后的字符串
Base16_Decrypt(Text: str) -> str
:
用于对 Base16 编码的字符串进行解码。
参数:
Text (str): 待解码的 Base16 编码字符串
返回值:
DecryptedText (str): Base16 解码后的字符串
AES_Padding(Text: str, BlockSize: int = 16) -> bytes
:
用于对字符串进行 zeropadding 处理。
参数:
Text (str): 待 padding 的字符串
BlockSize (可选)(int): 块大小(单位为字节),默认为16字节
返回值:
Fill (bytes): padding 后的字节数据
AES_Encrypt(Text: str, Key: str, BlockSize: int = 16) -> str
:
用于对字符串进行 AES 加密(仅支持 ECB zeropadding 模式)。
参数:
Text (str): 待进行 AES 加密的字符串
Key (str): 加密密钥
BlockSize (可选)(int): 块大小(单位为字节),默认为16字节
返回值:
EncryptedText (str): AES 加密后的密文(Base64 编码形式)
AES_Decrypt(Text: str, Key: str, BlockSize: int = 16) -> str
:
用于对 AES 密文进行解密(仅支持 ECB zeropadding 模式)。
参数:
Text (str): 待解密的 AES 密文(Base64 编码形式)
Key (str): 解密密钥
BlockSize (可选)(int): 块大小(单位为字节),默认为16字节
返回值:
DecryptedText (str): AES 解密后得到的原文
RSA_Encrypt(Text: str, p: int, q: int, e: int) -> str
:
用于对字符串进行 RSA 加密。
参数:
Text (str): 待进行 RSA 加密的字符串
p (int): p 值
q (int): q 值
e (int): e 值
返回值:
EncryptedText (str): RSA 加密后的密文( Base64 编码形式)
RSA_Base64_Decrypt(Base64Text: str, p: int, q: int, e: int) -> str
:
用于对 Base64 编码形式的 RSA 密文进行解密。
参数:
Base64Text (str): 待进行解密的 Base64 编码形式的 RSA 密文
p (int): p 值
q (int): q 值
e (int): e 值
返回值:
DecryptedText (str): RSA 解密后得到的原文
RSA_Long_Decrypt(Long: int, p: int, q: int, e: int) -> str
:
用于对长整数形式的 RSA 密文进行解密。
参数:
Long (int): 待进行解密的长整数形式的 RSA 密文
p (int): p 值
q (int): q 值
e (int): e 值
返回值:
DecryptedText (str): RSA 解密后得到的原文
RSA_Wiener_Attack(c: int, e: int, n: int) -> str
:
用于对长整数形式的 RSA 密文进行维纳攻击并解出原文。
参数:
c (int): 待进行维纳攻击的长整数形式的 RSA 密文
e (int): e 值
n (int): n 值
返回值:
m (str): RSA 维纳攻击后得到的原文
RSA_MultiPrime_Attack(c: int, e: int, n: int, primes: List[int], powers: Optional[List[int]] = None) -> str
:
用于对长整数形式的 RSA 密文进行多素数攻击并解出原文。
参数:
c (int): 待进行多素数攻击的长整数形式的 RSA 密文
e (int): e 值
n (int): n 值
primes (List[int]): 用于攻击的多素数列表
powers (Optional[List[int]]): 各素数对应的阶数,默认均为 1 次方
返回值:
m (str): RSA 多素数攻击后得到的原文
RSA_LowEncryptionIndex_Attack(c: int, e: int, n: int) -> str
:
用于对长整数形式的 RSA 密文进行低加密指数攻击并解出原文(尝试 10 万次累加 n 超过后会抛出异常)。
参数:
c (int): 待进行低加密指数攻击的长整数形式的 RSA 密文
e (int): e 值
n (int): n 值
返回值:
m (str): RSA 低加密指数攻击后得到的原文
RSA_CommonMod_Attack(c1: int, c2: int, e1: int, e2: int, n: int) -> str
:
用于对长整数形式的 RSA 密文进行共模攻击并解出原文。
参数:
c1 (int): 待进行共模攻击的长整数形式的第一串 RSA 密文
c2 (int): 待进行共模攻击的长整数形式的第二串 RSA 密文
e1 (int): c1 的 e 值
e2 (int): c2 的 e 值
n (int): n 值
返回值:
m (str): RSA 共模攻击后得到的原文
RSA_Broadcast_Attack(cs: List[int], e: int, ns: List[int]) -> str
:
用于对长整数形式的 RSA 密文列表进行广播攻击并解出原文。
参数:
cs (List[int]): 待进行广播攻击的长整数形式的 RSA 密文列表
e (int): e 值
ns (List[int]): 各密文对应的 n 值的列表
返回值:
m (str): RSA 广播攻击后得到的原文
RC4_Encrypt(Text: str, Key: str) -> str
:
用于对字符串进行 RC4 加密。
参数:
Text (str): 待进行 RC4 加密的字符串
Key (str): 加密密钥
返回值:
EncryptedText (str): RC4 加密后得到的密文( Base64 编码形式)
RC4_Decrypt(Text: str, Key: str) -> str
:
用于对 Base64 编码形式的 RC4 密文进行解密。
参数:
Text (str): 待解密的 Base64 编码形式的 RC4 密文
Key (str): 解密密钥
返回值:
DecryptedText (str): RC4 解密后得到的原文
本模块用于解决古典密码学问题。
Caesar_Encrypt(Text: str, Move: int = 3) -> str
:
用于对字符串进行 Caesar 加密。
参数:
Text (str): 待进行 Caesar 加密的字符串
Move (int): 移位位数,默认为 3
返回值:
EncryptedText (str): Caesar 加密后得到的密文
Caesar_Decrypt(Text: str, Move: int = 3) -> str
:
用于对 Caesar 密文进行解密。
参数:
Text (str): 待进行解密的 Caesar 密文
Move (int): 移位位数,默认为 3
返回值:
DecryptedText (str): Caesar 解密后得到的原文
Caesar_Attack(Text: str) -> List[str]
:
用于对 Caesar 密文进行爆破攻击。
参数:
Text (str): 待进行爆破攻击的 Caesar 密文
返回值:
Result (List[str]): Caesar 爆破攻击后得到的字符串列表
Morse_Encrypt(Text: str) -> str
:
用于对字符串进行 Morse 加密。
参数:
Text (str): 待进行 Morse 加密的字符串
返回值:
EncryptedText (str): Morse 加密后得到的密文(未找到映射关系的字符将保持不变)
Morse_Decrypt(Text: str) -> str
:
用于对 Morse 密文进行解密。
参数:
Text (str): 待进行解密的 Morse 密文(以'/'进行分隔)
返回值:
DecryptedText (str): Morse 解密后得到的原文(未找到映射关系的字符将保持不变)
Bacon_Encrypt(Text: str) -> str
:
用于对字符串进行 Bacon 加密。
参数:
Text (str): 待进行 Bacon 加密的字符串
返回值:
EncryptedText (str): Bacon 加密后得到的密文(大写形式 未找到映射关系的字符将以[]包裹)
Bacon_Decrypt(Text: str) -> str
:
用于对 Bacon 密文进行解密。
参数:
Text (str): 待进行解密的 Bacon 密文
返回值:
DecryptedText (str): Bacon 解密后得到的原文(大写形式 未找到映射关系的字符将以[]包裹)
Fence_Encrypt(Text: str, Fence: int) -> str
:
用于对字符串进行 Fence 加密。
参数:
Text (str): 待进行 Fence 加密的字符串
Fence (int): 栏数
返回值:
EncryptedText (str): Fence 加密后得到的密文
Fence_Decrypt(Text: str, Fence: int) -> str
:
用于对 Fence 密文进行解密。
参数:
Text (str): 待进行解密的 Fence 密文
Fence (int): 栏数
返回值:
DecryptedText (str): Fence 解密后得到的原文
Fence_Attack(Text: str) -> List[tuple]
:
用于对 Fence 密文进行爆破攻击。
参数:
Text (str): 待进行爆破攻击的 Fence 密文
返回值:
Result (List[tuple]): Fence 爆破攻击后得到的元组列表(字符串, 栏数)
WFence_Encrypt(Text: str, Fence: int) -> str
:
用于对字符串进行 WFence 加密。
参数:
Text (str): 待进行 WFence 加密的字符串
Fence (int): 栏数
返回值:
EncryptedText (str): WFence 加密后得到的密文
WFence_Decrypt(Text: str, Fence: int) -> str
:
用于对 WFence 密文进行解密。
参数:
Text (str): 待进行解密的 WFence 密文
Fence (int): 栏数
返回值:
DecryptedText (str): WFence 解密后得到的原文
WFence_Attack(Text: str) -> List[tuple]
:
用于对 WFence 密文进行爆破攻击。
参数:
Text (str): 待进行爆破攻击的 WFence 密文
返回值:
Result (List[tuple]): WFence 爆破攻击后得到的元组列表(字符串, 栏数)
本模块用于处理进制转换和常用哈希。
Binary_String(Binary: str) -> str
:
用于将形如"1010...0101"的二进制字符串按照"8位1字符"的规则转换为字符串。
参数:
Binary (str): 二进制字符串
返回值:
String (str): 转换得到的字符串
Binary_Dec(Binary: str) -> int
:
用于将形如"1010...0101"的二进制字符串转换为十进制整数形式。
参数:
Binary (str): 二进制字符串
返回值:
Dec (int): 转换得到的十进制整数
Binary_Hex(Binary: str) -> str
:
用于将形如"1010...0101"的二进制字符串转换为十六进制字符串形式(含 0x 前缀)。
参数:
Binary (str): 二进制字符串
返回值:
Hex (str): 转换得到的十六进制字符串
Dec_String(Dec: int) -> str
:
用于将十进制整数转换为字符串(UTF-8 字符集)。
参数:
Dec (int): 十进制整数
返回值:
String (str): 转换得到的字符串
Dec_Binary(Dec: int) -> str
:
用于将十进制整数转换为二进制字符串形式(含 0b 前缀)。
参数:
Dec (int): 十进制整数
返回值:
Binary (str): 转换得到的二进制字符串
Dec_Hex(Dec: int) -> str
:
用于将十进制整数转换为十六进制字符串形式(含 0x 前缀)。
参数:
Dec (int): 十进制整数
返回值:
Hex (str): 转换得到的十六进制字符串
Hex_String(Hex: str) -> str
:
用于将形如"0a0b0c...1c1b1a"的十六进制字符串按照"2位1字符"的规则转换为字符串。
参数:
Hex (str): 十六进制字符串
返回值:
String (str): 转换得到的字符串
Hex_Binary(Hex: str) -> str
:
用于将形如"0a0b0c...1c1b1a"的十六进制字符串为二进制字符串形式(含 0b 前缀)。
参数:
Hex (str): 十六进制字符串
返回值:
Binary (str): 转换得到的二进制字符串
Hex_Dec(Hex: str) -> int
:
用于将形如"0a0b0c...1c1b1a"的十六进制字符串为十进制整数形式。
参数:
Hex (str): 十六进制字符串
返回值:
Dec (int): 转换得到的十进制整数
SHA1(Text: str) -> str
:
用于获取字符串的 SHA1 哈希值。
参数:
Text (str): 字符串
返回值:
Hash (str): 该字符串的 SHA1 哈希值(十六进制字符串,不含 0x 前缀)
SHA256(Text: str) -> str
:
用于获取字符串的 SHA256 哈希值。
参数:
Text (str): 字符串
返回值:
Hash (str): 该字符串的 SHA256 哈希值(十六进制字符串,不含 0x 前缀)
SHA512(Text: str) -> str
:
用于获取字符串的 SHA512 哈希值。
参数:
Text (str): 字符串
返回值:
Hash (str): 该字符串的 SHA512 哈希值(十六进制字符串,不含 0x 前缀)
MD5(Text: str) -> str
:
用于获取字符串的 MD5 哈希值。
参数:
Text (str): 字符串
返回值:
Hash (str): 该字符串的 MD5 哈希值(十六进制字符串,不含 0x 前缀)
本模块用于解决连接题目环境时可能遇到的工作量证明问题,在 Linux 环境下可以正常运行。
from Poseidon.PoW import PoWUtils
ProofOfWork_SHA256_Full(Url: str, Port: int, HashBegin: str, HashEnd: str, TextLength: int, SendAfter: str) -> remote
:
用于解决连接题目环境时可能遇到的工作量证明问题,这一函数可处理以下情况:给出了 SHA256 的完整值,求长度为参数 (TextLength:int) 的字符串使得其 SHA256 值与给出的 SHA256 值相等。
参数:
Url (str): 题目环境的链接地址
Port (int): 题目环境的端口号
HashBegin (str): 哈希值之前的字符串
HashEnd (str): 哈希值之后的字符串
TextLength (int): 待求解的字符串的长度
SendAfter (str): 在接收到这个参数所指明的字符串后才将求解出的字符串发送给服务器
返回值:
Connection (pwn.remote): 与服务器建立的连接对象
ProofOfWork_SHA256_Prefix(Url: str, Port: int, PrefixBegin: str, PrefixEnd: str, PrefixLength: int, MaxTextLength: int, SendAfter: str) -> remote
:
用于解决连接题目环境时可能遇到的工作量证明问题,这一函数可处理以下情况:给出了 SHA256 的前缀值,求一个最大长度不超过参数 (MaxTextLength:int) 的字符串使得其 SHA256 值的前缀与给出的 SHA256 前缀相等。
参数:
Url (str): 题目环境的链接地址
Port (int): 题目环境的端口号
PrefixBegin (str): 哈希值前缀之前的字符串
PrefixEnd (str): 哈希值前缀之后的字符串
PrefixLength (int): 哈希值前缀的字符串的长度
MaxTextLength (int): 待求解的字符串的最大长度
SendAfter (str): 在接收到这个参数所指明的字符串后才将求解出的字符串发送给服务器
返回值:
Connection (pwn.remote): 与服务器建立的连接对象
ProofOfWork_SHA256_Suffix(Url: str, Port: int, SuffixBegin: str, SuffixEnd: str, SuffixLength: int, MaxTextLength: int, SendAfter: str) -> remote
:
用于解决连接题目环境时可能遇到的工作量证明问题,这一函数可处理以下情况:给出了 SHA256 的后缀值,求一个最大长度不超过参数 (MaxTextLength:int) 的字符串使得其 SHA256 值的后缀与给出的 SHA256 后缀相等。
参数:
Url (str): 题目环境的链接地址
Port (int): 题目环境的端口号
SuffixBegin (str): 哈希值后缀之前的字符串
SuffixEnd (str): 哈希值后缀之后的字符串
SuffixLength (int): 哈希值后缀的字符串的长度
MaxTextLength (int): 待求解的字符串的最大长度
SendAfter (str): 在接收到这个参数所指明的字符串后才将求解出的字符串发送给服务器
返回值:
Connection (pwn.remote): 与服务器建立的连接对象
ProofOfWork_SHA256_StartWithZero(Url: str, Port: int, KnownBegin: str, KnownEnd: str, UnknownLength: int, StartWithZeroLength: int, SendAfter: str) -> remote
:
用于解决连接题目环境时可能遇到的工作量证明问题,这一函数可处理以下情况:给出了原文的前一部分,剩下长度(UnknownLength:int)的部分未知,要求解出未知部分的字符串,以使得与已知部分拼接得到的字符串的 SHA256 值的二进制形式中开头所包含的 0 的个数为(StartWithZeroLength:int)。
参数:
Url (str): 题目环境的链接地址
Port (int): 题目环境的端口号
KnownBegin (str): 已知部分之前的字符串
KnownEnd (str): 已知部分之后的字符串
UnknownLength (int): 未知部分的字符串的长度
StartWithZeroLength (int): SHA256 值的二进制形式中开头所包含的 0 的个数
SendAfter (str): 在接收到这个参数所指明的字符串后才将求解出的字符串发送给服务器
返回值:
Connection (pwn.remote): 与服务器建立的连接对象
ProofOfWork_SHA256_EndWithZero(Url: str, Port: int, KnownBegin: str, KnownEnd: str, UnknownLength: int, EndWithZeroLength: int, SendAfter: str) -> remote
:
用于解决连接题目环境时可能遇到的工作量证明问题,这一函数可处理以下情况:给出了原文的前一部分,剩下长度(UnknownLength:int)的部分未知,要求解出未知部分的字符串,以使得与已知部分拼接得到的字符串的 SHA256 值的二进制形式中末尾所包含的 0 的个数为(EndWithZeroLength:int)。
参数:
Url (str): 题目环境的链接地址
Port (int): 题目环境的端口号
KnownBegin (str): 已知部分之前的字符串
KnownEnd (str): 已知部分之后的字符串
UnknownLength (int): 未知部分的字符串的长度
EndWithZeroLength (int): SHA256 值的二进制形式中末尾所包含的 0 的个数
SendAfter (str): 在接收到这个参数所指明的字符串后才将求解出的字符串发送给服务器
返回值:
Connection (pwn.remote): 与服务器建立的连接对象
ProofOfWork_MD5_Full(Url: str, Port: int, HashBegin: str, HashEnd: str, TextLength: int, SendAfter: str) -> remote
:
用于解决连接题目环境时可能遇到的工作量证明问题,这一函数可处理以下情况:给出了 MD5 的完整值,求长度为参数 (TextLength:int) 的字符串使得其 MD5 值与给出的 MD5 值相等。
参数:
Url (str): 题目环境的链接地址
Port (int): 题目环境的端口号
HashBegin (str): 哈希值之前的字符串
HashEnd (str): 哈希值之后的字符串
TextLength (int): 待求解的字符串的长度
SendAfter (str): 在接收到这个参数所指明的字符串后才将求解出的字符串发送给服务器
返回值:
Connection (pwn.remote): 与服务器建立的连接对象
ProofOfWork_MD5_Prefix(Url: str, Port: int, PrefixBegin: str, PrefixEnd: str, PrefixLength: int, MaxTextLength: int, SendAfter: str) -> remote
:
用于解决连接题目环境时可能遇到的工作量证明问题,这一函数可处理以下情况:给出了 MD5 的前缀值,求一个最大长度不超过参数 (MaxTextLength:int) 的字符串使得其 MD5 值的前缀与给出的 MD5 前缀相等。
参数:
Url (str): 题目环境的链接地址
Port (int): 题目环境的端口号
PrefixBegin (str): 哈希值前缀之前的字符串
PrefixEnd (str): 哈希值前缀之后的字符串
PrefixLength (int): 哈希值前缀的字符串的长度
MaxTextLength (int): 待求解的字符串的最大长度
SendAfter (str): 在接收到这个参数所指明的字符串后才将求解出的字符串发送给服务器
返回值:
Connection (pwn.remote): 与服务器建立的连接对象
ProofOfWork_MD5_Suffix(Url: str, Port: int, SuffixBegin: str, SuffixEnd: str, SuffixLength: int, MaxTextLength: int, SendAfter: str) -> remote
:
用于解决连接题目环境时可能遇到的工作量证明问题,这一函数可处理以下情况:给出了 MD5 的后缀值,求一个最大长度不超过参数 (MaxTextLength:int) 的字符串使得其 MD5 值的后缀与给出的 MD5 后缀相等。
参数:
Url (str): 题目环境的链接地址
Port (int): 题目环境的端口号
SuffixBegin (str): 哈希值后缀之前的字符串
SuffixEnd (str): 哈希值后缀之后的字符串
SuffixLength (int): 哈希值后缀的字符串的长度
MaxTextLength (int): 待求解的字符串的最大长度
SendAfter (str): 在接收到这个参数所指明的字符串后才将求解出的字符串发送给服务器
返回值:
Connection (pwn.remote): 与服务器建立的连接对象
ProofOfWork_MD5_StartWithZero(Url: str, Port: int, KnownBegin: str, KnownEnd: str, UnknownLength: int, StartWithZeroLength: int, SendAfter: str) -> remote
:
用于解决连接题目环境时可能遇到的工作量证明问题,这一函数可处理以下情况:给出了原文的前一部分,剩下长度(UnknownLength:int)的部分未知,要求解出未知部分的字符串,以使得与已知部分拼接得到的字符串的 MD5 值的二进制形式中开头所包含的 0 的个数为(StartWithZeroLength:int)。
参数:
Url (str): 题目环境的链接地址
Port (int): 题目环境的端口号
KnownBegin (str): 已知部分之前的字符串
KnownEnd (str): 已知部分之后的字符串
UnknownLength (int): 未知部分的字符串的长度
StartWithZeroLength (int): MD5 值的二进制形式中开头所包含的 0 的个数
SendAfter (str): 在接收到这个参数所指明的字符串后才将求解出的字符串发送给服务器
返回值:
Connection (pwn.remote): 与服务器建立的连接对象
ProofOfWork_MD5_EndWithZero(Url: str, Port: int, KnownBegin: str, KnownEnd: str, UnknownLength: int, EndWithZeroLength: int, SendAfter: str) -> remote
:
用于解决连接题目环境时可能遇到的工作量证明问题,这一函数可处理以下情况:给出了原文的前一部分,剩下长度(UnknownLength:int)的部分未知,要求解出未知部分的字符串,以使得与已知部分拼接得到的字符串的 MD5 值的二进制形式中末尾所包含的 0 的个数为(EndWithZeroLength:int)。
参数:
Url (str): 题目环境的链接地址
Port (int): 题目环境的端口号
KnownBegin (str): 已知部分之前的字符串
KnownEnd (str): 已知部分之后的字符串
UnknownLength (int): 未知部分的字符串的长度
EndWithZeroLength (int): MD5 值的二进制形式中末尾所包含的 0 的个数
SendAfter (str): 在接收到这个参数所指明的字符串后才将求解出的字符串发送给服务器
返回值:
Connection (pwn.remote): 与服务器建立的连接对象
本项目使用 GPL-3.0 作为开源许可证。