博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
openssl实现md5加rsa签名
阅读量:4250 次
发布时间:2019-05-26

本文共 2234 字,大约阅读时间需要 7 分钟。

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 
*= RSA_new();
    r
->= bnn;
    r
->= bne;
    r
->= 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, inout, 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[] = {
0x980x790xb20x76}
;
    unsigned 
char *out;
    bnn 
= BN_new();
    bne 
= BN_new();
    BN_hex2bn(
&bnn, MODULUS);
    BN_set_word(bne, PUBLIC_EXPONENT);
    RSA 
*= RSA_new();
    r
->= bnn;
    r
->= 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), inout, 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;
}
你可能感兴趣的文章
多线程——java线程池简介
查看>>
多线程——Java线程池原理深入
查看>>
多线程——并发锁的集结号
查看>>
JVM——深入解析之初识
查看>>
JVM——深入解析原理和运行机制(一)类加载过程
查看>>
JVM——深入解析原理和运行机制(一)类加载器
查看>>
VB与flash的交互
查看>>
番茄工作法
查看>>
SQL Server 错误:18456。用户“sa”登录失败
查看>>
SQL Server 2008阻止保存要求重新创建表的更改的解决
查看>>
学生信息管理系统之数据库远程使用
查看>>
如何做一名优秀的程序员
查看>>
【C++】C++11新增关键字详解
查看>>
【Ubuntu】VirtualBox显卡驱动VBoxVGA、VBoxSVGA、VMSVGA +3D对播放视频的影响
查看>>
【Gstreamer】在虚拟机中无法使用硬件加速:gstreamer1.0-vaapi
查看>>
免费图标查询、下载的网站
查看>>
【经验】Lenovo/ThinkPad 进入BIOS的方法汇总
查看>>
【Qt】QPixmap加载图片报错:Corrupt JPEG data: premature end of data segment Didn't expect more than one scan
查看>>
【Ubuntu】ubuntu设置GUI程序自启动
查看>>
【Ubuntu】ping: unknown host www.baidu.com
查看>>