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
#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下载服务。
相关推荐: