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++的更多相关文章

  1. javax.crypto.BadPaddingException: Given final block not properly padded 解决方法

    下面的 Des 加密解密代码,在加密时正常,但是在解密是抛出错误: javax.crypto.BadPaddingException: Given final block not properly p ...

  2. 使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)

    正常情况下使用md5加密 var crypto = require('crypto'); var md5Sign = function (data) { var md5 = crypto.create ...

  3. javax.crypto.BadPaddingException: Given final block not properly padded

    一.报错 写了一个加密方法,在Windows上运行没有问题,在Linux上运行时提示如下错误: javax.crypto.BadPaddingException: Given final block ...

  4. Liunx-https-java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b

    错误信息: java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b at javax.crypto.KeyGenerator.a(DashoA13* ...

  5. node crypto md5加密,并解决中文不相同的问题

    在用crypto模块时碰到了加密中文不相同的问题,多谢群里面@蚂蚁指定 1:解决中文不同的问题 function md5Pay(str) { str = (new Buffer(str)).toStr ...

  6. Crypto++ 动态链接编译与实例测试

    测试用例的来源<Crypto++入门学习笔记(DES.AES.RSA.SHA-256)> 解决在初始化加密器对象时触发异常的问题: CryptoPP::AESEncryption aesE ...

  7. python3 crypto winrandom import error

    早就听说3的包很成熟了,自从从2.7过渡上来后还是碰到各种不适应,可以想象更早的时候问题该要多么多,特别一些必备库经典库如果没有跟进得多痛苦. [code lang="python" ...

  8. Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(加解密)

    转自http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html 最近,基于某些原因和需要,笔者需要去了解一下Crypto++库,然后 ...

  9. nodejs 核心模块crypto

    crypto用于加密解密 'use strict' var crypto=require('crypto'); var data={age:18} var key='dt';//定义一个钥匙 var ...

  10. maven install 时提示“程序包 javax.crypto不存在”

    但是javax.crypto是在jdk的jre\lib目录下的 解决方案: <compilerArguments> <bootclasspath>${java.home}/li ...

随机推荐

  1. PHP实现微信商户支付企业付款到零钱功能代码实例

    本文为大家分享了PHP实现微信商户支付企业付款到零钱的具体代码,供大家参考,具体内容如下 微信支付开发文档 一.开通条件 企业付款为企业提供付款至用户零钱的能力,支持通过API接口付款,或通过微信支付 ...

  2. mybatis 开发规范

  3. UOJ#42. 【清华集训2014】Sum 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ42.html 题解 首先我们把式子改写一下: $$(-1)^{\lfloor a\rfloor} \\=1 ...

  4. 网络安全第一集之【SQL注入:sqlmap入门】

    1,安装sqlmap和python环境 2,对于环境变量超长问题 3,使用sqlmap: sqlmap.py -u "http://k2.hlxy.net/csdw/news1.asp?dp ...

  5. 习题集1b: 额外练习 (可选)

    1.练习:4.样本特点 用来描述样本的数字叫做? □ 参数   (√)□ 统计量 □ 变量 □ 常数 2.练习:5.大一学生体重情况 Freidman 博士在一所大学任教,她记录了所在大学每位大一新生 ...

  6. 初始Mkaefile

    初识MakefIle 在学习Linux过程中,我越发的觉得Linux系统给了使用者更大的自由,同时也就增加了学习的成本.在gcc下去调试代码,没有了熟悉的VS,没有的人性话的错误提示(当然Makefi ...

  7. [wordpress]WordPress地址(URL)错误,修改解决方案

    本人在修改Wordpress地址(URL)时,误操作使URL指向错误,后台无法进入. 解决方案 1.先利用Putty登陆到自己的服务器上(这里登陆方法我不再赘述): 2.登陆MySqL,并输入密码: ...

  8. Python 地点转化为经纬度

    1.geopy包下载地点https://pypi.python.org/pypi/geopy 2.安装步骤            运行cmd,切换到D:/python/geopy-1.11.0/目录下 ...

  9. CCTV5 前端

    get :  fre = 11868  symbolrate  = 27500 pls_n=0------167    CCTV 9------------168    CCTV 3--------- ...

  10. vue 监听路由变化

    方法一:通过 watch // 监听,当路由发生变化的时候执行 watch:{ $route(to,from){ console.log(to.path); } }, 或 // 监听,当路由发生变化的 ...