《RELIC庫學習》
瞭解
RELIC是由Diego F. Aranha開發的高效、靈活的開源密碼原語工具箱,包含多精度整數運算、有限域(包含素數域和二元域)運算、橢圓曲線、雙線性映射和擴域運算、密碼協議(如RSA、Rabin、ECDSA、BLS短簽名、BB短簽名、Paillier同態加密方案等),支持不同安全等級、多種優化實現方法和多平臺運行,在學術界和工業界均得到了廣泛應用。
只依賴於GMP庫
2022年11月7日,武漢大學密碼學與區塊鏈技術實驗室向開源項目RELIC貢獻了國密算法代碼。
具體貢獻:
- 增加了該項目對SM2橢圓曲線參數的支持
- 修正了SM9算法參數下雙線性映射的實現代碼
實驗結果:
配置64位Ubuntu操作系統、Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz、14GB內存的主機上,基於GMP庫,使用RELIC實現SM2/9算法中核心運算的性能如下:
以上是SM2和SM9的測試結果。
安裝
環境:Centos7
依賴:安裝GMP庫,參考:https://www.cnblogs.com/pam-sh/p/16750646.html
git clone https://github.com/relic-toolkit/relic.git
cd relic
mkdir build
cd build
cmake ..
make
測試
測試:demo/psi-client-server
- Added several laconic Private Set Intersection (PSI) protocols from https://eprint.iacr.org/2022/529
# 修改makefile文件
make
./receiver
./sender
測試:paillier算法(demo/general-paillier)
static int paillier(void) {
int code = RLC_ERR;
bn_t a, b, c, d, s, pub, prv;
int result;
bn_null(a);
bn_null(b);
bn_null(c);
bn_null(d);
bn_null(pub);
bn_null(prv);
RLC_TRY {
bn_new(a);
bn_new(b);
bn_new(c);
bn_new(d);
bn_new(pub);
bn_new(prv);
/* Generate 2048-bit public and private keys (both integers). */
result = cp_ghpe_gen(pub, prv, 2048);
assert(result == RLC_OK);
printf("Public key:\n");
bn_print(pub);
printf("Private key:\n");
bn_print(prv);
for (int s = 1; s <= 2; s++) {
util_print("Testing generalized paillier for (s = %d)\n", s);
// 加解密測試
/* Generate plaintext smaller than n^s. */
bn_rand(a, RLC_POS, s * (bn_bits(pub) - 1)); //明文隨機數a
/* Encrypt, decrypt and check if the result is the same. */
assert(cp_ghpe_enc(c, a, pub, s) == RLC_OK); //密文c
assert(cp_ghpe_dec(b, c, pub, prv, s) == RLC_OK); //解密測試b
assert(bn_cmp(a, b) == RLC_EQ);
//同態性測試:Dec(c*d)=a+b
/* Generate new plaintexts smaller than n^s. */
bn_rand(a, RLC_POS, s * (bn_bits(pub) - 1)); //明文a
bn_rand(b, RLC_POS, s * (bn_bits(pub) - 1)); //明文b
/* Encrypt both plaintexts using the same public key. */
assert(cp_ghpe_enc(c, a, pub, s) == RLC_OK); //密文c
assert(cp_ghpe_enc(d, b, pub, s) == RLC_OK); //密文d
/* Now compute c = (d * c) mod n^(s + 1). */
bn_mul(c, c, d);
bn_sqr(d, pub);
if (s == 2) {
bn_mul(d, d, pub);
}
bn_mod(c, c, d);
/* Decrypt and check if result is (a + b) mod n^s. */
assert(cp_ghpe_dec(c, c, pub, prv, s) == RLC_OK);
bn_add(a, a, b);
bn_copy(d, pub);
if (s == 2) {
bn_mul(d, d, pub);
}
bn_mod(a, a, d);
assert(bn_cmp(a, c) == RLC_EQ);
}
}
RLC_CATCH_ANY {
RLC_ERROR(end);
}
code = RLC_OK;
end:
bn_free(a);
bn_free(b);
bn_free(c);
bn_free(d);
bn_free(prv);
bn_free(pub);
return code;
}