1,非对称加密RSA:

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

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

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

2,使用CryptoPP实现RSA:

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

 #include "..\cryptopp562\randpool.h"
#include "..\cryptopp562\osrng.h"
#include "..\cryptopp562\rsa.h" //待加密的字符串
string message = "http://my.oschina.net/xlplbo/blog";
printf("message = %s, length = %d\n", message.c_str(), strlen(message.c_str())); /*
//自动生成随机数据
byte seed[600] = "";
AutoSeededRandomPool rnd;
rnd.GenerateBlock(seed, sizeof(seed));
printf("seed = %s\n", (char *)seed, strlen((char *)seed)); //生成加密的高质量伪随机字节播种池一体化后的熵
RandomPool randPool;
randPool.Put(seed, sizeof(seed));
*/ AutoSeededRandomPool rnd;
InvertibleRSAFunction params;
params.GenerateRandomWithKeySize(rnd, ); RSA::PrivateKey privateKey(params);
RSA::PublicKey publicKey(params); //使用OAEP模式
//RSAES_OAEP_SHA_Decryptor pri(randPool, sizeof(seed));
//RSAES_OAEP_SHA_Encryptor pub(pri);
RSAES_OAEP_SHA_Decryptor pri(privateKey);
RSAES_OAEP_SHA_Encryptor pub(publicKey);
printf("max plaintext Length = %d,%d\n", pri.FixedMaxPlaintextLength(), pub.FixedMaxPlaintextLength());
if (pub.FixedMaxPlaintextLength() > message.length())
{//待加密文本不能大于最大加密长度
string chilper;
StringSource(message, true, new PK_EncryptorFilter(rnd, 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(rnd, 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);
RSAES_PKCS1v15_Decryptor pri1(privateKey);
RSAES_PKCS1v15_Encryptor pub1(publicKey);
printf("max plaintext Length = %d,%d\n", pri1.FixedMaxPlaintextLength(), pub1.FixedMaxPlaintextLength());
if (pub1.FixedMaxPlaintextLength() > message.length())
{//待加密文本不能大于最大加密长度
string chilper;
StringSource(message, true, new PK_EncryptorFilter(rnd, 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(rnd, 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已经具有足够的安全性,反之seed太小的话FixedMaxPlaintextLength为0,将不能加密任何文本,测试数据参照下表:

RSA的安全性依赖于大数分解,由于进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。

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

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

  1. 非对称加密RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法

          非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密:如果用私 ...

  2. python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA

    加密与解密,这很重要,我们已经可以用pypcap+npcap简单嗅探到网络中的数据包了.而这个工具其实可以嗅探到更多的数据.如果我们和别人之间传输的数据被别人嗅探到,那么信息泄漏,信息被篡改,将给我们 ...

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

    quote: http://www.cnblogs.com/happinessCodes/archive/2010/07/27/1786404.html   一说到数据的加密,常常会涉及到这几个单词: ...

  4. Asp.Net 常用工具类之加密——非对称加密RSA算法

    踏入程序员这个行业也有几年了,几年中有收获(技术加强),有付出(时间和亚健康状态).当然喏,并不后悔,代码路还长!!! On The Way,永不止步!!! 开发过程中也积累了一些自己的经验.代码块和 ...

  5. 非对称加密RSA的C#实现

    1.对称加密算法 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). 对称加密有很多种算法,由于它效率很高,所 ...

  6. 加密算法之非对称加密RSA

    一:非对称加密的由来 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有 ...

  7. openssl 非对称加密 RSA 加密解密以及签名验证签名

    1. 简介 openssl  rsa.h 提供了密码学中公钥加密体系的一些接口, 本文主要讨论利用rsa.h接口开发以下功能 公钥私钥的生成 公钥加密,私钥解密 私钥加密,公钥解密 签名:私钥签名 验 ...

  8. PHP非对称加密-RSA

    对称加密算法是在加密和解密时使用同一个密钥.与对称加密算法不同,非对称加密算法需要两个密钥--公开密钥(public key)和私有密钥(private key)进行加密和解密.公钥和密钥是一对,如果 ...

  9. javascript版前端页面RSA非对称加密解密

    最近由于项目需要做一个url传参,并在页面显示参数内容的需求,这样就会遇到一个url地址可能会被假冒, 并传递非法内容显示在页面的尴尬情况 比如xxx.shtml?server=xxx是坏人& ...

随机推荐

  1. AI制作icon标准参考线与多面板复制

    新建10个25x25像素,色值为RGB的画板 在视图中打开显示网格 打开首选项参考线和网格,间隔和隔线都设为1 新建一个20x20像素前景色为空描边为1像素的正方形 选择对齐选项中的对齐画板,使之与画 ...

  2. Delphi 域名解析为IP地址

    花生壳:1.LJSZForm-Lable1-Caption改成 “IP地址或域名:”2.LJSZForm-BitBtn1Click-注释掉--else if IsIP(Trim(IPEdit.Text ...

  3. 【Git】 GitLab简单使用

    本例介绍简单实用GitLab,安装请参照[Git] GitLab服务器社区版安装与配置 1.用户和组的管理 a.创建组,在首页点击Create a group b.创建用户,在首页点击Add peop ...

  4. Android 软件退出系统方法重写

    Android 软件退出系统按键方法重写 //针对Andriod软件退出系统按键方法重写 ;//key down time @Override public boolean onKeyDown(int ...

  5. mysql---select的五种子句学习(where、group by、having、order by、limit)

      mysql---select的五种子句学习(where.group by.having.order by.limit) 分类: Mysql学习2012-09-27 16:14 1533人阅读 评论 ...

  6. 结合OPENSIFT源码详解SIFT算法

    平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 参考博客:https://www.cnblogs.com/cql ...

  7. Codeforces Round #548 (Div. 2) C dp or 排列组合

    https://codeforces.com/contest/1139/problem/C 题意 一颗有n个点的树,需要挑选出k个点组成序列(可重复),按照序列的顺序遍历树,假如经过黑色的边,那么这个 ...

  8. fortran77读写文本文档

    PROGRAM WRITETEXT IMPLICIT NONE INTEGER,PARAMETER :: NE=!fortran90 语法定义变量 DOUBLE PRECISION A(,),B(,) ...

  9. 学习在dos下使用gcc来编译

    这两年里,断断续续的学习和使用c,平时都是在CodeBlocks里写代码,编译程序,点一下按钮就行了.对整个编译过程是一点儿都不了解.相比当年学习java,真的是选择了两个不同的路,当年学习java的 ...

  10. 机器学习随笔01 - k近邻算法

    算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. ...