我正在尝试为自定义Microsoft P160 PlayReady曲线创建正确的DER编码ECC参数,以便输入HSM。我找到了一些指定P160曲线定义的来源,因为它是非标准和自定义的。以下是一个来源的链接。特别是,PlayReady曲线值是威廉斯坦的书“初等数论”,“计算方法”的discussed in Section 6.4.2。
以下是关于P160 PlayReady曲线参数的another source的施法。
对于ECC,Microsoft在Zp上使用椭圆曲线,其中p是a 160位素数(如下所示)。曲线由点组成 位于曲线上的y ^ 2 = x ^ 3 + ax + b,其中操作完成 字段Zp和a和b是下面给出的系数。 所有值都表示为压缩二进制值:换句话说,a Zp上的单个值简单地编码为20个字节,存储在少量 字节序。因此,椭圆曲线上的点是40字节 块,由两个20字节的小端值组成(x 坐标后跟y坐标)。以下是参数 MS-DRM中使用的椭圆曲线:
p(模数): 89abcdef012345672718281831415926141424f7
系数a: 37a5abccd277bce87632ff3d4780c009ebe41497
系数b :0dd8dabf725e2f3228e85f1ad78fdedf9328239e
发电机x :8723947fd6a3a1e53510c07dba38daf0109fa120
* generator y :445744911075522d8c3c5856d4ed7acda379936f
曲线顺序:89abcdef012345672716b26eec14904428c2a675
这些常量是固定的,并由MS-DRM中的所有各方使用 系统。当你看到这个时,模数的“书呆子吸引力”很高 十六进制数:它包括以十六进制计数,如 以及基本常数e,pi和sqrt(2)的数字。
根据这些信息,我使用BouncyCastle作为基础ASN.1库,为P160曲线创建了以下的DER编码曲线参数的十六进制编码。请注意,这些曲线参数中未指定种子值。
308195020101302006072a8648ce3d010102150089abcdef012345672718281831415926141424f7302c041437a5abccd277bce87632ff3d4780c009ebe4149704140dd8dabf725e2f3228e85f1ad78fdedf9328239e0429048723947fd6a3a1e53510c07dba38daf0109fa120445744911075522d8c3c5856d4ed7acda379936f02150089abcdef012345672716b26eec14904428c2a675
虽然数学上这些曲线参数被HSM和OpenSSL接受,但是产生的P160曲线点是PlayReady不可接受的。我可以使用相同的过程来生成PlayReady可接受的有效P256曲线点,所以我不相信我的方法存在缺陷。有没有人对PlayReady P160曲线参数有任何经验?
答案 0 :(得分:2)
在与Microsoft合作后,找到了解决方案。显然,必须字节交换公钥x / y点,并使用私钥使PlayReady工具包接受仅针对P160曲线的EC密钥对。 P256 EC密钥对不需要这种奇数字节交换。