crypto++
CryptoPP库是一个C++书写的加密算法库,很棒。
在如今的抛却数字证书体系下,只关注公私钥对的情况下,我认为存粹的加解密算法库很有市场,虽然我以前觉得PolarSSL的加解密算法实现不错,但不影响我对CryptoPP的热情
今天,介绍一下,CryptoPP的椭圆曲线加/解密和签名/延签问题,当然是提供源码来说话了
——————————————————————————————————————————
//ecc-enc-dec.h
#ifndef ECC_ENC_DEC_H
#define ECC_ENC_DEC_H
#include <string>
void genEccEncKeys(unsigned int uiKeySize, std::string &priKey, std::string &pubKey);
void genEccSignKeys(unsigned int uiKeySize, std::string &priKey, std::string &pubKey);
std::string ecc_pri_signature(const std::string priKey, const std::string msgToSign);
std::string ecc_pub_encrypt(const std::string pubKey, const std::string msgToEncrypt);
std::string ecc_pri_decrypt(const std::string priKey, const std::string msgToDecrypt);
int ecc_pub_verify(const std::string pubKey, const std::string msgToSign, const std::string msgSigned);
#endif
//ecc-enc-dec.c
#include "ecc-enc-dec.h"
#include "eccrypto.h"
#include "osrng.h"
#include "oids.h"
#include "hex.h"
#include "filters.h"
using namespace CryptoPP;
void genEccEncKeys(unsigned int uiKeySize, std::string &priKey, std::string &pubKey)
{
AutoSeededRandomPool rnd(false, uiKeySize);
ECIES<ECP>::PrivateKey privateKey;
ECIES<ECP>::PublicKey publicKey;
privateKey.Initialize(rnd, ASN1::secp521r1());
privateKey.MakePublicKey(publicKey);
ECIES<ECP>::Encryptor encryptor(publicKey);
HexEncoder pubEncoder(new StringSink(pubKey));
encryptor.DEREncode(pubEncoder);
pubEncoder.MessageEnd();
ECIES<ECP>::Decryptor decryptor(privateKey);
HexEncoder priEncoder(new StringSink(priKey));
decryptor.DEREncode(priEncoder);
priEncoder.MessageEnd();
}
void genEccSignKeys(unsigned int uiKeySize, std::string &priKey, std::string &pubKey)
{
AutoSeededRandomPool rnd(false, uiKeySize);
ECDSA<ECP, SHA256>::PrivateKey privateKey;
ECDSA<ECP, SHA256>::PublicKey publicKey;
privateKey.Initialize(rnd, ASN1::secp521r1());
privateKey.MakePublicKey(publicKey);
StringSink priSs(priKey);
privateKey.Save(priSs);
StringSink pubSs(pubKey);
publicKey.Save(pubSs);
}
std::string ecc_pri_signature(const std::string priKey, const std::string msgToSign)
{
std::string signedText;
ECDSA<ECP, SHA256>::PrivateKey privateKey;
StringSource Ss(priKey, true);
privateKey.Load(Ss);
ECDSA<ECP, SHA256>::Signer signer(privateKey);
size_t siglen = signer.MaxSignatureLength();
signedText.resize(siglen);
RandomPool rnd;
siglen = signer.SignMessage(rnd, (byte*)msgToSign.data(), msgToSign.size(), (byte*)signedText.data());
signedText.resize(siglen);
return signedText;
}
std::string ecc_pub_encrypt(const std::string pubKey, const std::string msgToEncrypt)
{
std::string cipherText;
// if to save the key into a file, FileSource should be replace StringSource
StringSource pubString(pubKey, true, new HexDecoder);
ECIES<ECP>::Encryptor encryptor(pubString);
size_t uiCipherTextSize = encryptor.CiphertextLength(msgToEncrypt.size());
cipherText.resize(uiCipherTextSize);
RandomPool rnd;
encryptor.Encrypt(rnd, (byte*)msgToEncrypt.c_str(), msgToEncrypt.size(), (byte*)cipherText.data());
return cipherText;
}
std::string ecc_pri_decrypt(const std::string priKey, const std::string msgToDecrypt)
{
std::string decryptText;
StringSource priString(priKey, true, new HexDecoder);
ECIES<ECP>::Decryptor decryptor(priString);
size_t uiDecryptTextSize = decryptor.MaxPlaintextLength(msgToDecrypt.size());
decryptText.resize(uiDecryptTextSize);
RandomPool rnd;
decryptor.Decrypt(rnd, (byte*)msgToDecrypt.c_str(), msgToDecrypt.size(), (byte*)decryptText.data());
return decryptText;
}
int ecc_pub_verify(const std::string pubKey, const std::string msgToSign, const std::string msgSigned)
{
ECDSA<ECP, SHA256>::PublicKey publicKey;
StringSource Ss(pubKey, true);
publicKey.Load(Ss);
RandomPool rnd;
publicKey.Validate(rnd, 3);
ECDSA<ECP, SHA256>::Verifier verifier(publicKey);
bool result = verifier.VerifyMessage((byte*)msgToSign.data(), msgToSign.size(), (byte*)msgSigned.data(), msgSigned.size());
if (result)
{
return 1;
}
else
{
return 0;
}
}
//ecc-test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "ecc-enc-dec.h"
int main()
{
std::string srcText = std::string("Hello world.");
std::string enc_priKey, enc_pubKey;
genEccEncKeys(1024, enc_priKey, enc_pubKey);
std::string encryptResult = ecc_pub_encrypt(enc_pubKey, srcText);
printf("public key enc result: %s--\nlength: %d\n", encryptResult.c_str(), (int)encryptResult.size());
std::string decryptResult = ecc_pri_decrypt(enc_priKey, encryptResult);
printf("private key dec result: %s--\nlength: %d\n", decryptResult.c_str(), (int)decryptResult.size());
std::string sign_priKey, sign_pubKey;
genEccSignKeys(1024, sign_priKey, sign_pubKey);
std::string signedResult = ecc_pri_signature(sign_priKey, srcText);
printf("private key sign result: %s--\nlength: %d\n", signedResult.c_str(), (int)signedResult.size());
int bVerify = ecc_pub_verify(sign_pubKey, srcText, signedResult);
printf("public key verify result: %d\n", 0==bVerify?false:true);
return 0;
}
//result
# ./ecc-test
public key enc result:
crypto++的更多相关文章
- javax.crypto.BadPaddingException: Given final block not properly padded 解决方法
下面的 Des 加密解密代码,在加密时正常,但是在解密是抛出错误: javax.crypto.BadPaddingException: Given final block not properly p ...
- 使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)
正常情况下使用md5加密 var crypto = require('crypto'); var md5Sign = function (data) { var md5 = crypto.create ...
- javax.crypto.BadPaddingException: Given final block not properly padded
一.报错 写了一个加密方法,在Windows上运行没有问题,在Linux上运行时提示如下错误: javax.crypto.BadPaddingException: Given final block ...
- Liunx-https-java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b
错误信息: java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b at javax.crypto.KeyGenerator.a(DashoA13* ...
- node crypto md5加密,并解决中文不相同的问题
在用crypto模块时碰到了加密中文不相同的问题,多谢群里面@蚂蚁指定 1:解决中文不同的问题 function md5Pay(str) { str = (new Buffer(str)).toStr ...
- Crypto++ 动态链接编译与实例测试
测试用例的来源<Crypto++入门学习笔记(DES.AES.RSA.SHA-256)> 解决在初始化加密器对象时触发异常的问题: CryptoPP::AESEncryption aesE ...
- python3 crypto winrandom import error
早就听说3的包很成熟了,自从从2.7过渡上来后还是碰到各种不适应,可以想象更早的时候问题该要多么多,特别一些必备库经典库如果没有跟进得多痛苦. [code lang="python" ...
- Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(加解密)
转自http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html 最近,基于某些原因和需要,笔者需要去了解一下Crypto++库,然后 ...
- nodejs 核心模块crypto
crypto用于加密解密 'use strict' var crypto=require('crypto'); var data={age:18} var key='dt';//定义一个钥匙 var ...
- maven install 时提示“程序包 javax.crypto不存在”
但是javax.crypto是在jdk的jre\lib目录下的 解决方案: <compilerArguments> <bootclasspath>${java.home}/li ...
随机推荐
- django 第四天
简单的一对多的页面 实现的页面结果如下 利用正则匹配 1.x系列和2.x系列django的用法不同,....他x的. 关于正则匹配 我一直没能实现,再试试吧 路由分发,尤其是在多个页面的时候 app0 ...
- xilinx和altera的fpga的不同之处!----如果不知道,你将为之付出代价! --转载
本人从2004年接触fpga开始,至今已经8年了.开发过altera的flex系列和cyclone3系列:开发过xilinx的vii和v5系列.下面谈谈本人对二者的一些不同,以便引起开发者对一些细节上 ...
- Spring Boot 读取 resource 下文件
支持linux下读取 import org.springframework.core.io.ClassPathResource; public byte[] getCertStream(String ...
- [CF662C] Binary Table(FWT)
题意: https://www.cnblogs.com/cjyyb/p/9065801.html 题解:
- 设置通过Maven创建工程的JDK版本
在eclipse中创建的Maven工程默认的运行环境为JDK1.5,如果想修改JDK的版本,无非是右键项目点击Build Path->Configure Build Path修改JDK信息-&g ...
- (三)ajax请求不同源之websocket跨域
WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀.该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信. 一.WebSocket目标 在一个单独的 ...
- 2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest
A. Advertising Strategy 最优策略一定是第一天用$y$元,最后一天再用$x-y$元补满. 枚举所有可能的$y$,然后模拟即可,天数为$O(\log n)$级别. 时间复杂度$O( ...
- MFC版链表实现稀疏多项式相加减
链表实现多项式运算(加减)MFC可视化版 题目 设计一个一元稀疏多项式简单计算器. 基本要求 (1)输入并建立两个多项式: (2)多项式a与b相加,建立和多项式c: (3)多项式a与b相减,建立差多项 ...
- BOM 浏览器对象模型_window.navigator
window.navigator 对象 包含浏览器和系统信息的 Navigator 对象. 通过这个属性 了解用户的环境信息 window.navigator.userAgent 返回浏览器的 Use ...
- JS-函数的构造函数Function
## 在js中使用Function可以实例化函数对象,也就是说在js中函数和普通对象一样. 函数在Js中是比较特殊的,拥有很多功能. 1,函数是对象,就可以使用对象的动态特性. 2,函数是对象,就有 ...