第一范文网 - 专业文章范例文档资料分享平台

SM2算法

来源:用户分享 时间:2019-05-09 本文由拧巴小姐 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

SM2算法实现

说明:

1、 纯源码无库实现,编译环境:VC++ 6,建立控制台程序把程序文件加入编译即可

2、 源码文件包括:main.cpp,SM2.cpp,HashSM3.cpp,Random.cpp,VLONG.cpp

头文件: AlgDump.h,AlgUtil.h,SM2.h,cfg_w32.h,cos_type.h,CryptoErr.h,HashSM3.h,Random.h,TypeDef.h,UniError.h,VLONG.h

3、 算法实现功能:

1)、SM2加密 2)、SM2解密 3)、SM2签名 4)、SM2验签

下载后如果有使用问题联系QQ: 1900109344

源码 SM2算法例程(main.cpp,SM2.cpp,HashSM3.cpp,Random.cpp,VLONG.cpp,AlgDump.h,AlgUtil.h,SM2.h,cfg_w32.h,cos_type.h,CryptoErr.h,HashSM3.h,Random.h,TypeDef.h,UniError.h,VLONG.h)

Main.cpp

#include #include #include

#define ECC_BITS 256

#define ECC_DATA_BYTES VL_DATA_BYTES(ECC_BITS)

#if ECC_BITS > ECC_DATA_BITS_MAX #error #endif

void PrintError( DWORD ErrCode ) { }

extern \ mem_xor( void *dst, const void *src1, const void *src2, int nBytes ) {

PBYTE pDst = (PBYTE) dst; PCBYTE pSrc1 = (PCBYTE) src1; PCBYTE pSrc2 = (PCBYTE) src2;

while( nBytes-- )

*pDst++ = (*pSrc1++) ^ (*pSrc2++); }

extern \ memchk( void *pBuff, int bByte, int nSize ) {

int i;

PCBYTE pByte = (PCBYTE) pBuff;

for( i = 0; i < nSize; i++, pByte++ ) {

if( *pByte != bByte ) return 0; // false }

return 1; // true }

extern \ HEX_VAL( int c ) {

if( c >= '0' && c <= '9' ) return (c-'0');

if( c >= 'a' && c <= 'f' ) return (c-'a'+10);

if( c >= 'A' && c <= 'F' ) return (c-'A'+10); return -1; }

#define IS_HEX(c) ( ((c)>='0'&&(c)<='9') || ((c)>='a'&&(c)<='f') || ((c)>='A'&&(c)<='F') )

extern \ LoadHex( unsigned char *abBuf, const char *szHex ) {

unsigned char c, v; unsigned long n;

for( n = 0; *szHex != '\\0'; ) { do

{ c = *szHex++; } while( c == ' ' );

if( c == '\\0' || !IS_HEX(c) ) break;

v = HEX_VAL(c) << 4; do

{ c = *szHex++; } while( c == ' ' ); if( IS_HEX(c) )

v |= HEX_VAL(c); abBuf[n++] = v;

if( c == '\\'0' || !IS_HEX(c) )

break; }

return n; }

extern \ memswap( void *ptr, int nBytes ) {

PBYTE pBuf = (PBYTE) ptr; BYTE bTmp; int i;

for( i=0; i

bTmp = pBuf[i];

pBuf[i] = pBuf[nBytes-1-i]; pBuf[nBytes-1-i] = bTmp; } }

void main( void ) {

ECC_PUB_KEY PubKey; ECC_PRV_KEY PrvKey;

BYTE abPlain[ECC_PLAIN_BYTES_MAX];

BYTE abCipher[ECC_CIPHER_SIZE(ECC_BITS,ECC_PLAIN_BYTES_MAX)]; BYTE abDecrypted[ECC_PLAIN_BYTES_MAX]; DWORD dwCipherSize, dwDecryptSize; BYTE Za[SM3_DIGESTSIZE]; BYTE E[SM3_DIGESTSIZE]; ECC_SIGN sign; ECC_CNTX cntx; DWORD ErrCode;

ECC_Init( &cntx, ECC_BITS );

printf( \

ECC_KeyGenerate( &cntx, &PrvKey, &PubKey );

printf( \

ErrCode = ECC_CheckPubKey( &cntx, &PubKey ); PrintError( ErrCode ); if( ErrCode != ERR_OK ) return;

printf( \

RAND_FillRandom( abPlain, sizeof(abPlain) ); memset( abCipher, 0x00, sizeof(abCipher) );

printf( \

ErrCode = ECC_Encrypt( &cntx, abPlain, sizeof(abPlain), &PubKey, abCipher, &dwCipherSize ); //SM2 加密

PrintError( ErrCode ); if( ErrCode != ERR_OK ) return;

printf( \

ErrCode = ECC_Decrypt( &cntx, abCipher, dwCipherSize, &PrvKey, abDecrypted, &dwDecryptSize ); //SM2 解密

PrintError( ErrCode ); if( ErrCode != ERR_OK ) return;

if( dwDecryptSize == sizeof(abPlain) &&

memcmp( abDecrypted, abPlain, sizeof(abPlain) ) == 0 ) printf( \ CMP: OK \\r\\n\ else

{ printf( \ CMP: Failed\\r\\n\ return; }

printf( \#if 0

RAND_FillRandom( E, SM3_DIGESTSIZE ); #else

ErrCode = ECC_GetZA( &cntx, (PCBYTE)\ PrintError( ErrCode ); if( ErrCode != ERR_OK ) return;

ErrCode = ECC_GetE( (PCBYTE) \ PrintError( ErrCode ); if( ErrCode != ERR_OK ) return; #endif

ErrCode = ECC_Sign( &cntx, E, &PrvKey, &sign ); //SM2签名 PrintError( ErrCode ); if( ErrCode != ERR_OK ) return;

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新综合文库SM2算法全文阅读和word下载服务。

SM2算法.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/171959.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top