# 算法实现

蒙哥马利算法也比较简单,大家套算法就行,具体实现:

void gm_bn_exp(gm_bn_t r, const gm_bn_t a, const gm_bn_t b, const gm_bn_t m) {
    gm_bn_t t;
    uint64_t w;
    int i, j;

    // set t to mont one
    gm_bn_to_mont(t, GM_BN_ONE, m);

    for (i = 7; i >= 0; i--) {
        w = b[i];
        for (j = 0; j < 32; j++) {
            gm_bn_sqr(t, t, m);
            if (w & 0x080000000ULL) {
                gm_bn_mont_mul(t, t, a, m);
            }
            w <<= 1;
        }
    }

    gm_bn_copy(r, t);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 单元测试

main函数增加:

TEST_BN_ALG("gmp_exp",
            "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",
            "9DDD52AF95B748A553D1B1E106627F901CD453F067A0D50202C672130C90F607",
            "161F67FA7D66D931B1B743EFA1E66F141324C3A3AF7C5A32D124007AF44BEABA");

TEST_BN_ALG("gmn_exp",
            "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",
            "9DDD52AF95B748A553D1B1E106627F901CD453F067A0D50202C672130C90F607",
            "F0A72A00F0DB40E177BF56EE177EC88D11BD928AE097973060CFDBDFDDB04146");
1
2
3
4
5
6
7
8
9

test_bn函数增加:

else if(strcmp(alg, "exp") == 0){ // 1万
    gm_bn_to_mont(bnr, bna, m);
    for (i = 0; i < 10000; i++) {
        gm_bn_exp(bnr, bnr, bnb, m);
    }
    gm_bn_from_mont(bnr, bnr, m);
}
1
2
3
4
5
6
7

算法效率:

saintdeMacBook-Pro:bn saint$ time ./a.out gmp_exp
r = 161F67FA7D66D931B1B743EFA1E66F141324C3A3AF7C5A32D124007AF44BEABA
test result: ok

real	0m4.949s
user	0m4.699s
sys	0m0.053s
saintdeMacBook-Pro:bn saint$ time ./a.out gmn_exp
r = F0A72A00F0DB40E177BF56EE177EC88D11BD928AE097973060CFDBDFDDB04146
test result: ok

real	0m4.775s
user	0m4.615s
sys	0m0.040s
1
2
3
4
5
6
7
8
9
10
11
12
13
14