RSA 的安全性
RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解 RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前, RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解多个十进制位的大素数。因此,模数n 必须选大一些,因具体适用情况而定。
针对RSA最流行的攻击一般是基于大数因数分解。1999年,RSA-155(512 bits)被成功分解,花了五个月时间(约8000 MIPS 年)和224 CPU hours 在一台有3.2G中央内存的Cray
C916计算机上完成 。
2002年,RSA-158也被成功因数分解。
2009年12月12日,编号为 RSA-768 (768 bits, 232 digits)数也被成功分解。
通常签名都是对明文做md5摘要再对摘要用rsa私钥加密,对方得到签名后用rsa公钥解密,再用明文做md5摘要,最后对比解密的结果和摘要结果是否一致
openssl是个强大的工具集,使用起来方便。

/*

gcc -o rsa-encrypt rsa-encrypt.c -lcrypto

*/

#include <openssl/rsa.h>

#include <openssl/err.h>


#define MODULUS "C8FBCF21"

#define PUBLIC_EXPONENT RSA_F4

#define PRIVATE_EXPONENT "97B55D7D"


int main()

{

int ret, flen;

BIGNUM *bnn, *bne, *bnd;

unsigned char *in = "abc";

unsigned char *out;


bnn = BN_new();

bne = BN_new();

bnd = BN_new();

BN_hex2bn(&bnn, MODULUS);

BN_set_word(bne, PUBLIC_EXPONENT);

BN_hex2bn(&bnd, PRIVATE_EXPONENT);


RSA *r = RSA_new();

r->n = bnn;

r->e = bne;

r->d = bnd;

RSA_print_fp(stdout, r, 5);


flen = RSA_size(r);// - 11;

out = (char *)malloc(flen);

bzero(out, flen);

//memset(out, 0, flen);


printf("Begin encrypt... ");

ret = RSA_private_encrypt(flen, in, out, r, RSA_NO_PADDING);

if (ret < 0)

{

printf("Encrypt failed! ");

return 1;

}


printf("Size:%d ", ret);

printf("ClearText:%s ", in);

printf("CipherText(Hex):");

int i;

for (i=0; i<ret; i++)

{

printf("0x%02x, ", *out);

out++;

}

printf(" ");


//free(out);

RSA_free(r);

return 0;

}
解密:

/*

gcc -o rsa-decrypt rsa-decrypt.c -lcrypto

*/

#include <openssl/rsa.h>


#define MODULUS "C8FBCF21"

#define PUBLIC_EXPONENT RSA_F4

#define PRIVATE_EXPONENT "97B55D7D"


int main()

{

int ret, flen;

BIGNUM *bnn, *bne;

unsigned char in[] = {0x98, 0x79, 0xb2, 0x76};

unsigned char *out;


bnn = BN_new();

bne = BN_new();

BN_hex2bn(&bnn, MODULUS);

BN_set_word(bne, PUBLIC_EXPONENT);


RSA *r = RSA_new();

r->n = bnn;

r->e = bne;

RSA_print_fp(stdout, r, 5);


flen = RSA_size(r);

out = (unsigned char *)malloc(flen);

bzero(out, flen);


printf("Begin decrypt... ");

ret = RSA_public_decrypt(sizeof(in), in, out, r, RSA_NO_PADDING);

if (ret < 0)

{

printf("Decrypt failed! ");

return 1;

}


printf("Size:%d ", ret);

printf("ClearText:%s ", out);


free(out);

RSA_free(r);

return 0;

}