sCrypt 合约中的椭圆曲线算法:第二部分

这篇具有很好参考价值的文章主要介绍了sCrypt 合约中的椭圆曲线算法:第二部分。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们在脚本中实现了椭圆曲线 (EC) 算法。在之前的实现中,我们进行链下计算并在脚本中验证结果。我们这里直接用脚本计算。

基于EC的应用非常多,特别是在密码学领域,如数字签名、加密、承诺方案等。作为具体示例,我们重新实现了 ECDSA 签名验证,允许使用任意消息验证签名。

模逆

在实现点加法和乘法之前,我们先介绍模逆,因为它是一个积木。

整数 a 的模乘逆是整数 x,使得 a*x ≡ 1 mod n。为了导出该值,我们使用扩展欧几里得算法 (eGCD)。因为在使用 EC 算法时模逆会占用大部分脚本大小,所以尽可能优化它是至关重要的。因此,我们使用内联汇编直接在原始脚本中对其进行编码。

扩展欧几里德算法

扩展欧几里德算法是对标准欧几里德算法的扩展。除了找到最大公约数 (GCD) 之外,它还计算 Bézout 恒等式的系数,它们是整数 xy,使得:

scrypt曲线,智能合约,算法,零知识证明,区块链,智能合约

eGCD算法定义如下:

scrypt曲线,智能合约,算法,零知识证明,区块链,智能合约

当余数 r(i+1)0 时停止执行。如果 ab 是互质的(在 EC 算法中它们总是应该互质,因为曲线参数 pn 是质数),x 也是 a mod b 的模逆。

下面是输入a=240b=46的eGCD算法的示例计算表:

scrypt曲线,智能合约,算法,零知识证明,区块链,智能合约

资料来源: 维基百科

实现

以下是扩展欧几里德算法在 Script 中的高度优化实现。因为我们只对 t(i) 序列感兴趣,所以我们不需要跟踪 s(i) 序列,从而使脚本大小更小。

static function modInverseEGCD(int x, int n) : int {
    // The following script already does modular reduction at the start so there's no
    // need to normalize x before function call.
    asm {
        OP_2DUP OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_DUP OP_2 OP_PICK OP_ADD OP_ELSE OP_DUP OP_ENDIF OP_NIP OP_2 OP_ROLL OP_DROP
        OP_DUP OP_TOALTSTACK OP_TOALTSTACK OP_TOALTSTACK
        OP_1 OP_0 OP_1
        loop(UB) {
            OP_FROMALTSTACK OP_FROMALTSTACK OP_2DUP OP_DUP OP_IF OP_TUCK OP_MOD OP_TOALTSTACK OP_TOALTSTACK OP_DIV OP_MUL OP_SUB OP_TUCK OP_ELSE OP_TOALTSTACK OP_TOALTSTACK OP_DROP OP_DROP OP_ENDIF
        }
        OP_FROMALTSTACK OP_FROMALTSTACK OP_DROP OP_DROP OP_DROP OP_FROMALTSTACK OP_SWAP OP_NIP
    }
}
源代码

计算循环的上限

k 位模数 n 的迭代次数上限可以使用以下等式导出:

scrypt曲线,智能合约,算法,零知识证明,区块链,智能合约

,其中 phi 是黄金比例:

scrypt曲线,智能合约,算法,零知识证明,区块链,智能合约

对于 256 位的模数,如比特币曲线 secp256k1,我们得到 368 的上限。modInverseEGCD() 生成的脚本大小约为 7 KB。

点加法

scrypt曲线,智能合约,算法,零知识证明,区块链,智能合约

椭圆曲线上的加点定义为​​通过点 PQ 的直线的曲线交点的负值。如果其中一个点是无限点 (0, 0),我们只返回另一个点。

