# 算法实现
多倍点算法规范文档中提到了三种算法,参见规范文档《A.3 椭圆曲线多倍点运算》
本文采用最简单的二进制展开法
void gm_point_mul(gm_point_t * r, const gm_bn_t k, const gm_point_t * p) {
char bits[257] = {0};
gm_point_t _q;
gm_point_t * q = &_q;
int i;
gm_point_set_infinity(q);
gm_bn_to_bits(k, bits);
for (i = 0; i < 256; i++) {
gm_point_double(q, q);
if (bits[i] == '1') {
gm_point_add(q, q, p);
}
}
gm_point_copy(r, q);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 单元测试
test_ec函数增加:
else if(strcmp(alg, "point_mul") == 0){ // 1千
gm_point_get_xy(&p2, k, NULL);
for (i = 0; i < 1000; i++) {
gm_point_mul(&r, k, &r);
}
}
1
2
3
4
5
6
2
3
4
5
6
main函数增加:
TEST_EC_ALG("point_mul",
"EB04AAE0D53FBA1E3611D5B9ED6EFA3EE5BA57C41AA7A09DDC5816AF09057757CE6FA0678392F4716E45F58E7322C76D5997B1FE44C36D8A5A59B146EE162B93",
"AA307A6575D8348037CEC6F860F6312317B34C81838834EDB008F54A2E590FDC593293D89FE9C933E6CE7E91CD4ABF81EC3C26395622B65754A8C0EE8FB354E9",
"6CBB13143526BE4C6565BA1061C5835E3C61A5DC10B6CD5824C1F6A93B368F6D86B89F0A0459A745F5A192827E5CDCE9CB035DBFEAC286ADCD8F62C4C028567B");
1
2
3
4
2
3
4
算法效率:
saintdeMacBook-Pro:bn saint$ time ./a.out point_mul
r = 6CBB13143526BE4C6565BA1061C5835E3C61A5DC10B6CD5824C1F6A93B368F6D86B89F0A0459A745F5A192827E5CDCE9CB035DBFEAC286ADCD8F62C4C028567B
test result: ok
real 0m6.242s
user 0m5.392s
sys 0m0.060s
1
2
3
4
5
6
7
2
3
4
5
6
7
未经本人同意,禁止转载!