本文共 2234 字,大约阅读时间需要 7 分钟。
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摘要,最后对比解密的结果和摘要结果是否一致 /* 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; }