常见问题常见问题   搜索搜索   会员列表会员列表   团队团队   注册注册    个人资料个人资料   登录查看您的站内信件登录查看您的站内信件   登录登录 

使用RSAEuro实现RSA密码算法

 
发表新文章   这个论题已经被锁定,您不能发表、回复或者编辑文章。    FreeBSD China -> 中文-桌面-开发-调试
阅读上一个主题 :: 阅读下一个主题  
作者 留言
ccba
半仙


注册时间: 2003-01-13
文章: 10

文章发表于: Tue 2002-12-31 12:47:09    发表主题: 使用RSAEuro实现RSA密码算法 引用并回复

涉足计算机行业的人或多或少都用过或听说过密码算法,但真正自己动手实现密码算法的并不多,往往是借用比较成熟的软件包来实现。本文推荐一种比较优秀的软件包RSAEuro,利用它可以轻松完成RSA共钥算法。

1.什么是RSA算法

RSA算法是世界上最流行的公钥算法之一。(至于什么是密码算法,什么是公钥算法请参见相关参考书,推荐《应用密码学》)由三位设计者Ron Rivest、Adi Shamir 和 Leonard Adelman姓名的首字母命名。该算法的设计思想是:“用两个很大的质数,p 和 q,计算它们的乘积 n = pq;n 是模数。选择一个比 n 小的数 e,它与 (p - 1)(q - 1) 互为质数,即,除了 1 以外,e 和 (p - 1)(q - 1) 没有其它的公因数。找到另一个数 d,使 (ed - 1) 能被 (p - 1)(q - 1) 整除。值 e 和 d 分别称为公共指数和私有指数。公钥是这一对数 (n, e);私钥是这一对数 (n, d)。”。该算法设计以来,由于其设计思路明晰,破解困难,可以用于加密和数字签名等优点,被广泛流传使用。2000年9月RSA公司宣布放弃RSA公钥密码算法的专利权,允许任何人采用该算法加强自己的安全系统。RSA算法得到更广泛的使用。

2.什么是RSAEuro

