首页
社区
课程
招聘
openssl 库的RSA算法问题
发表于: 2011-8-19 20:17 8750

openssl 库的RSA算法问题

2011-8-19 20:17
8750
在网上找到一篇介绍openssl库的RSA算法的文章,这里给出连接
http://www.cnblogs.com/nadoo/archive/2008/03/14/1105991.html
编译了一下  感觉良好  可以用。
[关于如何编译openssl代码 请参考 http://hi.baidu.com/blueapple_c/blog/item/d73cab2bf5191e3ad52af17a.html]

后来我把 unsigned char *in = "abc"; 修改为 unsigned char *in = "我";
发现RSA_private_encrypt会返回 -1 ,这是为什么
求达人解释  小弟感激不尽。

代码:
加密
/*
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;
}


编译openssl的方法
0.安装ActivePerl-5.12.3.1204并重启电脑(下载地址 http://bjkdt.newhua.com/down/ActivePerl-5.12.3.1204-MSWin32-x86-294330.zip)
1. 解压openssl-0.9.8r.tar.gz到D:\openssl-0.9.8r
2.在cmd中进入D:\openssl-0.9.8r目录 然后执行perl Configure VC-WIN32
3.执行ms\do_ms
4.进入vc6的bin目录 我的电脑上是 D:\Program files\Microsoft Visual Studio\VC98\Bin
5.执行vcvars32
6.进入D:\openssl-0.9.8r
7.编译动态库:
nmake -f ms\ntdll.mak
编译静态库:
nmake -f ms\nt.mak

测试动态库:
nmake -f ms\ntdll.mak test
测试静态库:
nmake -f ms\nt.mak test
安装动态库:
nmake -f ms\ntdll.mak install
安装静态库:
nmake -f ms\nt.mak install

/如果没编译成功*****
清除上次动态库的编译,以便重新编译:
nmake -f ms\ntdll.mak clean
清除上次静态库的编译,以便重新编译:
nmake -f ms\nt.mak clean
8.如果成功了  d盘根目录下会生成一个usr文件夹, 里面的第n层包含了 bin lib include文件夹

然后 配置一下 vc6的目录  3项  就ok啦

然后随便做个测试程序    测试一下

#include <stdio.h>
#include <string.h>
#include <openssl/rc4.h>

#pragma comment(lib, "libeay32.lib")

int main(int argc, char *argv[])
{
    RC4_KEY key;
    char szHello[16] = {"hello ~~!\n"};
    char szTemp[16] = {0};

    RC4_set_key(&key, 16, (unsigned char *)"1234567890123456");

    RC4(&key, 16,(unsigned char *)szHello, (unsigned char *)szTemp);

    memset(szHello, 0, 16);
    RC4_set_key(&key, 16, (unsigned char *)"1234567890123456");

    RC4(&key, 16,(unsigned char *)szTemp, (unsigned char *)szHello);
    printf(szHello);
    return 0;
}

后话:请严格按照本篇文章给出的顺序进行,本人亲测3台电脑都没有问题。 编译后的 include lib bin 可用于VS2008使用。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

应该是中文字符问题。

你可以在报错后,调用ERR_get_error()  来获取错误信息,详细的可以参考下面的链接~

http://www.openssl.org/docs/crypto/ERR_get_error.html#
2011-8-19 21:15
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
问题已经解决啦,  参考自《战争中的数学——军事密码学》 我截个图给大家看一下哈。
所以如果使用RSA加密一段数据,最好把第一个字节清零,以免发生密文比公钥大从而导致加密失败。
散分啦。。。欢迎友情接分。。。
上传的附件:
2011-8-20 11:11
0
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
4
友情接分
2011-8-20 11:13
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
有漏得分么?
2011-8-20 19:46
0
雪    币: 7992
活跃值: (2566)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
闻风而来,友情接分。
2011-8-20 20:21
0
雪    币: 333
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
谢谢分享

mark:openssl
2011-8-20 20:29
0
雪    币: 76
活跃值: (206)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
8
谢谢分享

mark:openssl
2013-2-28 12:54
0
雪    币: 62
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
这是所有RSA都会出现的问题,但通常并不影响使用;RSA的消息填充规则可以保证消息值小于模数N.
2013-2-28 16:51
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
还能接到分不?楼主的帖子确实不错。
2014-1-20 14:10
0
游客
登录 | 注册 方可回帖
返回
//