static function addPoints(Point p, Point q) : Point {
    Point ret = {0, 0};

    if (p.x == 0 && p.y == 0) {
        // if P == inf -> P + Q = Q
        ret = q;
    } else if (q.x == 0 && q.y == 0) {
        // if Q == inf -> P + Q = P
        ret = p;
    } else {
        int lambda = 0;
        if (p.x == q.x && p.y == q.y) {
            lambda = (3 * p.x * p.x) * modInverseEGCD(2 * p.y, P);
        } else {
            lambda = (q.y - p.y) * modInverseEGCD(q.x - p.x, P);
        }

        int rx = modReduce(lambda * lambda - p.x - q.x, P);
        int ry = modReduce(lambda * (p.x - rx) - p.y, P);

        ret = {rx, ry};
    }

    return ret;
}
源代码

点加倍

scrypt曲线,智能合约,算法,零知识证明,区块链,智能合约

如果 PQ 处于同一坐标,我们使用曲线在该坐标处的切线交点。

static function doublePoint(Point p) : Point {
    int lambda = (3 * p.x * p.x) * modInverseEGCD(2 * p.y, P);

    int rx = modReduce(lambda * lambda - 2 * p.x, P);
    int ry = modReduce(lambda * (p.x - rx) - p.y, P);
    
    Point res = {rx, ry};
    return res;
}
源代码

标量乘法

点与标量的乘法是我们定义的计算量最大的函数。为简单起见,我们使用了双倍-加法算法。还有其它更高效的方法。

static function multByScalar(Point p, int m) : Point {
    // Double and add method.
    // Lowest bit to highest.
    Point n = p;
    Point q = {0, 0};

    bytes mb =   reverseBytes(num2bin(m, S), S);
    bytes mask = reverseBytes(num2bin(1, S), S);
    bytes zero = reverseBytes(num2bin(0, S), S);

    loop (256) : i {
        if ((mb & (mask << i)) != zero) {
            q = addPoints(q, n);
        }

        n = doublePoint(n);
    }

    return q;
}
源代码

ECDSA 签名验证

现在我们已经实现了所有需要的 EC 原语,我们可以定义一个函数来检查任意消息签名的有效性,而无需任何新的操作码,例如 BTC 上的 OP_CHECKSIGFROMSTACK 或 BCH 上的 OP_DATASIGVERIFY(又名 OP_CHECKDATASIG)。

static function verifySig(bytes m, Signature sig, Point pubKey) : bool {
    Sha256 hash = hash256(m);
    int hashInt = unpack(reverseBytes(hash, 32));

    require(sig.r >= 1 && sig.r < n && sig.s >= 1 && sig.s < n);

    int sInv = modInverseEGCD(sig.s, n);
    int u1 = modReduce(hashInt * sInv, n);
    int u2 = modReduce(sig.r * sInv, n);

    Point U1 = multByScalar(G, u1);
    Point U2 = multByScalar(pubKey, u2);
    Point X = addPoints(U1, U2);

    return sig.r == X.x;
}

正如我们所见,该函数调用了两次标量乘法。单次调用 multByScalar() 会花费我们大约 5 MB 的脚本大小。因此,单个签名验证大约需要 10 MB 的脚本,可以进一步优化。我们甚至可以使用自定义曲线而不是标准的 secp256k1 并使用更大的密钥大小来显着提高安全性。

致谢

这是 nChain 白皮书 1611 的实现。文章来源地址https://www.toymoban.com/news/detail-792100.html

