首页
社区
课程
招聘
[讨论]FLEXLM中seed3和seed4究竟对ecc有没有用
发表于: 2022-5-11 06:46 7795

[讨论]FLEXLM中seed3和seed4究竟对ecc有没有用

2022-5-11 06:46
7795

看到很多文章说ENCRYPTION_SEED3~ENCRYPTION_SEED4与私钥相关,得到了这两个key就可以搞定ecc,但通过初步分析,情况并没有这么乐观。
分析了一下,至少有两种情况:
1,同时定义了LM_SEED1~LM_SEED3和ENCRYPTION_SEED3~ENCRYPTION_SEED4,则私钥只与LM_SEED1~LM_SEED3有关,与ENCRYPTION_SEED3~ENCRYPTION_SEED4没有关系。
2,如果只定义了LM_SEED1~LM_SEED3,没有定义ENCRYPTION_SEED3~ENCRYPTION_SEED4,则ENCRYPTION_SEED3~ENCRYPTION_SEED4是由LM_SEED1~LM_SEED3产生且唯一。
对于情况2,私钥是通过genkeys产生的,函数如下

其中的seed为croseeds,croseeds来源于以下代码:

newseeds通过l_genrand产生,进而得到croseeds,seed3~seed4(ENCRYPTION_SEED3~ENCRYPTION_SEED4)。

从以上分析可以看出,私钥/公钥只与lmseed1~lmseed3有关,与seed3~seed4没有直接关联。
由此有如下结论:
1,seed3~seed4和私钥种子croseeds都是由LM_SEED1~LM_SEED3产生的,但这个过程不可逆,即不能由seed3~seed4和私钥croseeds反推出LM_SEED1~LM_SEED3;
2,即使找到seed3~seed4,同样无法获得私钥。
因此暴力求解flexlm ECC的计算量还是2^96,并没有减少到2^64.
以上个人的一些浅见,还望各位flexlm大神多多指正。

static
int
genkeys(unsigned int *seed,
    int pubkey_strength,
    sb_PrivateKey *privateKey,
    sb_PublicKey *publicKey)
static
int
genkeys(unsigned int *seed,
    int pubkey_strength,
    sb_PrivateKey *privateKey,
    sb_PublicKey *publicKey)
l_genrand(job, lmseed1, lmseed2, lmseed3, NEWSEEDSIZ, newseeds);
    lc_free_job(job);
    for (i = 0;i < 4; i++)
    {
        if (lm_case == 7 || lm_case == 8) /* new with v8.1+ */
        {
            seed1 |= newseeds[i] << (i * 8);
            seed2 |= newseeds[i+4] << (i * 8);
            seed3 |= newseeds[i+8] << (i * 8);
            seed4 |= newseeds[i+12] << (i * 8);
        }
        if (lm_case == 1 || lm_case == 2) /* Upgrade pre7.2 to 8.1+*/
        {
            seed3 |= newseeds[i+8] << (i * 8);
            seed4 |= newseeds[i+12] << (i * 8);
        }
        croseeds[0][0] |= (newseeds[i+16] << (i * 8));
        croseeds[0][1] |= (newseeds[i+20] << (i * 8));
        croseeds[0][2] |= (newseeds[i+24] << (i * 8));
    }
........
 
    l_gen_pkey_headers(croseeds, pubkey_strength, &public, vname);
l_genrand(job, lmseed1, lmseed2, lmseed3, NEWSEEDSIZ, newseeds);
    lc_free_job(job);
    for (i = 0;i < 4; i++)
    {
        if (lm_case == 7 || lm_case == 8) /* new with v8.1+ */
        {
            seed1 |= newseeds[i] << (i * 8);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 3
支持
分享
最新回复 (4)
雪    币: 6277
活跃值: (6931)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2

"同时定义了LM_SEED1~LM_SEED3和ENCRYPTION_SEED3~ENCRYPTION_SEED4,则私钥只与LM_SEED1~LM_SEED3有关,与ENCRYPTION_SEED3~ENCRYPTION_SEED4没有关系"  

这个只是说明同时定义时,ENCRYPTION_SEED3~ENCRYPTION_SEED4的定义没起作用,优先级不同而已。由于LM_SEED1~LM_SEED3产生了新的ENCRYPTION_SEED3~ENCRYPTION_SEED4而覆盖了自己定义的,并不意味着着与ENCRYPTION_SEED3~ENCRYPTION_SEED4无关。


ECC的公私钥由ENCRYPTION_SEED3~ENCRYPTION_SEED4产生的,虽然你不能根据ECC的公私钥反推出ENCRYPTION_SEED3~ENCRYPTION_SEED4。


典型例证就是:固定LM_SEED1~LM_SEED3,则ENCRYPTION_SEED1~ENCRYPTION_SEED4就是固定的。固定ENCRYPTION_SEED1~ENCRYPTION_SEED2,改变ENCRYPTION_SEED3~ENCRYPTION_SEED4,则ECC的公私钥会随之改变。


实事上,暴力穷举ENCRYPTION_SEED3~ENCRYPTION_SEED4的组合是可以得到正确的公私钥,理论计算量是16的16次方。


当然,有了LM_SEED1~LM_SEED3,你就拥有了一切。

最后于 2022-5-11 13:10 被yangmyron编辑 ,原因:
2022-5-11 12:37
0
雪    币: 934
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
以下说法只是网上通用的说法,但经过实际测试和1楼贴的代码(来源与SDK9.2):固定LM_SEED1~LM_SEED3,改变ENCRYPTION_SEED3~ENCRYPTION_SEED4,则ECC的公私钥一直保持不变。

"典型例证就是:固定LM_SEED1~LM_SEED3,则ENCRYPTION_SEED1~ENCRYPTION_SEED4就是固定的。固定ENCRYPTION_SEED1~ENCRYPTION_SEED2,改变ENCRYPTION_SEED3~ENCRYPTION_SEED4,则ECC的公私钥会随之改变。"
2022-5-11 13:53
0
雪    币: 539
活跃值: (257)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

公私钥是通过croseeds生成的,croseeds由LM_SEED1~LM_SEED3产生。

ENCRYPTION_SEED1~ENCRYPTION_SEED4可以自定义,如果没有定义,也由LM_SEED1~LM_SEED3产生。

直观上,公私钥与ENCRYPTION_SEED3~ENCRYPTION_SEED4是没有直接关系的。

如要说真有关联,就是当ENCRYPTION_SEED3~ENCRYPTION_SEED4没有定义时,croseeds和这两个seed都是由LM_SEED1~LM_SEED3生成的。

2022-5-13 12:11
1
雪    币: 934
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
感谢kzwn提供的flexlm sdk 8,通过对sdk的编译分析,关于ecc公钥和私钥的种子来源,问题已经基本搞清楚,网上关于seed3和seed4决定公私钥的说法是有版本限制的,8.1之后的版本与seed3和seed4无关,后面有时间再单独进行详细说明。
2022-5-20 17:49
0
游客
登录 | 注册 方可回帖
返回
//