Crypto++应用:非对称加密RSA

1,非对称加密RSA:

(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

(2)甲方获取乙方的公钥,然后用它对信息加密。

(3)乙方得到加密后的信息,用私钥解密。

2,使用CryptoPP实现RSA:

CryptoPP是一套非常完整的加密解密开源解决方案,如何使用这里就不多说了,请自行Google。

#include "..\cryptopp562\randpool.h"
#include "..\cryptopp562\osrng.h"
#include "..\cryptopp562\rsa.h"

//自动生成随机数据
byte seed[1024] = "";
AutoSeededRandomPool rnd;
rnd.GenerateBlock(seed, sizeof(seed));
printf("seed = %s\n", (char *)seed, strlen((char *)seed));

//生成加密的高质量伪随机字节播种池一体化后的熵
RandomPool randPool;
randPool.Put(seed, sizeof(seed));

//待加密的字符串
string message = "http://my.oschina.net/xlplbo/blog";
printf("message = %s, length = %d\n", message.c_str(), strlen(message.c_str()));

//使用OAEP模式
RSAES_OAEP_SHA_Decryptor pri(randPool, sizeof(seed));
RSAES_OAEP_SHA_Encryptor pub(pri);
printf("max plaintext Length = %d,%d\n", pri.FixedMaxPlaintextLength(), pub.FixedMaxPlaintextLength());
//待加密文本不能大于最大加密长度
if (pub.FixedMaxPlaintextLength() > message.length())
{
	string chilper;
	StringSource(message, true, new PK_EncryptorFilter(randPool, pub, new StringSink(chilper)));
	printf("chilper = %s, length = %d\n", chilper.c_str(), strlen(chilper.c_str()));

	string txt;
	StringSource(chilper, true, new PK_DecryptorFilter(randPool, pri, new StringSink(txt)));
	printf("txt = %s, length = %d\n", txt.c_str(), strlen(txt.c_str()));
}

//使用PKCS1v15模式
RSAES_PKCS1v15_Decryptor pri1(randPool, sizeof(seed));
RSAES_PKCS1v15_Encryptor pub1(pri1);
printf("max plaintext Length = %d,%d\n", pri1.FixedMaxPlaintextLength(), pub1.FixedMaxPlaintextLength());
//待加密文本不能大于最大加密长度
if (pub1.FixedMaxPlaintextLength() > message.length())
{
	string chilper;
	StringSource(message, true, new PK_EncryptorFilter(randPool, pub1,new StringSink(chilper)));
	printf("chilper = %s, length = %d\n", chilper.c_str(), strlen(chilper.c_str()));

	string txt;
	StringSource(chilper, true, new PK_DecryptorFilter(randPool, pri1, new StringSink(txt)));
	printf("txt = %s, length = %d\n", txt.c_str(), strlen(txt.c_str()));
}

Cryptopp提供两种RSA的padding模式,分别是OAEP和PK1v15,padding模式跟安全性其实是紧密挂钩的,有兴趣的朋友可以去了解一下。

值得注意的seed的大小决定了能够加密的文本长度,可以通过修改seed的大小,运行查看结果。seed越大,加密解密的时间也越长,超过2048一般就能明显感觉到时间很长了,一般使用1024就已经具有足够的安全性,参照下表:

当然CryptoPP不只是提供加密解密算法,还提供很多易用的工具,如AutoSeededRandomPool, RandomPool, StringSource,StringSink,SocketSource,SocketSink,FileSource,FileSink等类,RSAES_OAEP_SHA_Decryptor, RSAES_OAEP_SHA_Encryptor等宏定义,具体使用方法请阅读源码。

参考链接:

http://www.cryptopp.com/

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

时间: 2024-10-11 06:19:06

Crypto++应用:非对称加密RSA的相关文章

非对称加密RSA加密文件

RSA加密文件 关于RSA非对称加密很多地方都有讲解. 下面是AES AES 类 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.security.Key; import java.security.SecureRandom; impor

非对称加密RSA的应用及在C#中的实现

quote: http://www.cnblogs.com/happinessCodes/archive/2010/07/27/1786404.html 一说到数据的加密,常常会涉及到这几个单词:算法.原文.密文和密钥.通常,发送者把原文通过一个加密的算法,用密钥进行加密后将密文发送给接收者,然后接收者再用密钥对密文进行解密,得到原文.由于常用的加密算法都是公开的,所以,对原文的加密的关键,就是密钥了.对于这种加解密都使用同样的密钥的算法,我们称之为对称加密,对称加密的代表算法就是DES家族了.

非对称加密RSA的C#实现

1.对称加密算法 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). 对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中.对称加密通常使用的是相对较小的密钥, 一般小于256 bit.因为密钥越大,加密越强,但加密与解密的过程越慢.如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密, 不行的话就再用1解:但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密

加密算法之非对称加密RSA

一:非对称加密的由来 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准.RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥.RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作

java 非对称加密RSA

package com.aarony.test; import java.io.IOException; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.sec

非对称加密——RSA算法工具类

关于RSA算法的介绍网上一大堆,一句话就是牛B. package com.demo; import org.springframework.util.StringUtils; import javax.crypto.Cipher; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.secur

Java非对称加密算法--RSA加密算法

Java非对称加密算法--RSA加密算法          RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA就是他们三人姓氏开头字母拼在一起组成的. 1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相

Node.js进阶:5分钟入门非对称加密方法

前言 刚回答了SegmentFault上一个兄弟提的问题<非对称解密出错>.这个属于Node.js在安全上的应用,遇到同样问题的人应该不少,基于回答的问题,这里简单总结下. 非对称加密的理论知识,可以参考笔者前面的文章<NODEJS进阶:CRYPTO模块之理论篇>. 完整的代码可以在 <Nodejs学习笔记> 找到,也欢迎大家关注 程序猿小卡的GitHub. 加密.解密方法 在Node.js中,负责安全的模块是crypto.非对称加密中,公钥加密,私钥解密,加解密对应的

Java加密技术(四)非对称加密算法RSA

RSA  这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman. 这种加密算法的特点主要是密钥的变化,上文我们看到DES只有一个密钥.相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了.RSA同时有两把钥匙,公钥与私钥.同时支持数字签名.数字签名的意义在于,对传输过来的数据进行校验.确保数据在传输工程中不被修改. 流程分析: 甲方构建