secp256k1与p256

 发表于2016年5月12日,芬肯斯坦

第1轮! (双关语意)

最近的一次对话引入了这个片段:

prime256v1不是山寨币的广泛使用曲线,并且被认为非常不安全...

每隔六个月左右,我就会回到这个话题,再次进行重复研究,就像我每隔六个月左右就会重新推导二次方程和链式法则一样,只是为了确保没有任何变化。因此,这一次我认为我应该记录一些讨论的内容,以便未来的我和其他研究人员能够加快这个过程。 

问题是为什么Satoshi选择了secp256k1这条椭圆曲线作为证明BTC中硬币所有权的椭圆曲线数字签名算法(ECDSA)的基础,以及为什么我选择了一条不同的曲线(prime256v1 aka X9_62_prime256v1 aka P256)。Satoshi的选择在各种论坛上引发了无尽的猜测,而他所声称的“它就在附近”的理由并没有多大帮助。

总体上来说,这里是一个关于数字签名算法的更广泛的讨论,以及为什么应该使用ECC而不是更容易理解的RSA。与密码学一样,普遍的不信任和讨论中未知的方面可能会把人带入一个兔子洞。就我个人而言,我喜欢ECDSA让我轻松验证密钥生成的熵的方式。对我来说,选择一个1到2^256之间的随机数要比选择两个随机的256位素数容易得多。考虑到前者不需要更多的硬件,用骰子和铅笔就可以很快完成。

但是我们先把这个讨论放在一边,有几种方法可以评估这类事情。一个普遍的问题是,人们只能证明一种密码系统已被破坏,而不是没有。 但是,有几种方法可以使我们有充分的证据证明加密系统没有被破坏:

1.-信誉-您信任的一些人这样说

2.-理论-从逻辑上讲可以证明它至少和其他东西一样难

3.-观察-许多人(包括您自己)正在使用它来保护黑客想要的贵重物品

如果我们是真正的科学家,并且有足够的时间在手,那么我们几乎会完全忽略声誉,而只是将其作为首先考虑的指南。双盲同行评审是科学的最佳服务标准。但如果你对声誉感兴趣,你可以看看下面这些曲线,看看不同“权威”在这个问题上的说法:

http://infosecurity.ch/20100926/not-every-elliptic-curve-is-the-same-trough-on-ecc-security/

得出的结论是,woodcoin曲线X9_62_prime256v1比bitcoin曲线更好。也许还有一种相反的观点认为,那些权威人士所说的应该被视为隐式错误(跟随大白兔吧!)。关于这个理论,遗憾的是没有证据存在(甚至对于RSA也是如此!),但是关于这个主题有很多值得阅读的内容,值得好好一读。我们来看看曲线本身。两条曲线的形式如下:

E:y2=x3+ax+b(modp)E:y2=x3+ax+b(modp)

有一个生成点(Gx, Gy),一个素数阶n,一个整数因子h。我将使用来自logaddress.org的一个片段,它显示了两条曲线的所有参数:

ec.secNamedCurves = {
	// used by Bitcoin
	/*"secp256k1": function () {
		// p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
		var p = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F");
		var a = BigInteger.ZERO;
		var b = ec.fromHex("7");
		var n = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141");
		var h = BigInteger.ONE;
		var curve = new ec.CurveFp(p, a, b);
		var G = curve.decodePointHex("04"
				+ "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"
				+ "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8");
		return new ec.X9Parameters(curve, G, n, h);
	}*/
	// used by Woodcoin
	"secp256v1": function () {
		// p = ???
		var p = ec.fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF");
		var a = ec.fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC");
		var b = ec.fromHex("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B");
		var n = ec.fromHex("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551");
		var h = BigInteger.ONE;
		var curve = new ec.CurveFp(p, a, b);
		var G = curve.decodePointHex("04"
				+ "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"
				+ "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5");
		return new ec.X9Parameters(curve, G, n, h);
	}
};

这里最明显的区别是参数a和b。Koblitz曲线没有线性参数(a=0)和常数参数(b=7)。我个人已经验证了这个参数是质数。将其与P256中使用的随机参数进行比较(b=5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B),第一次检查时哪个看起来更安全?secp256k1中a和b的这种简单性导致其拥有某些属性,例如更快的签名验证和其他技巧,但也导致更快的Pollard的Rho算法来解决离散对数问题,即破解密码。 据一些权威人士(未经我确认),显然它并没有那么快(甚至不到2倍)。

这里需要注意的另一件事是,P256曲线上的数字来自于一个随机种子,其中应用了SHA1来获得它们:种子=c49d3608 86e70493 6a6678e1 139d26b7 819f7e90这可以用一些代码来验证。如果你问我,我很乐意和你分享。从理论上讲,有可能精确地选择正确的种子(毕竟SHA1在某种程度上已被破坏),从而使生成的参数产生后门曲线。 但是,由于看不到(至少对我来说)制作这种后门曲线的方法,即使手动选择参数(这并不容易注意到),这似乎也是站不住脚的。 无论如何,这种批评同样可以应用于secp256k1。

终于到了“观察”。我们观察到了什么?我个人还没有看到这些曲线的任何断裂。两者都用于保护各种类型的大量资产,但是比特币的公开性质(第一个也是迄今为止最大的公共币)使人们相信secp256k1现在已经过了很好的测试。

结论?遗憾的是,我无法从中得出太多结论。如果对一组椭圆曲线参数相对于另一组参数的可用性和安全性有严重的怀疑,我们将使用一个脚本函数,该函数允许用户为给定的TXO指定将使用哪条曲线。就目前而言,其他攻击可能容易得多,例如侧通道,破坏执行,系统级后门,当然还有橡胶软管和烙铁。如果你确实有理由怀疑secp256k1,即使你的投资组合epsilon中是一小部分,你目前除了cryptonote或woodcoin外没有太多选择。

这是上周我读到的关于这个主题的参考文献的链接,我不会给你们一个正式的参考文献列表,因为我太懒了。我在这里认错。

http://safecurves.cr.yp.to/complete.html

https://tools.ietf.org/html/draft-ietf-msec-mikey-ecc-03

https://perso.univ-rennes1.fr/sylvain.duquesne/master/standards/sec2_final.pdf

http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdfo

http://www.secg.org/sec2-v2.pdf

http://research.microsoft.com/pubs/204914/734.pdf

http://eprint.iacr.org/2015/1018.pdf

https://cryptoexperts.github.io/million-dollar-curve/specifications/2016-02-01_trap-me-if-you-can.pdf

Leave a Reply

Your email address will not be published. Required fields are marked *