到了这里,关于sCrypt 合约中的椭圆曲线算法:第二部分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SM2椭圆曲线公钥密码算法实现项目

    Python 3.9 、PyCharm SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。 (1)有限域上的椭圆曲线上的点的加法 (2)dB*C1=dB*k

    2024年02月12日
    浏览(45)
  • 算法2_非对称加密算法之ECDSA(椭圆曲线数字签名算法)

    ECDSA(椭圆曲线数字签名算法) AES(高级加密标准): =对称加密 ​ 对业务数据进行加密,防止他人可以看见 ECDSA(椭圆曲线数字签名算法):=非对称加密算法(公钥和私钥) ​ 验证数据的真实性,防止业务数据被篡改 SHA(安全哈希算法)=哈希算法 1. 作用: 因为ECDSA椭圆曲线数字签名算法获得

    2024年02月02日
    浏览(63)
  • SM2椭圆曲线公钥密码算法(Python实现)

    Windows11 PyCharm2019.3.3 x64 通过编写代码实现SM2椭圆曲线公钥密码算法,加深对SM2椭圆曲线公钥密码算法的理解,体会该算法在解决实际问题的价值; 将密码学和数学知识相联系,并灵活运用到密码学的设计方案中; 提高实践能力和逻辑思维能力。 random math gmssl SM2算法和RSA算法

    2024年02月02日
    浏览(55)
  • 椭圆曲线在SM2加解密中的应用(三)

    1.1加密原始数据 SM2加密运算首先是用户A对数据加密,用户A拥有原始数据 椭圆曲线系统参数 长度为klen比特的消息M 公钥Pb 椭圆曲线系统参数,已经在 椭圆曲线参数(二)中详细介绍;M就是需要加密消息,长度为klen; 1.1.1 公钥Pb的计算方式 公钥Pb=dBG,其中dB是私钥,是256b

    2024年02月08日
    浏览(42)
  • SM2椭圆曲线公钥密码算法--密钥对与数字签名

    SM2算法全称是SM2椭圆曲线公钥密码算法(SM是商用密码的拼音缩写),是一种基于“椭圆曲线”的密码ECC(Elliptic Curve Cryptography)。2016年,SM2成为中国国家密码标准。 在商用密码体系中,SM2主要用于替换RSA加密算法。 SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于

    2024年02月11日
    浏览(47)
  • 区块链数字签名、验签,以及椭圆曲线算法JS库—elliptic的使用

    目录 一、简介 二、椭圆曲线密码elliptic 1、安装elliptic和js-sha3 2、Keccak256 3、签名过程

    2024年02月02日
    浏览(46)
  • 深入解析Ed25519椭圆曲线数字签名算法的C#移植及应用示例

    第一部分:Ed25519算法的简介与重要性 随着数字加密技术的飞速发展,我们不断地探索更安全、更高效的加密算法来保护数据和身份验证。其中,Ed25519已经成为了椭圆曲线数字签名算法(ECDSA)的一个重要分支,其在性能和安全性方面都表现出了卓越的特点。 Ed25519的特点 :

    2024年02月12日
    浏览(65)
  • 【密码算法 之十四】非对称算法,ECC椭圆曲线算法 之 ECDSA、ECDH、SM2、SM9等

      ECC(Elliptic Curve Cryptography),就是椭圆曲线密码算法,它是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全,RSA加密算法也是一种非对称加密算法,在公开密钥加密和电子商业中RSA被广泛使用。据

    2024年02月13日
    浏览(35)
  • ECC椭圆曲线入门

    https://web3study.club/ ECC(Ellipse Curve Cryptography)又称椭圆曲线密码体制、椭圆曲线加密算法等。 椭圆曲线加密算法在比特币、区块链上有着广泛的应用。 公式: y^2 = x^3 + ax + b 这里使用简单易懂的方式对大家介绍这部分内容,让大家有个简单的理解 公私钥加密内容​ 公钥未公开部

    2023年04月09日
    浏览(41)
  • 椭圆曲线加密原理与应用

    由于RSA、AES等国际算法面临高强度算法禁售和被部署后门风险,我国基于ECC椭圆曲线,自研SM2/SM3/SM4/SM9一套安全算法。根据国家整体战略,金融及重要领域要逐步实现国密算法替换,另根据人民银行总体规划,在2022年金融行业要全面应用国密算法。 在FireFly移动金融开发平台

    2024年02月05日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包