资源简介
OpenSSL 1.1.1 新特性: 全面支持国密SM2/SM3/SM4加密算法,最近的项目涉及到国密,前期已经完成了SM2算法,近期测试了SM4。代码附上。vs2017亲测通过。支持ECB、CBC 。采用自己打补丁的方式。
代码片段和文件信息
#define CRTDBG_MAP_ALLOC
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include jects.h>
#include
#include
#include
#include
#include
#define SM2_DEFAULT_USERID “1234567812345678“
char * OpensslGetLastErr()
{
ERR_load_ERR_strings();
ERR_load_crypto_strings();
unsigned long ulErr = ERR_get_error();
char szErrMsg[1024] = { 0 };
char *pTmp = NULL;
pTmp = ERR_error_string(ulErr szErrMsg);
return pTmp;
}
int addpadding(char *in int inLenint paddingLen char *out int *outLen)
{
char tmpPadding[16 + 1] = { 0 };
int tmpPaddingLen = -1;
char tmpOut[8192 + 16 + 1] = { 0 };
int tmpOutLen = -1;
if (paddingLen %8 != 0 || inLen <= 0)
{
return -1;
}
tmpOutLen = 0;
tmpPaddingLen = paddingLen - (inLen % paddingLen == 0 ? 0 : inLen % 16);
memset(tmpPadding tmpPaddingLen tmpPaddingLen);
memcpy(tmpOut in inLen);
tmpOutLen += inLen;
memcpy(tmpOut + tmpOutLen tmpPadding tmpPaddingLen);
tmpOutLen += tmpPaddingLen;
memcpy(out tmpOut tmpOutLen);
*outLen = tmpOutLen;
return 0;
}
int unaddpadding(char *in int inLen char *out int *outLen)
{
if (inLen % 8 != 0 || inLen <= 0)
{
return -1;
}
memcpy(out in inLen- in[inLen - 1]);
*outLen = inLen - in[inLen - 1];
return 0;
}
int sm4_encrypt(char *keyint keyLenchar *in int inLen char *out int *outLenint modechar *ivint ivLen)
{
int nRet = -1;
char tmpIn[8192 + 1] = { 0 };
int tmpInLen = 0;
char tmpOut[8192 + 16 + 1] = { 0 };
int tmpOutLen = 0;
int tmpLen = 0;
EVP_CIPHER_CTX *ctx;
if (inLen <=0 || in == NULL )
{
return -1;
}
if ( keyLen != 16 || key == NULL)
{
return -2;
}
nRet = addpadding(in inLen 16 tmpIn &tmpInLen);
if (nRet != 0 || tmpInLen % 16 != 0)
{
return -3;
}
ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL)
{
return -4;
}
if (mode==0)
{
if (ivLen != 16 || iv == NULL)
{
return -1;
}
nRet = EVP_EncryptInit_ex(ctx EVP_sm4_cbc() NULL key iv);
}
else
{
nRet = EVP_EncryptInit_ex(ctx EVP_sm4_ecb() NULL key NULL);
}
if (nRet != 1)
{
EVP_CIPHER_CTX_free(ctx);
return - 5;
}
EVP_CIPHER_CTX_set_padding(ctx 0);
nRet = EVP_EncryptUpdate(ctx tmpOut &tmpOutLen tmpIn tmpInLen);
if (nRet != 1)
{
EVP_CIPHER_CTX_free(ctx);
return -6;
}
tmpLen += tmpOutLen;
nRet = EVP_EncryptFinal_ex(ctx tmpOut+tmpOutLen &tmpOutLen);
if (nRet != 1)
{
EVP_CIPHER_CTX_free(ctx);
return -7;
- 上一篇:Dalsa Camerali
nk相机采集代码 - 下一篇:基于verilog的小数分频
相关资源
- OPenssl生成证书
- SM2 SM4 国密算法 运算工具测试必备
- 国密sm2算法c实现
- SM4加解密工具
- windows下安装配置openssl环境
- openssl_sm2_sm3_c.zip
- 基于OpenSSL的安全聊天系统
- GM-T 0054-2018信息系统密码应用基本要求
- 国密SM2文档详细
- openssl生成的证书demo
- libeay32.dll 、 ssleay32.dll动态链接库
- 已经编译好的Openssl,直接使用
- RSA加解密在Delphi代码中的实现Demo
- Delphi7_OpenSSL.rar
- SM4.zip
- RSA-via-OpenSSL-libeay32-master
- openssl中函数RSA_public_encrypt的使用案例
- indy10安装包.rar
- openssl-1.0.2-libeay32ssleay32库
- openssl rsa code
- 国密SM2算法基于Openssl实现
- sm2、sm3源代码,openssl可直接调用
- LibcurlOpenSSLZlib.7z
- openssl-0.9.8r
- ios平台的支持arm64和x86_64的通用opens
- openssl 静态 链接库 libeay32.lib ssleay32
- 《GM/T 0028-2014 密码模块安全技术要求
- openssl.cnf
- Openssl.cnf文件.rar
- wsdl2h、soapcpp2生成的onvif文件
评论
共有 条评论