#challenge #solve #check #scheme #generate #proof-of-work #kctf

bin+lib kctf-pow

一个库和 CLI 工具,用于使用 kCTF 方案解决、检查和生成工作量证明挑战

5 个稳定版本

1.2.0 2021 年 6 月 20 日
1.1.2 2021 年 6 月 20 日
1.0.0 2021 年 6 月 20 日

#666数学

BSD-3-ClauseLGPL-3.0+

16KB
206

kctf-pow

一个库和 CLI 工具,用于使用 kCTF 方案解决、检查和生成工作量证明挑战。

安装

作为库使用时,将 kctf-pow 包添加到您的依赖项中。

CLI 可以使用 cargo install kctf-pow 安装,或者通过克隆仓库,使用 cargo build --release 构建,并手动复制可执行文件。

CLI 使用

解决挑战并将解决方案打印到标准输出

kctf-pow solve <challenge>

例如

kctf-pow solve s.AAAAMg==.NDtqORW1uZlIgzszbdMGZA==
# Outputs s.NUH3arymnKB+ysUGdv+67ypDamn4wOKCPORB2ivWE1Yhinam2v4S6q4nAoC5LP97LScdVoq+NuFVF++Win5mNRYZS6bJAs8fk0h8XgvfcC/7JfmFISqeCIo/CIUgIucVAM+eGDjqitRULGXqIOyviJoJjW8DMouMRuJM/3eg/z18kutQHkX0N3sqPeF7Nzkk8S3Bs6aiHUORM30syUKYug==

检查挑战的解决方案

kctf-pow check <challenge>

解决方案从 stdin 读取。如果解决方案正确,程序将退出状态码为 0 并输出 correct。如果解决方案不正确,程序将退出状态码为 1 并输出 incorrect。如果解决方案格式不正确,程序将退出状态码为 1 并将错误信息打印到标准错误。

例如

kctf-pow check s.AAAAMg==.NDtqORW1uZlIgzszbdMGZA==
# Input s.NUH3arymnKB+ysUGdv+67ypDamn4wOKCPORB2ivWE1Yhinam2v4S6q4nAoC5LP97LScdVoq+NuFVF++Win5mNRYZS6bJAs8fk0h8XgvfcC/7JfmFISqeCIo/CIUgIucVAM+eGDjqitRULGXqIOyviJoJjW8DMouMRuJM/3eg/z18kutQHkX0N3sqPeF7Nzkk8S3Bs6aiHUORM30syUKYug==
# Outputs correct and exits with status code 0

随机生成挑战

kctf-pow gen <difficulty>

例如

kctf-pow gen 50
# Outputs s.AAAAMg==.NDtqORW1uZlIgzszbdMGZA==

链式挑战生成和检查

kctf-pow ask <difficulty>

例如

kctf-pow ask 50
# Outputs s.AAAAMg==.NDtqORW1uZlIgzszbdMGZA==
# Input s.NUH3arymnKB+ysUGdv+67ypDamn4wOKCPORB2ivWE1Yhinam2v4S6q4nAoC5LP97LScdVoq+NuFVF++Win5mNRYZS6bJAs8fk0h8XgvfcC/7JfmFISqeCIo/CIUgIucVAM+eGDjqitRULGXqIOyviJoJjW8DMouMRuJM/3eg/z18kutQHkX0N3sqPeF7Nzkk8S3Bs6aiHUORM30syUKYug==
# Outputs correct and exits with status code 0

库使用

use kctf_pow::KctfPow;

fn main() {
    let pow = KctfPow::new();
    // decoding then solving a challenge
    let chall = pow.decode_challenge("s.AAAAMg==.H+fPiuL32DPbfN97cpd0nA==").unwrap();
    println!("{}", chall.solve());
    // decoding then checking a challenge
    let chall = pow.decode_challenge("s.AAAAMg==.NDtqORW1uZlIgzszbdMGZA==").unwrap();
    let sol = "s.NUH3arymnKB+ysUGdv+67ypDamn4wOKCPORB2ivWE1Yhinam2v4S6q4nAoC5LP97LScdVoq+NuFVF++Win5mNRYZS6bJAs8fk0h8XgvfcC/7JfmFISqeCIo/CIUgIucVAM+eGDjqitRULGXqIOyviJoJjW8DMouMRuJM/3eg/z18kutQHkX0N3sqPeF7Nzkk8S3Bs6aiHUORM30syUKYug==";
    assert_eq!(chall.check(sol), Ok(true));
    assert_eq!(chall.check("s.asdf"), Ok(false));
    // generating a random challenge of difficulty 50
    let chall = pow.generate_challenge(50);
    println!("{}", chall);
}

库文档

库的文档可在 docs.rs 上找到。

依赖项

~3MB
~56K SLoC