LunarKeccak256

一个使用 MoonBit 语言实现的 Keccak256 哈希算法库。Keccak256 是 SHA-3 标准的一部分,广泛应用于区块链和密码学领域。

keccak
hash
sha3
cryptography
moon add PingGuoMiaoMiao/LunarKeccak256@0.1.3
Download zip
Version
0.1.3
License
Apache-2.0
Last updated
7 months ago
Downloads
26
README

#LunarKeccak256

一个使用 MoonBit 语言实现的 Keccak256 哈希算法库。

#简介

Keccak256 是 SHA-3 标准的一部分,广泛应用于区块链和密码学领域。本项目提供了一个纯 MoonBit 语言实现的 Keccak256 哈希函数。

#特性

  • ✅ 完整的 Keccak-f[1600] 置换实现
  • ✅ 标准的海绵构造(Sponge Construction)
  • ✅ 支持任意长度的输入
  • ✅ 256 位(32 字节)输出
  • ✅ 纯 MoonBit 实现,无外部依赖
  • ✅ 包含完整的测试用例
  • ✅ 字符串哈希接口完全可用

#⚠️ 已知限制

由于 MoonBit 语言中 FixedArray[Byte]Array[Byte] 之间转换的限制,当前存在以下限制:

  • ⚠️ 字节数组哈希: 直接对字节数组进行哈希可能导致段错误
  • 字符串哈希: 字符串接口完全可用,推荐使用
  • 以太坊集成: 无法直接用于标准以太坊交易签名和地址生成

推荐使用方式: 优先使用字符串接口 (keccak256_stringkeccak256_string_hex)

详细的限制说明和解决方案请参考 STATUS.md

#使用方法

#基本用法(推荐)

// ✅ 推荐:计算字符串的哈希值(返回十六进制字符串)
let hash_hex = @lib.keccak256_string_hex("Hello, World!")
println(hash_hex)

// ✅ 推荐:获取字节数组形式的哈希值
let hash_bytes = @lib.keccak256_string("test")
// hash_bytes 是一个 32 字节的数组

#字节数组哈希(⚠️ 不推荐)

// ⚠️ 警告:由于 MoonBit 数组转换限制,字节数组哈希可能导致段错误
// 建议:先转换为十六进制字符串,然后使用字符串接口
let bytes : Array[Byte] = [b'\x01', b'\x02', b'\x03']
// let hash_hex = @lib.keccak256_hex(bytes) // 可能导致 SIGSEGV

#API 文档

#推荐使用的函数(✅ 稳定)

  • keccak256_string(message : String) -> Array[Byte]

    计算字符串的 Keccak256 哈希值,返回 32 字节的哈希结果。推荐使用

  • keccak256_string_hex(message : String) -> String

    计算字符串的 Keccak256 哈希值,返回 64 字符的十六进制字符串。推荐使用

#不推荐使用的函数(⚠️ 可能有风险)

  • keccak256(message : Array[Byte]) -> Array[Byte]

    计算字节数组的 Keccak256 哈希值,返回 32 字节的哈希结果。

    ⚠️ 警告: 由于 MoonBit 数组转换限制,此函数可能导致段错误(SIGSEGV)。建议使用字符串接口替代。

  • keccak256_hex(message : Array[Byte]) -> String

    计算字节数组的 Keccak256 哈希值,返回 64 字符的十六进制字符串。

    ⚠️ 警告: 由于 MoonBit 数组转换限制,此函数可能导致段错误(SIGSEGV)。建议使用 keccak256_string_hex() 替代。

#运行示例

# 构建项目 moon build # 运行示例程序 moon run cmd/main # 运行测试 moon test # 更新测试快照 moon test --update

#测试向量

项目包含多个标准测试向量,验证实现的正确性:

  • 空消息:c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
  • "abc":4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45
  • "The quick brown fox jumps over the lazy dog":4d741b6f1eb29cb2a9b9911c82f56fa8d73b04959d3d9d222895df6c0b28aa15

#项目结构

LunarKeccak256/ ├── cmd/ │ ├── lib/ # 核心库 │ │ ├── keccak.mbt # Keccak256 主实现 │ │ ├── utils.mbt # 工具函数 │ │ ├── keccak_test.mbt # 测试用例 │ │ └── moon.pkg.json # 包配置 │ └── main/ # 示例程序 │ ├── main.mbt # 主程序 │ └── moon.pkg.json # 包配置 ├── moon.mod.json # 模块配置 └── README.mbt.md # 文档

#技术细节

#算法实现

本实现遵循 NIST FIPS 202 标准,包括:

  1. Keccak-f[1600] 置换函数:24 轮迭代,每轮包含 5 个步骤
    • θ (theta):列奇偶性扩散
    • ρ (rho):位旋转
    • π (pi):位置置换
    • χ (chi):非线性混合
    • ι (iota):轮常量异或

  2. 海绵构造
    • 速率 r = 1088 位(136 字节)
    • 容量 c = 512 位(64 字节)
    • 吸收阶段:将填充后的消息逐块吸收
    • 挤出阶段:提取 256 位输出

  3. 填充规则:pad10*1 规则
    • 在消息末尾添加 0x01
    • 填充若干 0x00
    • 最后添加 0x80

#兼容性

#与以太坊兼容性

本实现遵循 NIST FIPS 202 标准和 Keccak 规范,与以太坊使用的 Keccak256 算法兼容:

  • ✅ 测试向量验证:所有标准测试向量均通过验证
  • ✅ 字符串接口:完全可用且稳定
  • ⚠️ 字节数组接口:由于 MoonBit 语言限制,可能存在数组转换问题

#测试覆盖

  • 空消息哈希
  • 标准测试向量("abc", "The quick brown fox..." 等)
  • 边界情况(恰好一个块、两个块)
  • 大输入(10KB+)
  • Unicode 字符串支持
  • 一致性和确定性测试

当前测试状态: 18/18 通过 ✅

#性能说明

  • 纯 MoonBit 实现:无外部依赖,编译为高效的 WASM
  • 算法复杂度:O(n),其中 n 为输入长度
  • 推荐使用场景:字符串哈希、文本消息签名
  • 不推荐场景:需要频繁字节数组转换的场景

详细的性能基准和优化建议请参考 LUNARKECCAK256_IMPROVEMENTS.md

#参考文献

#相关文档

#许可证

Apache-2.0

#贡献

欢迎提交 Issue 和 Pull Request!

改进建议请参考 LUNARKECCAK256_IMPROVEMENTS.md 文档。