资源简介
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给文件传输加密
- openssl 简介(中文)
- usbkey国密接口测试工具
- 国密SM3算法Delphi实现
- Delphi 版 SM3 SM4加解密
- SM2国密算法实现基于mircal的实现
- 国密文档合集大部分GMT系列
- SM2_SM3_SM4计算常用工具
- openssl 手册中文版
- centos 7 openssh7.9p 201810月最新版,基于
- win64OpenSSL_Light
- 利用openssl和curl库获取https服务端证书
- linux c 使用openssl实现SHA1WithRSA实现,签
- openssl win7 64位
- indy10以上openssl支持所需要的文件。
- openssl098e-0.9.8e-17.el6.centos.src.rpm
- openssl-0.9.8k_WIN32.rar
- vs2010 win7下编译的openssl-1.0.2n静态库
- OpenSSL-1.0.2m静态库
- 基于OpenSSL库的ECDSA签名与验证和文档
- openssl-0.9.8k_WIN32(RSA密钥生成工具)
- OpenSSL-win64库使用依赖文件
- openssl.exe 0.9.8版本
- 商密SM4-SM3-SM2FPGA实现源码.rar
- 国密SM2 / SM3 / SM4 / SM9 / ZUC算法的官方
- windows64的curl库支持openssl)
- openssl(arm64armv7sarmv7x86_64i386)
- 国密算法SM2 SM3 SM4相关算法及推荐参数
- openssl-1.0.2k
- openssl-1.0.2n.tar.gz
评论
共有 条评论