牛骨文教育服务平台(让学习变的简单)
博文笔记

openssl实现md5加rsa签名

创建时间:2011-09-01 投稿人: 浏览次数:3378

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;
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。