我正在尝试为自定义 Microsoft P160 PlayReady 曲线创建正确的 DER 编码 ECC 参数以输入 HSM。我找到了一些指定 P160 曲线定义的来源,因为它是非标准和自定义的。下面是一个来源的链接。特别是,PlayReady 曲线值在William Stein 所著的 Elementary Number Theory,A Computational Approach 一书的第 6.4.2 节中进行了讨论。
下面是来自另一个来源的关于 P160 PlayReady 曲线参数的尝试。
对于 ECC,Microsoft 使用 Zp 上的椭圆曲线,其中 p 是 160 位素数(如下所示)。该曲线由位于曲线 y^2=x^3+ax+b 上的点组成,其中操作是在域 Zp 上完成的,a 和 b 是下面给出的系数。所有值都表示为打包二进制值:换句话说,Zp 上的单个值被简单地编码为 20 个字节,以小端顺序存储。因此,椭圆曲线上的一个点是一个 40 字节的块,它由两个 20 字节的小端值(x 坐标后跟 y 坐标)组成。以下是 MS-DRM 中使用的椭圆曲线的参数:
p(模数): 89abcdef012345672718281831415926141424f7
系数 a: 37a5abccd277bce87632ff3d4780c009ebe41497
coefficient b : 0dd8dabf725e2f3228e85f1ad78fdedf9328239e
generator x : 8723947fd6a3a1e53510c07dba38daf0109fa120
*generator y : 445744911075522d8c3c5856d4ed7acda379936f
Order of curve : 89abcdef012345672716b26eec14904428c2a675
These constants are fixed, and used by all parties in the MS-DRM system. 当您看到这个以十六进制表示的数字时,模数的“书呆子吸引力”很高:它包括以十六进制计数,以及基本常数 e、pi 和 sqrt(2) 的数字。
基于此信息,我使用 BouncyCastle 作为我的基本 ASN.1 库为 P160 曲线创建了以下 DER 编码曲线参数的十六进制编码。请注意,这些曲线参数中没有指定种子值。
308195020101302006072a8648ce3d010102150089abcdef012345672718281831415926141424f7302c041437a5abccd277bce87632ff3d4780c009ebe4149704140dd8dabf725e2f3228e85f1ad78fdedf9328239e0429048723947fd6a3a1e53510c07dba38daf0109fa120445744911075522d8c3c5856d4ed7acda379936f02150089abcdef012345672716b26eec14904428c2a675
尽管这些曲线参数在数学上被 HSM 和 OpenSSL 接受,但产生的 P160 曲线点对 PlayReady 来说是不可接受的。我能够使用相同的过程来生成 PlayReady 可接受的有效 P256 曲线点,所以我不相信我的方法有缺陷。有人对 PlayReady P160 曲线参数有任何经验吗?