RSAEuro是由Reaper Technologies公司开发出来的C/C++的加密工具包,它完全兼容RSA security公司的RSAREF工具包,并进行了一些扩展。它有Internet和商业两个发布版本,Internet发布版本实现了RSA加密解密和密钥对生成(遵守PKCS#1)、MD2/MD4/SHS摘要、CBC模式的DES加密解密、遵守PKCS#3的Diffie-Hellman密钥约定、PEM支持(RFC1421)等等,商业版还包括更多的算法支持,如SHA-A/PEMD-160/PEMD-128摘要、CBC模式的Blowfish密码算法和MAC算法的支持。本文中介绍的算法Internet Release就可以实现。可以到http://www.reapertech.com/products/RSAEuro/或http://cosoft.org.cn上直接下载。

3.代码实现

3.1.私钥加密公钥解密:主要用于数字签名技术,签名方使用其私钥加密后,可以采用公钥验证,保证数字信息的有效性和不可抵赖性。

//filename: RSAExample1.c

#include “rsaeuro.h”

#include “rsa.h”

int main(int argc , char *argv[])

{

R_RSA_PUBLIC_KEY publicKey;

R_RSA_PRIVATE_KEY privateKey;

char demostring[] = "Test string for RSA functions #1";

char encryptedString[MAX_RSA_MODULUS_LEN+2];

char decryptedString[256];

int status, encryptedLength, decryptedLength;

/* 生成密钥对 */

KeyGenExampl e(&publicKey, &privateKey);

/* 私钥加密 */

status = RSAPrivateEncrypt(encryptedString, &encryptedLength, demostring,

strlen(demostring), &privateKey);

if (status)

{

printf("RSAPrivateEncrypt failed with %x\n", status);

return;

}

/* 公钥解密 */

status = RSAPublicDecrypt(decryptedString, &decryptedLength, encryptedString,encryptedLength, &publicKey);

if (status)

{

printf("RSAPublicDecrypt failed with %x\n", status);

return;

}

/* Display decrypted string */

decryptedString[decryptedLength+1] = (char) "\0";

printf("Decrypted string: %s\n", decryptedString);

return 0;

}

3.2.公钥加密私钥解密:主要用于需要高强度加密的场合,例如SSL系统中对称密码算法密钥交换往往采用RSA算法进行加密。

//filename: RSAExample2.c

#include “rsaeuro.h”

#include “rsa.h”

int main(int argc , char *argv[])

{

R_RANDOM_STRUCT randomStruct;

R_RSA_PUBLIC_KEY publicKey;

R_RSA_PRIVATE_KEY privateKey;

char demostring[] = "Test string for RSA functions #2";

char encryptedString[MAX_RSA_MODULUS_LEN+2];

char decryptedString[256];

int status, encryptedLength, decryptedLength;

/* 生成密钥对 */

KeyGenExample(&publicKey, &privateKey);

/* Initialise Random structure */

R_RandomCreate(&randomStruct);

/* 公钥加密 */

status = RSAPublicEncrypt(encryptedString, &encryptedLength, demostring,

strlen(demostring), &publicKey, &randomStruct);

if (status)

{

printf("RSAPublicEncrypt failed with %x\n", status);

return;

}

/* 私钥解密 */

status = RSAPrivateDecrypt(decryptedString, &decryptedLength,

encryptedString, encryptedLength, &privateKey);

if (status)

{

printf("RSAPrivateDecrypt failed with %x\n", status);

return;

}

/* Display decryp ted string */

decryptedString[decryptedLength+1] = (char) "\0";

printf("Decrypted string: %s\n", decryptedString);

return 0;

}

以上程序笔者在HP-UX 11i和Linux下调试运行无误。值得注意的是,可以设定RSA密钥长度,RSAEuro支持512-2048位密钥,可以提供足够的安全保障。但是密钥长度会影响密钥对生成速度和加密/解密速度。对于一般密级的数据768位密钥长度已经足够。RSA算法设计者之一Adi Shamir今年5月份也表示“虽然传言1024位的RSA密码会立刻被攻破,但是这种事情绝不会发生的。目前1024位就已经足够了”。在某些安全性要求极高的场合下可以采用2048位密钥,不过运行速度就要大打折扣了――其实作为一个安全系统,密码算法往往并不是瓶颈,不是吗?



参考资料:

RSAEuro Technical Reference Reference by Nick Barron
返回页首
阅览会员资料 发送站内信件
yangjiok
游客





文章发表于: Sat 2003-10-04 23:13:20    发表主题: KeyGenExample 没声明 引用并回复

KeyGenExample 没声明
怎么用牙??
谢谢
返回页首
lbblscy
半仙


注册时间: 2007-04-15
文章: 32

文章发表于: Wed 2007-05-23 18:30:35    发表主题: 引用并回复

先收下了
返回页首
阅览会员资料 发送站内信件
arust
半仙


注册时间: 2007-01-24
文章: 121

文章发表于: Mon 2007-10-22 10:42:32    发表主题: 引用并回复

不错的东西,先收藏了
_________________
洞庭之南,潇湘之浦
返回页首
阅览会员资料 发送站内信件
pinefor
半仙


注册时间: 2008-02-02
文章: 8

文章发表于: Sat 2008-02-02 13:56:44    发表主题: rsaeuro使用说明 引用并回复

以前在FreeBSD下用过rsaeuro,且将其移到了内核,发现的问题如下:
1. 不能用R_RandomInit初始化随机数结构,导致每次产生的公私钥均相同,应该用R_RandomCreate,且应该修改其实现,我当时好像时修改了时间函数;
2. 效率低下;
3. 实现好像有问题,补齐的11个字节不具备验证功能,应该可以随意修改,这一点没有验证过。

_________________
人活着最怕的就是没有希望
返回页首
阅览会员资料 发送站内信件 发送电子邮件
yjxa249
半仙


注册时间: 2008-07-24
文章: 1

文章发表于: Thu 2008-07-24 13:36:10    发表主题: KeyGenExampl e(&publicKey, &privateKey); 引用并回复

KeyGenExampl e(&publicKey, &privateKey);
这个函数没有定义啊
返回页首
阅览会员资料 发送站内信件
从以前的文章开始显示:   
发表新文章   这个论题已经被锁定,您不能发表、回复或者编辑文章。    FreeBSD China -> 中文-桌面-开发-调试 论坛时间为 北京时间
1页/共1

 
转跳到:  
不能发布新主题
不能在这个论坛回复主题
不能在这个论坛编辑自己的文章
不能在这个论坛删除自己的文章
不能在这个论坛发表投票


Powered by phpBB 2023cc © 2003 Opensource Steps; © 2003-2009 The FreeBSD Simplified Chinese Project
Powered by phpBB © 2001, 2005 phpBB Group
Protected by Project Honey Pot and phpBB.cc
silvery-trainer
The FreeBSD China Project 网站: 中文计划网站 社区网站
The FreeBSD China Project 版权所有 (C) 1999 - 2003 网页设计版权 著作权和商标