我正在编写一个使用Paillier Cryptosystem加密矩阵的程序。要加密50 x 50矩阵,大约需要12秒!考虑到我打算加密大小为5000 x 5000及以上的矩阵,这很痛苦。在Xcode上分析程序我发现这个paillier_get_rand_devurandom()是罪魁祸首。
这是呼叫追踪快照:
这是此特定Paillier C库函数的源代码
void paillier_get_rand_devurandom( void* buf, int len )
{
paillier_get_rand_file(buf, len, "/dev/urandom");
}
void paillier_get_rand_file( void* buf, int len, char* file )
{
FILE* fp;
void* p;
fp = fopen(file, "r");
p = buf;
while( len )
{
size_t s;
s = fread(p, 1, len, fp);
p += s;
len -= s;
}
fclose(fp);
}
以防万一,
<http://www.en.wikipedia.org/wiki/Paillier_cryptosystem>
Paillier Cryptosytem C library : <http://acsc.cs.utexas.edu/libpaillier/>
我已经读过使用dev / random的随机数生成很慢而使用dev / urandom则更快。 在我的情况下,两者都同样缓慢。 这个随机数生成能否更快?
编辑: 这是一个例子
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
#include<paillier.h>
int main(void)
{
paillier_pubkey_t* pub;//The public key
paillier_prvkey_t* prv;//The private key
paillier_keygen(1024, &pub, &prv,paillier_get_rand_devurandom);
paillier_ciphertext_t* ca;
paillier_ciphertext_t* cb;
paillier_ciphertext_t* res;
paillier_plaintext_t* a;
paillier_plaintext_t* b;
paillier_plaintext_t* sum;
a=paillier_plaintext_from_ui(45);
b=paillier_plaintext_from_ui(100);
//This is the encryption function
ca=paillier_enc(0, pub, a, paillier_get_rand_devurandom);
cb=paillier_enc(0, pub, b, paillier_get_rand_devurandom);
res=paillier_create_enc_zero();
paillier_mul(pub, res,ca, cb);
sum=paillier_dec(0, pub, prv, res);
gmp_printf("The sum is : %Zd\n",sum);
return 0;
}
这是加密函数签名
/*
Encrypt the given plaintext with the given public key using
randomness from get_rand for blinding. If res is not null, its
contents will be overwritten with the result. Otherwise, a new
paillier_ciphertext_t will be allocated and returned.
*/
paillier_ciphertext_t* paillier_enc( paillier_ciphertext_t* res,
paillier_pubkey_t* pub,
paillier_plaintext_t* pt,
paillier_get_rand_t get_rand );
对不起,这个问题只会越来越长
The actual scale_encrypt_T()
void scale_encrypt_T(char *scaledTfile)
{
...
...
//Printing scaled and then encrypted T[][] in a file
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
void *buf2;
//T[][] is the 50 x 50 matrix
temp=(int)(T[i][j]*pow(10,6)); //Scale factor q = 10 to the power of 6
p0=paillier_plaintext_from_ui(temp);
//c0 is the cipher text
/***So this is where its taking so long***/
c0=paillier_enc(0, pub, p0, paillier_get_rand_devurandom);
buf2=paillier_ciphertext_to_bytes(PAILLIER_BITS_TO_BYTES(pub->bits)*2, c0);
fwrite(buf2, 1, PAILLIER_BITS_TO_BYTES(pub->bits)*2, fpt);
free(buf2);
}
}
答案 0 :(得分:1)
假设n
为50,您的代码正在执行2500次单独加密。每次加密都可能需要一些随机数据。
通过在一次调用paillier_enc
中加密整个数组来进行一次加密会更有效率。我不熟悉libpaillier API,但看起来你会通过安排50-by-50数组的所有数据在连续的内存中来做到这一点,然后使用paillier_plaintext_from_bytes
将整个数组打包到一个paillier_plaintext_t
对象,然后对该对象使用pallier_enc
。