当前位置:网站首页>OpenSSL: a full-featured toolkit for TLS and SSL protocols, and a general encryption library
OpenSSL: a full-featured toolkit for TLS and SSL protocols, and a general encryption library
2022-07-06 22:40:00 【Ink painting long sky】
OpenSSL: apply TLS And SSL The full-featured toolkit of the Protocol , Universal encryption library
One 、SSL Library and cryptographic algorithm library
name | library |
---|---|
EVP Packaging Library | libeay32.lib |
SSL library | ssleay32.lib |
Two 、 Use OpenSSL
- install OpenSSL-Win32
- introduce libeay32.lib and ssleay32.lib
- Set up OpenSSL Header Directory
3、 ... and 、 The format of the certificate
- XML A standard format ------- C# RSA certificate
<RSAKeyValue>
<Modulus> </Modulus>
<Exponent> </Exponent>
<P> </P>
<Q> </Q>
<DP> </DP>
<DQ> </DQ>
<InverseQ> </InverseQ>
<D> </D>
</RSAKeyValue>
- PEM PKCS#8 Unencrypted format ------- Java
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
- PEM PKCS#1 Format
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
Four 、 Common encryption algorithms
Symmetric encryption algorithm :
- AES
- DES/3DES(TripleDES)
#pragma comment(lib, "libeay32.lib")
#include <openssl/des.h>
#include <openssl/rand.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/x509.h>
/* 3DES encryption * encData: 8*n bytes * encKey: 3 Multiple key length ¬24 bytes * encIV: Encryption vector ¬8bytes,default:{1,2,3,4,5,6,7,8} * out : enc output data * return: error:-1 successful: out length */
int iEVP_Encrypt(byte* data, byte* key, byte* iv, byte* out)//end with 0
{
int ret;
int outLen;
int tmpLen;
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_set_padding(&ctx,0);
EVP_CIPHER_CTX_init(&ctx);
ret = EVP_EncryptInit_ex(&ctx,EVP_des_ede3_cbc(),NULL,key,iv);
EVP_CIPHER_CTX_set_padding(&ctx,0);//will reInit enc and dec
if(ret != 1)
{
return NULL;//error
}
ret = EVP_EncryptUpdate(&ctx,out,&outLen,(unsigned char *)data,8);
if(ret != 1)
{
return NULL;//error
}
ret = EVP_EncryptFinal_ex(&ctx,out+outLen,&tmpLen);
if(ret != 1)
{
return NULL;//Err
}
outLen = outLen + tmpLen;
return outLen;
}
/* 3DES Decrypt * decData: 8*n bytes * decKey: 3 Multiple key length ¬24 bytes * decIV: Encryption vector ¬8bytes,default:{1,2,3,4,5,6,7,8} * out :dec output data * return: error:-1 successful: out length */
int iEVP_Decrypt(byte* data, byte* key, byte* iv, byte* out)
{
int ret = 0;
int outLen = 8;
int tmpLen = 0;
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_set_padding(&ctx,0);
EVP_CIPHER_CTX_init(&ctx);
ret = EVP_DecryptInit_ex(&ctx,EVP_des_ede3_cbc(),NULL,key,iv);
EVP_CIPHER_CTX_set_padding(&ctx,0);//will reInit enc and dec
if(ret!=1)
{
return NULL;//Err
}
ret = EVP_DecryptUpdate(&ctx,out,&outLen,data,outLen);
if(ret!=1)
{
return NULL;//Err
}
ret = EVP_DecryptFinal_ex(&ctx,out+outLen,&tmpLen);
if(ret!=1)
{
return NULL;//Err
}
outLen = outLen + tmpLen;
return outLen;
}
Asymmetric encryption algorithm :
- RSA
//RSA Private key decryption
string bio_read_privateKey(string data)
{
OpenSSL_add_all_algorithms();
BIO* bp = BIO_new( BIO_s_file() );
BIO_read_filename( bp, "private.pem" );
RSA* rsaK = PEM_read_bio_RSAPrivateKey( bp, NULL, NULL, NULL );
if (NULL == rsaK)
{
return NULL;//Error
}
int nLen = RSA_size(rsaK);
if (nLen == NULL)
{
return NULL;//Error
}
char* pEncode = new char[nLen +1];
memset(pEncode,0,nLen+1);
int ret = RSA_private_decrypt(data.length(),(byte*)data.c_str(),(byte*)pEncode,rsaK,RSA_PKCS1_PADDING);
string strRet;
if (ret >= 0)
{
strRet = string(pEncode, ret);
}
else
{
return NULL;
}
delete[] pEncode;
CRYPTO_cleanup_all_ex_data();
BIO_free_all( bp );
RSA_free(rsaK);
return strRet;
}
//rsa Public key encryption
string bio_read_publicKey(string data)
{
OpenSSL_add_all_algorithms();
BIO* bp = BIO_new( BIO_s_file());
BIO_read_filename( bp, "public.pem" );
RSA* rsaK ;
if((rsaK = PEM_read_bio_RSA_PUBKEY(bp,NULL,NULL,NULL)) == NULL)
{
return NULL;
}
if (NULL == rsaK)
{
return NULL;//read failed
}
int nLen = RSA_size(rsaK);
char *pEncode = new char[nLen + 1];
memset(pEncode,0,nLen+1);
int ret = RSA_public_encrypt(data.length(),(const byte*)data.c_str(),(byte*)pEncode,rsaK,RSA_PKCS1_PADDING);
string strRet;
if (ret >= 0)
{
strRet = string(pEncode, ret);
}
else
{
return NULL;
}
delete[] pEncode;
CRYPTO_cleanup_all_ex_data();
BIO_free_all( bp );
RSA_free(rsaK);
return strRet;
}
边栏推荐
- config:invalid signature 解决办法和问题排查详解
- AdaViT——自适应选择计算结构的动态网络
- cuda 探索
- 网络基础入门理解
- Chapter 19 using work queue manager (2)
- Machine test question 1
- Typescript get function parameter type
- 雅思口语的具体步骤和时间安排是什么样的?
- What are the specific steps and schedule of IELTS speaking?
- General implementation and encapsulation of go diversified timing tasks
猜你喜欢
pytorch_YOLOX剪枝【附代码】
金融人士必读书籍系列之六:权益投资(基于cfa考试内容大纲和框架)
Heavyweight news | softing fg-200 has obtained China 3C explosion-proof certification to provide safety assurance for customers' on-site testing
Aardio - 通过变量名将变量值整合到一串文本中
自定义 swap 函数
基於 QEMUv8 搭建 OP-TEE 開發環境
uniapp滑动到一定的高度后固定某个元素到顶部效果demo(整理)
pytorch_ Yolox pruning [with code]
机试刷题1
Aardio - 利用customPlus库+plus构造一个多按钮组件
随机推荐
2022-07-05 stonedb sub query processing parsing time analysis
【无标题】
【编译原理】做了一半的LR(0)分析器
sizeof关键字
poj 1094 Sorting It All Out (拓扑排序)
Inno setup packaging and signing Guide
NPM cannot install sharp
Financial professionals must read book series 6: equity investment (based on the outline and framework of the CFA exam)
npm无法安装sharp
config:invalid signature 解决办法和问题排查详解
How to confirm the storage mode of the current system by program?
Aardio - construct a multi button component with customplus library +plus
Build op-tee development environment based on qemuv8
How big is the empty structure?
Advantages of link local address in IPv6
2022-07-05 use TPCC to conduct sub query test on stonedb
MySQL教程的天花板,收藏好,慢慢看
Sword finger offer question brushing record 1
变量与“零值”的比较
POJ 1094 sorting it all out