#加密 #加密密钥

smcrypto

中国加密算法标准(SM2/SM3/SM4)的Rust实现

6个版本

0.3.1 2024年8月5日
0.3.0 2024年8月4日
0.2.1 2022年7月14日
0.1.2 2022年4月17日
0.1.1 2022年2月27日

#673 in 加密学

Download history 10/week @ 2024-05-25 4/week @ 2024-06-01 3/week @ 2024-06-08 3/week @ 2024-06-15 18/week @ 2024-07-27 216/week @ 2024-08-03 8/week @ 2024-08-10

242 每月下载量

MIT 协议

59KB
1.5K SLoC

smcrypto

中国加密算法标准(SM2/SM3/SM4)的Rust实现。

快速开始

SM3

let hash = sm3::sm3_hash(b"abc");
assert_eq!(hash, "66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0");

SM2密钥生成

注意公钥为十六进制格式,不包含“04”前缀。

let (sk, pk) = sm2::gen_keypair();

SM2签名/验证

let sign_ctx = sm2::Sign::new(&sk);
let sign = sign_ctx.sign(b"abc");
let verify_ctx = sm2::Verify::new(&pk);
let verify = verify_ctx.verify(b"abc", &sign);
assert_eq!(verify, true);

SM2加密/解密

let enc_ctx = sm2::Encrypt::new(&pk);
let enc = enc_ctx.encrypt(b"abc");
let dec_ctx = sm2::Decrypt::new(&sk);
let dec = dec_ctx.decrypt(&enc);
assert_eq!(String::from_utf8(dec).unwrap(), "abc");

SM2密钥交换

// Step 1
// a side
let ida = b"[email protected]";
let (ska, _) = sm2::gen_keypair();
let keyexchange_a = sm2::KeyExchange::new(ida, &ska);
let (a2b, rska) = keyexchange_a.keyexchange_1ab(16);
// b side
let idb = b"[email protected]";
let (skb, _) = sm2::gen_keypair();
let keyexchange_b = sm2::KeyExchange::new(idb, &skb);
let (b2a, rskb) = keyexchange_b.keyexchange_1ab(16);
// Step 2
// a side
let ka = keyexchange_a.keyexchange_2a(&rska, &b2a);
// b side
let kb = keyexchange_b.keyexchange_2b(&rskb, &a2b);
// Step 3
assert_eq!(ka.k, kb.k);
assert_eq!(ka.s12, kb.s12);

SM4 ECB加密/解密

let key = b"1234567812345678";
let sm4_ecb = sm4::CryptSM4ECB::new(key);
let enc_ecb = sm4_ecb.encrypt_ecb(b"abc");
let dec_ecb = sm4_ecb.decrypt_ecb(&enc_ecb);
assert_eq!(String::from_utf8(dec_ecb).unwrap(), "abc");

SM4 CBC加密/解密

let key = b"1234567812345678";
let iv = b"0000000000000000";
let sm4_cbc = sm4::CryptSM4CBC::new(key, iv);
let enc_cbc = sm4_cbc.encrypt_cbc(b"abc");
let dec_cbc = sm4_cbc.decrypt_cbc(&enc_cbc);
assert_eq!(String::from_utf8(dec_cbc).unwrap(), "abc");

依赖项

~1.5MB
~29K SLoC