密码学笔记

一.cryptography in blockchain

btc/eth 一开始用 Secp256k1 是因为有些更好的算法还在专利保护期不能用 - 对称(Symmetric)加密: AES/3DES/DES, DES由于像MD5那样容易破解就不用了, 3DES性能太差,AES - 非对称: RSA(两个大质数),GPG,ECC| 公钥加密私钥解密,私钥签名公钥验签

ECC分为ECDSA(Secp256r1[r=random随机数],secp256k1[无随机数]),EDDSA(ed25519)

sui/sol支持:ed25519两种secp256,btc后来支持:Schnorr(施洛尔算法),eth后来支持:BLS算法

ECDSA 确实更容易受到一些特定类型的侧信道攻击,例如通过监测 CPU 活动的侧信道攻击和针对冯·诺依曼架构的攻击。这些攻击可以通过观察计算过程中泄漏的物理信息(如电磁辐射、功耗变化或执行时间)来获取私钥信息

默认用secp256r1的只有EOS(C++写智能合约)

二.单向散列函数

md5, sha1 哈希碰撞容易弃用,区块链用 sha2/sha3/blake2 多, blake2比sha3快

Poseidon(波塞冬算法)用于零知识证明

三.MPC 托管钱包

金额低于几千万不够门槛申请 Ok MPC 托管钱包密钥,小散户可用 Cobo 的服务

cobo的业务 https://foresightnews.pro/article/detail/63266

四.门限共享密码算法(Threshold Cryptography)

n 个节点的话就是多项式有 n 个参数,例如 n= 2就是 y=a1x+a2x^2

应用:社交恢复、密钥柜

五. AES代码实战与踩坑

当消息长度刚好是16的倍数是,Pkcs7加密时会报错PadError,所以消息长度刚好是16但buffer长度也要额外加16

Returns [PadError] if length of output buffer is not sufficient.

pub fn aes_encrypt(msg: &str) -> String {
    use aes::cipher::{block_padding::Pkcs7, BlockEncryptMut, KeyIvInit};
    let msg_len = msg.len();
    // 在使用 PKCS7 填充时,即使消息长度已经是块大小(16字节)的倍数,填充仍然会被应用。
    // 这是因为 PKCS7 填充的规则是在每个块的末尾添加填充字节,以便解密时可以知道数据的实际长度。
    let mut buf = vec![0u8; (msg_len / 16 + 1) * 16];
    buf[..msg_len].copy_from_slice(msg.as_bytes());
    let pt = cbc::Encryptor::<aes::Aes256>::new(KEY.into(), IV.into()).encrypt_padded_mut::<Pkcs7>(&mut buf, msg.len()).unwrap();
    hex::encode(pt)
}
pub fn aes_decrypt(hex_msg: &str) -> String {
    use aes::cipher::{block_padding::Pkcs7, BlockDecryptMut, KeyIvInit};
    let msg = hex::decode(hex_msg).unwrap();
    let msg_len = msg.len();
    // encrypt msg len must be mul of 16
    debug_assert!(msg_len % 16 == 0);
    let mut buf = vec![0u8; msg_len];
    buf[..msg_len].copy_from_slice(&msg);
    let pt = cbc::Decryptor::<aes::Aes256>::new(KEY.into(), IV.into()).decrypt_padded_mut::<Pkcs7>(&mut buf).unwrap();
    unsafe { String::from_utf8_unchecked(pt.to_vec()) }
}

1.AES加密后消息长度

如果 n % 16 == 0,加密后的消息长度为 n + 16;

如果 n % 16 != 0,加密后的消息长度为 (n + 16) & ~15。

((n / 16) + 1) * 16(n + 16) & ~15 等价

六.ZK电路设计

后浪 podcast EP.39 主持人问了个有意思的问题,既然你们基金投研的人也会帮助项目方写代码,那么你们也会写ZK电路的代码么? 这里的电路设计不是指的 FPGA/VHDL 硬件开发,而是ZK算法逻辑门这些的实现

七.公司业务场景-助记词加密

量化公司部署套利机器人实盘会部署到云主机运行,但如果配置文件中的交易所api_key或者钱包助记词明文存储的话,一是服务器被黑容易盗走账号,二是公司内鬼登录机器盗走账号

假设公司有老板,CTO,开发组长,开发,运维五人,这五个人都有ssh到套利机器人节点

明文存储钱包助记词万一内部人员作恶,盗走资产或者用更难发现的手段对敲走公司资产

  • 方案一: 助记词用AES加密,AES密码写在极少数人有权限的代码仓库2,这样运维人员ssh登录机器只能看到AES加密后的助记词
  • 方案二: 代码写死一份密码,进程启动需要一份密码,双密码哈希后得到AES密码
  • 方案三: MPC/多签 老板,CTO,组长,运维 都只有私钥/密码分片,需要三个私钥/密码分片才能解密出助记词
  • 方案四: 调用EOA智能合约去给交易签名?
  • 方案五: KMS,Key Management Service
全部评论(0)