RSArsa私钥加密公钥解密密

co63 的BLOG
用户名:co63
文章数:82
访问量:161559
注册日期:
阅读量:24883
阅读量:267490
阅读量:1001860
阅读量:150705
[匿名]tw:
51CTO推荐博文
公钥加密,私钥解密时,因为加入随机数,每次得到的加密信息不固定。
私钥加密,公钥解密时,得到的加密信息固定。
#include&&stdio.h&&#include&&string.h&&#include&&openssl/crypto.h&&#include&&openssl/err.h&&#include&&openssl/rand.h&&#include&&openssl/bn.h&&#include&&openssl/rsa.h&&#include&&openssl/pem.h&&&#define&SetKey&\&&&&&key-&n&=&BN_bin2bn(n,&sizeof(n)-1,&key-&n);&\&key-&e&=&BN_bin2bn(e,&sizeof(e)-1,&key-&e);&\&key-&d&=&BN_bin2bn(d,&sizeof(d)-1,&key-&d);&\&key-&p&=&BN_bin2bn(p,&sizeof(p)-1,&key-&p);&\&key-&q&=&BN_bin2bn(q,&sizeof(q)-1,&key-&q);&\&key-&dmp1&=&BN_bin2bn(dmp1,&sizeof(dmp1)-1,&key-&dmp1);&\&key-&dmq1&=&BN_bin2bn(dmq1,&sizeof(dmq1)-1,&key-&dmq1);&\&key-&iqmp&=&BN_bin2bn(iqmp,&sizeof(iqmp)-1,&key-&iqmp);&\&return&0;&&static&int&key5(RSA&*key)&{&&&&&&&&&&static&unsigned&char&n[]&=&&&&&&&&&&\x9c\xb5\xd4\x87\x70\xb6\x43\x03\x49\x5e\xe8\x40\xbc\xbf\x15\x79\x9e\xb2\x18\x0d\xfa\xde\xf7\xb2\x37\xd0\x22\xdb\xd4\xef\x2d\x79\x63\xdb\x38\x2b\xed\x05\xe5\x14\x0b\x9a\x80\x5c\x75\x11\xef\x1b\x89\x5b\x40\xb7\x1c\x22\x7d\x84\x59\xbc\xcc\xb5\xca\x63\xbd\x7b\xdf\x1e\x3a\x72\x13\x86\x93\xa9\x9c\xc7\xcb\x48\x3d\x8b\x8c\xa9\x4c\xce\xd7\xca\xc0\xb0\x62\x7a\x95\x7a\xd7\xbd\x27\x82\x91\x40\x90\x35\xb1\xe4\xab\x5f\xbb\x06\x29\x01\xf4\x91\xe5\x15\x5f\xd3\xc2\x13\x38\xaf\x1f\x75\x88\x47\xd1\x04\xd2\xb3\x71\xa0\x9e\xc7&;&&&&&&static&unsigned&char&e[]&=&&\x00\x01\x00\x01&;&&&&&&static&unsigned&char&d[]&=&&&&&&&&&&\x09\x33\x83\xef\x0f\xe7\x23\xb8\x25\xae\xb4\xe4\x58\x30\xc0\x0a\x0c\x0f\x58\xea\x39\x38\xae\x42\x80\x94\x6f\xf7\x88\x61\x22\xc2\x65\xe2\x91\x41\xc3\x00\xfd\x9a\x57\xb4\x12\xa5\x5b\x1a\x5a\x77\xbb\x70\xe8\x33\xd8\x2b\x0e\x43\x9f\x21\x3e\xc3\xcd\xc6\x5d\x71\xb8\xec\x6e\xea\x5f\x17\xa5\xe1\x43\xeb\xdd\x71\xa4\x6f\xed\x09\xf0\x8b\xbe\xd9\x26\xb5\x70\x9b\xab\x42\x70\x70\x71\xd4\x14\x8f\xa8\x2c\xc4\x23\x21\x70\x1f\xd7\xef\xfd\x6b\x02\x40\x8b\xf4\x77\x5c\x78\x08\x80\x8b\x7d\x7e\x7a\xb2\x14\xe0\xf6\x94\xf2\x56\x81&;&&&&&&static&unsigned&char&p[]&=&&&&&&&&&&\xd6\x8c\xf3\x60\x76\x5b\x6e\x55\xde\x5a\xf7\x43\x95\x6b\x5e\xc0\xd9\x5a\xcd\xd8\x03\xd3\x65\xcb\x1d\xf6\xfe\x57\x39\x6c\xfd\x72\x06\x8b\xe8\x2e\x05\xfd\xe4\x7c\x39\x94\xa2\xea\xb8\x4c\xf5\xd6\xdc\xd7\x9a\xb8\xef\x05\xd9\xef\x96\xfa\x91\xa3\xb6\x9a\xd4\x19&;&&&&&&static&unsigned&char&q[]&=&&&&&&&&&&\xba\xfc\x43\xf4\x79\x60\x09\x97\x37\x6e\x55\x83\xbb\xb6\xb3\x5f\x4c\x39\x00\x93\x19\x90\x64\x65\x3a\xf7\xa0\xca\x5e\x9d\x66\xd9\xee\x7d\xdb\xd0\xe2\xe7\x57\x55\x41\x90\xc7\x4b\xed\x91\x42\xea\x34\x93\x1a\x76\xb8\xd0\xf2\x74\xed\xf5\xd3\xb9\xa6\x34\x65\xdf&;&&&&&&static&unsigned&char&dmp1[]&=&&&&&&&&&&\x4f\xfd\x89\x17\xa3\xc8\xfe\xe0\x00\xe0\xc5\x63\x6b\x27\xf6\xd1\xcb\xb7\xb1\x1b\x22\x82\x04\x67\xb0\x2a\x50\x35\x50\xf1\xb3\xa4\x79\x90\x5b\xe6\x1c\xd1\xc6\x08\x12\xa7\xb9\xfd\xec\xec\xb4\x93\x81\x0e\xd9\x5e\xad\xae\xee\xcc\x06\xec\x30\xb4\x6a\xf6\x5a\xb1&;&&&&&&static&unsigned&char&dmq1[]&=&&&&&&&&&&\x60\x9b\x5d\x70\xbe\x15\x04\x5f\x80\x60\x1d\x06\x86\xc1\x8a\x43\x3e\x5a\x65\x15\x9b\x2b\xa2\xf3\x3a\x58\x1e\x56\xf0\x33\x5a\xa4\x56\x37\xe8\x8e\x2f\xed\x5e\x8d\xc9\xe6\x47\x51\xcf\x58\x31\xbe\x57\x93\x79\x24\xc5\xb0\x0e\xd4\xa2\xed\x53\x8a\xa3\x78\x86\xf9&;&&&&&&static&unsigned&char&iqmp[]&=&&&&&&&&&&\x28\xc6\xca\x44\x40\x7a\xad\x4c\x74\x4d\xeb\x2d\xaa\xd7\xc8\x43\xef\x4a\x12\x44\x0a\x89\xb8\x12\x11\x7f\x40\x91\x9a\xe1\x4a\xfe\xe2\xe5\x3e\x6c\x7f\x07\x49\x04\xc9\x95\x8a\x4e\xa5\x7f\x3c\x8f\xea\xbd\x71\x2e\xca\x7a\x37\xdf\x99\x05\x2f\x0c\x03\x11\x6d\x5d&;&&&&&&SetK&}&&int&main(int&argc,&char&*argv[])&{&&&&&int&err&=&0;&&&&&int&v;&&&&&RSA&*&&&&&unsigned&char&ptext[256];&&&&&unsigned&char&ctext[256];&&&&&static&unsigned&char&ptext_ex[]&=&&&;&&&&&unsigned&char&ctext_ex[256];&&&&&int&&&&&&int&clen&=&0;&&&&&int&&&&&&int&n;&&&&&int&i;&&&&&EVP_PKEY&*&&&&&&printf(&ptext_ex:&%s\n&,&ptext_ex);&&&&&{&&&&&&&&&key&=&RSA_new();&&&&&&&&&key5(key);&&&&&&&&&&plen&=&sizeof(ptext_ex)&-&1;&&&&&&&&&num&=&RSA_private_encrypt(plen,&ptext_ex,&ctext,&key,&&&&&&&&&&&&&&&&&RSA_PKCS1_PADDING);&&&&&&&&&if&(num&!=&128)&&&&&&&&&&&&{&&&&&&&&&&&&&printf(&PKCS#1&v1.5&encryption&failed!\n&);&&&&&&&&&&&&&err=1;&&&&&&&&&&&&&goto&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&printf(&encrypted&text:&\n&);&&&&&&&&&for&(i&=&0;&i&&&&i++)&&&&&&&&&{&&&&&&&&&&&&&printf(&\\x%02x&,&ctext[i]);&&&&&&&&&}&&&&&&&&&printf(&\n&);&&&&&&&&&&printf(&RSA_private_encrypt&num:&%d\n&,&num);&&&&&&&&&&num&=&RSA_public_decrypt(num,&ctext,&ptext,&key,&&&&&&&&&&&&&&&&&RSA_PKCS1_PADDING);&&&&&&&&&if&(num&!=&plen&||&memcmp(ptext,&ptext_ex,&num)&!=&0)&&&&&&&&&{&&&&&&&&&&&&&printf(&PKCS#1&v1.5&decryption&failed!\n&);&&&&&&&&&&&&&err=1;&&&&&&&&&}&&&&&&&&&else&&&&&&&&&&&&&printf(&PKCS&#1&v1.5&encryption/decryption&ok\n&);&&&&&&&&&&printf(&RSA_public_decrypt&num:&%d\n&,&num);&&&&&&&&&ptext[num]&=&'\0';&&&&&&&&&&&&&printf(&ptext:&%s\n&,&ptext);&&next:&&&&&&&&&&&&&&&&&&PEM_write_RSAPrivateKey(stdout,&key,&NULL,&NULL,&0,&NULL,&NULL);&&&&&&&&&PEM_write_RSAPublicKey(stdout,&key);&&&&&&&&&&&&&&&&&&&RSA_free(key);&&&&&}&&&&&&if&(err)&printf(&ERROR:&%d\n&,&err);&&&&&return&&}&
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)RSA密钥长度、明文长度和密文长度
本文整理RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题知识,对第一次接触RSA的开发人员来说,RSA算是比较复杂的算法,以后还会补充几篇RSA基础知识专题文章,用最简单最通俗的语言描述RSA,既方便自己温习,也方便各位新入门的朋友参考,其实RSA算法应用也很简单,RSA的复杂度是因为数学家把效率和安全也考虑进去的缘故。
本文先只谈密钥长度、明文长度和密文长度的概念知识,RSA的理论及示例等以后再谈。提到密钥,我们不得不提到RSA的三个重要大数:公钥指数e、私钥指数d和模值n。这三个大数是我们使用RSA时需要直接接触的,理解了本文的基础概念,即使未接触过RSA的开发人员也能应对自如的使用RSA相关函数库,无需深入了解e、d、n是如何生成的,只需要知道我该如何用、要注意什么。
一、密钥长度
1、密钥是指谁?
首先我们说的&密钥&是指谁?由于RSA密钥是(公钥+模值)、(私钥+模值)分组分发的,单独给对方一个公钥或私钥是没有任何用处,所以我们说的&密钥&其实是它们两者中的其中一组。但我们说的&密钥长度&一般只是指模值的位长度。目前主流可选值:、...
2、模值主流长度是多少?
目前主流密钥长度至少都是1024bits以上,低于1024bit的密钥已经不建议使用(安全问题)。那么上限在哪里?没有上限,多大都可以使用。所以,主流的模值是1024位,实际运算结果可能会略小于1024bits,注意,这个值不是绝对的,跟素数的生成算法有关系,只是告诉素数生成器&帮我生成一个接近1024位的素数而已&,然后生成器&好,给您一个,这个差不多1024位&。
素数生成器这么厉害?说生成1024位就会出个1024位的大整数?真实的情况是素数生成器也只是在1024bits对应的整数附近进行&摸索&而已,大家其实都不容易,又要快又要准确又要随机性,那么素数生成器也只能应付一下,找到1024位的算是好运,没找到1024位,1023位也照样送出来:)。
3、公钥指数如何确定?
公钥指数是随意选的,但目前行业上公钥指数普遍选的都是601,5bits),该值是除了1、3、5、17、257之外的最小素数,为什么不选的大一点?当然可以,只是考虑到既要满足相对安全、又想运算的快一点(加密时),PKCS#1的一个建议值而已。
有意的把公钥指数选的小一点,但是对应私钥指数肯定很大,意图也很明确,大家都要用公钥加密,所以大家时间很宝贵,需要快一点,您一个人私钥解密,时间长一点就多担待,少数服从多数的典型应用。
4、私钥指数如何确定?
公钥指数随意选,那么私钥就不能再随意选了,只能根据算法公式(ed%k=1,k=(p-1)(q-1))进行运算出来。那么私钥指数会是多少位?根据ed关系,私钥d=(x*k+1)/e,所以单看这个公式,私钥指数似乎也不是唯一结果,可能大于也可能小于1024bits的,但我们习惯上也是指某个小于1024bits的大整数。
包括前文的公钥指数,在实际运算和存储时为方便一般都是按照标准位长进行使用,前面不足部分补0填充,所以,使用保存和转换这些密钥需要注意统一缓冲区的长度。
二、明文长度
网上有说明文长度小于等于密钥长度(Bytes)-11,这说法本身不太准确,会给人感觉RSA 1024只能加密117字节长度明文。实际上,RSA算法本身要求加密内容也就是明文长度m必须0&m&n,也就是说内容这个大整数不能超过n,否则就出错。那么如果m=0是什么结果?普遍RSA加密器会直接返回全0结果。如果m&n,运算就会出错?!那怎么办?且听下文分解。
所以,RSA实际可加密的明文长度最大也是1024bits,但问题就来了:
如果小于这个长度怎么办?就需要进行padding,因为如果没有padding,用户无法确分解密后内容的真实长度,字符串之类的内容问题还不大,以0作为结束符,但对二进制数据就很难理解,因为不确定后面的0是内容还是内容结束符。
只要用到padding,那么就要占用实际的明文长度,于是才有117字节的说法。我们一般使用的padding标准有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建议的padding就占用了11个字节。
如果大于这个长度怎么办?很多算法的padding往往是在后边的,但PKCS的padding则是在前面的,此为有意设计,有意的把第一个字节置0以确保m的值小于n。
这样,128字节(1024bits)-减去11字节正好是117字节,但对于RSA加密来讲,padding也是参与加密的,所以,依然按照1024bits去理解,但实际的明文只有117字节了。
关于PKCS#1 padding规范可参考:RFC2313 chapter 8.1,我们在把明文送给RSA加密器前,要确认这个值是不是大于n,也就是如果接近n位长,那么需要先padding再分段加密。除非我们是&定长定量自己可控可理解&的加密不需要padding。
三、密文长度
密文长度就是给定符合条件的明文加密出来的结果位长,这个可以确定,加密后的密文位长跟密钥的位长度是相同的,因为加密公式:
所以,C最大值就是n-1,所以不可能超过n的位数。尽管可能小于n的位数,但从传输和存储角度,仍然是按照标准位长来进行的,所以,即使我们加密一字节的明文,运算出来的结果也要按照标准位长来使用(当然了,除非我们能再采取措施区分真实的位长,一般不在考虑)。
至于明文分片多次加密,自然密文长度成倍增长,但已不属于一次加密的问题,不能放到一起考虑。
四、关于密钥模值的存储和转换
【未完待续】
参考资料:
相关文章:&&
相关评论(1):&&
邮箱(选填)
主页(选填)
记住我,下次回复时不用再次输入个人信息
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。求一个用私钥加密,公钥解密的例子(RSACryptoServiceProvider)
[问题点数:20分,结帖人changxiang]
求一个用私钥加密,公钥解密的例子(RSACryptoServiceProvider)
[问题点数:20分,结帖人changxiang]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。java中RSA用私钥加密公钥解密问题_百度知道
java中RSA用私钥加密公钥解密问题
私钥解密,网上资料多数都是公钥加密,n),已知公钥(e,公钥解密请教各位大侠,而且公私钥都直接来自文件:要实现一个功能,多谢,n),而这个需求是给出了公钥和私钥的三个参数,私钥(d,要求使用私钥对MD5生成的128位文字摘要进行加密
已知私钥(d,n),如何用私钥对数据进行加密,多谢
公钥和私钥可以互换的用,用公钥加密私钥解密,用私钥加密公钥解密都ok,方法一样
采纳率100%
其他类似问题
为您推荐:
其他1条回答
cnblogs://www.html" target="_blank">http<a href="/huozhicheng/archive/2012/09//huozhicheng/archive//2673467
多谢,但是获取私钥的方法,现在已知的是d,n,这个如何转化为私钥呢,多谢。
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁RSA,DSA等加解密算法介绍
MessageDigest是一个数据的数字指纹.即对一个任意长度的数据进行计算,产生一个唯一指纹号.
MessageDigest的特性:
两个不同的数据,难以生成相同的指纹号
对于指定的指纹号,难以逆向计算出原始数据
代表:MD5/SHA
单密钥算法,是信息的发送方采用密钥A进行数据加密,信息的接收方采用同一个密钥A进行数据解密.
单密钥算法是一个对称算法.
缺点:由于采用同一个密钥进行加密解密,在多用户的情况下,密钥保管的安全性是一个问题.
RSA is named from the initials of the authors,
Ron Rivest, Adi Shamir, and
Leonard Adleman,who first published the
algorithm.&&
RSA 与 DSA
都是非对称加密算法。其中RSA的安全性是基于极其困难的大整数的分解(两个素数的乘积);DSA 的安全性
是基于整数有限域离散对数难题。基本上可以认为相同密钥长度的 RSA 算法与 DSA 算法安全性相当。
公钥用于加密,它是向所有人公开的;私钥用于解密,只有密文的接收者持有。
适用OPENSSL
适用RSA&的命令如下:
生成一个密钥(私钥)
[root@hunterfu ~]# openssl genrsa -out
private.key 1024
需要注意的是这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密,后面的1024是生成
密钥的长度.
通过密钥文件private.key 提取公钥
[root@hunterfu ~]# openssl rsa -in private.key
-pubout -out pub.key
使用公钥加密信息
[root@hunterfu ~]# echo -n "123456" | openssl
rsautl -encrypt -inkey pub.key -pubin
&encode.result
使用私钥解密信息
[root@hunterfu ~]#cat encode.result | openssl
rsautl -decrypt& -inkey private.key
&ECC 与 RSA
相比,有以下的优点:
(1)相同密钥长度下,安全性能更高,如160位ECC已经与1024位RSA、DSA有相同的安全强度。
(2)计算量小,处理速度快,在私钥的处理速度上(解密和签名),ECC远 比RSA、DSA快得多。
(3)存储空间占用小 ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多, 所以占用的存储空间小得多。
(4)带宽要求低使得ECC具有广泛得应用前景。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 rsa解密 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信