5 个稳定版本
1.1.1 | 2024年5月15日 |
---|---|
1.1.0 | 2021年7月26日 |
1.0.2 | 2021年7月18日 |
1.0.0 | 2021年7月13日 |
#10 in #32-byte
用于 2 crates
58KB
745 行
bip38
Rust 实现的 bip-0038,用作依赖项(crate)。
功能
使用 bip-0038 标准加密和解密比特币私钥。
此 crate 可以处理比特币私钥作为原始 32 字节([u8; 32]
)和编码在 wif
格式。
基本示例
加密
use bip38::{Encrypt, EncryptWif, Error};
// true => compress
assert_eq!(
[0x11; 32].encrypt("strong_pass", true).unwrap(),
"6PYMgbeR64ypE4g8ZQhGo7ScudV5BLz1vMFUCs49AWpW3jVNWfH6cAdTi2"
);
// false => uncompress
assert_eq!(
[0x11; 32].encrypt("strong_pass", false).unwrap(),
"6PRVo8whLAhpRwSM5tJfmbAbZ9mCxjyZExaTXt6EMSXw3f5QJxMDFQQND2"
);
// [0x00; 32] is an invalid private key and cannot generate a valid bitcoin address
assert_eq!([0x00; 32].encrypt("strong_pass", true), Err(Error::PrvKey));
assert_eq!([0x00; 32].encrypt("strong_pass", false), Err(Error::PrvKey));
// wif
assert_eq!(
"KwntMbt59tTsj8xqpqYqRRWufyjGunvhSyeMo3NTYpFYzZbXJ5Hp".encrypt_wif("strong_pass"),
Ok(String::from("6PYMgbeR64ypE4g8ZQhGo7ScudV5BLz1vMFUCs49AWpW3jVNWfH6cAdTi2"))
);
assert_eq!(
"5HwoXVkHoRM8sL2KmNRS217n1g8mPPBomrY7yehCuXC1115WWsh".encrypt_wif("strong_pass"),
Ok(String::from("6PRVo8whLAhpRwSM5tJfmbAbZ9mCxjyZExaTXt6EMSXw3f5QJxMDFQQND2"))
);
解密
use bip38::{Decrypt, Error};
assert_eq!(
"6PYMgbeR64ypE4g8ZQhGo7ScudV5BLz1vMFUCs49AWpW3jVNWfH6cAdTi2".decrypt("strong_pass"),
Ok(([0x11; 32], true)) // compress
);
assert_eq!(
"6PRVo8whLAhpRwSM5tJfmbAbZ9mCxjyZExaTXt6EMSXw3f5QJxMDFQQND2".decrypt("strong_pass"),
Ok(([0x11; 32], false)) // uncompress
);
assert_eq!(
"6PRVo8whLAhpRwSM5tJfmbAbZ9mCxjyZExaTXt6EMSXw3f5QJxMDFQQND2".decrypt("wrong_pass"),
Err(Error::Pass)
);
// wif
assert_eq!(
"6PYMgbeR64ypE4g8ZQhGo7ScudV5BLz1vMFUCs49AWpW3jVNWfH6cAdTi2"
.decrypt_to_wif("strong_pass"),
Ok(String::from("KwntMbt59tTsj8xqpqYqRRWufyjGunvhSyeMo3NTYpFYzZbXJ5Hp"))
);
assert_eq!(
"6PRVo8whLAhpRwSM5tJfmbAbZ9mCxjyZExaTXt6EMSXw3f5QJxMDFQQND2"
.decrypt_to_wif("strong_pass"),
Ok(String::from("5HwoXVkHoRM8sL2KmNRS217n1g8mPPBomrY7yehCuXC1115WWsh"))
);
生成(椭圆曲线乘法,非确定性)
use bip38::{Decrypt, Generate};
// true => compress
assert!("passphrase".generate(true).unwrap().starts_with("6Pn"));
// false => uncompress
assert!("passphrase".generate(false).unwrap().starts_with("6Pf"));
// ぽー
assert!("バンドメイド".generate(true).unwrap().decrypt("バンドメイド").is_ok());
布尔标志
true
总是表示:使用此私钥的公钥压缩
(33 字节)。false
总是表示:使用此私钥的公钥未压缩
(65 字节)。
注意:未压缩公钥的使用已弃用并受到谴责。对于新的私钥,始终选择 true
标志。
规范化
此 crate 处理密码的规范化(nfc
),如 bip-0038
中指定。
use bip38::{Decrypt, Encrypt};
assert_eq!(
[0xba; 32].encrypt("ΜΟΛΩΝ ΛΑΒΕ", true).unwrap().decrypt("ΜΟΛΩΝ ΛΑΒΕ").unwrap(),
([0xba; 32], true)
);
测试
请始终使用 cargo test
与 --release
标志运行。在没有发布构建优化的情况下运行测试可能需要很长时间(加密算法在设计上对 CPU 负载较大)。
用法
您可以通过将以下内容添加到您的 Cargo.toml
来在此项目中使用此 crate
[dependencies]
bip38 = "1.1.1"
有关更多详细信息和方法,请访问 文档。
依赖关系
~7MB
~112K SLoC