硬件动态令牌特性动态口令生成算法C语言实现用例计算输入输出用例Word文档格式.docx

上传人:b****2 文档编号:14977936 上传时间:2022-10-26 格式:DOCX 页数:19 大小:20.73KB
下载 相关 举报
硬件动态令牌特性动态口令生成算法C语言实现用例计算输入输出用例Word文档格式.docx_第1页
第1页 / 共19页
硬件动态令牌特性动态口令生成算法C语言实现用例计算输入输出用例Word文档格式.docx_第2页
第2页 / 共19页
硬件动态令牌特性动态口令生成算法C语言实现用例计算输入输出用例Word文档格式.docx_第3页
第3页 / 共19页
硬件动态令牌特性动态口令生成算法C语言实现用例计算输入输出用例Word文档格式.docx_第4页
第4页 / 共19页
硬件动态令牌特性动态口令生成算法C语言实现用例计算输入输出用例Word文档格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

硬件动态令牌特性动态口令生成算法C语言实现用例计算输入输出用例Word文档格式.docx

《硬件动态令牌特性动态口令生成算法C语言实现用例计算输入输出用例Word文档格式.docx》由会员分享,可在线阅读,更多相关《硬件动态令牌特性动态口令生成算法C语言实现用例计算输入输出用例Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。

硬件动态令牌特性动态口令生成算法C语言实现用例计算输入输出用例Word文档格式.docx

使用GB/T2423.9-2001,严酷等级选择温度:

30℃±

2℃,相对湿度93%±

3%,试验时间:

工作海拔

使用GB/T2423.21-1991,严酷等级选择气压:

55kPa,持续时间:

跌落

使用GB/T2423.8-1995中方法一,严酷等级选择跌落高度:

1000mm。

防尘防水

遵守GB/T4208-2008中IP44的要求。

标记和印刷

使用GB/T2423.53-2005,试验液体:

人工合成汗液,力的大小:

1N±

0.2N,循环次数:

1000次。

产品必须具备标记文字为:

“序列号”和“有效期”。

振动

使用GB/T2423.10-2008,严酷等级选择频率范围:

10Hz到300Hz,振动幅值:

3.5mm,持续时间:

60min。

静电放电

不低于GB/T17626.2-2006中试验等级3的标准,即满足外壳端口接触放电±

6kV,空气放电±

8kV。

试验过程中试验样品是否处于工作状态的判断标准

样品带电运行,目视检查,提供最少12个显示相同动态口令的样品,6个一组为参与试验样品,6个一组为不参与试验样品,参与试验的样品显示动态口令与不参与试验样品一致即为合格。

A.2 令牌安全特性

种子密钥安全

种子密钥为令牌重要安全要素,令牌必须保证产品内的种子密钥的完整性,且种子密钥为单向导入令牌(或在令牌内生成),种子密钥不能被导出产品外部。

令牌必须拥有种子密钥的保护功能。

令牌种子密钥加密、存储、使用在令牌芯片的安全区域内实现。

令牌芯片安全

本标准涉及的令牌芯片,应是国家密码管理局批准产品型号证书的安全芯片。

令牌物理安全

令牌具有低电压检测功能。

令牌完成种子密钥导入后,通讯I/O端口应失效,不能再输入或输出信息,包括但不限于内部参与口令生成运算的K、T、C信息。

令牌应防范通过物理攻击的手段获取设备内的敏感信息,物理攻击的手段包括但不限于开盖、搭线、复制等。

令牌芯片必须具备令牌掉电后,会自动销毁种子密钥的措施。

令牌芯片应保证种子密钥无法通过外部或内部的方式读出,包括但不限于:

调试接口、改编的程序。

令牌芯片可防范通过物理攻击的手段获取芯片内的敏感信息,确保种子密钥和算法程序的安全性。

令牌芯片应具备抵抗旁路攻击的能力,包括但不限于:

抗SPA/DPA攻击能力,抗SEMA/DEMA攻击能力。

在外部环境发生变化时,令牌芯片不应泄漏敏感信息或影响安全功能。

外部环境的变化包含但不限于:

高低电压、高低温、强光干扰、电磁干扰、紫外线干扰、静电干扰。

使用安全

具有数字和功能按键的令牌必须具有PIN保护功能,PIN长度不少于6位,并具有PIN防暴力穷举功能。

令牌可具有PIN找回功能,即令牌用户如果忘记令牌PIN,可通过安全有效的环境与机制找回令牌PIN,或对令牌PIN进行重新设置(如远程解PIN)。

PIN输入错误的次数不可超过5次,若超过,应至少等待1h才可继续尝试。

PIN输入超过最大尝试次数的情况不可超过5次,否则令牌应永久锁定,不可再使用。

令牌基本使用寿命为3年,令牌产品最长使用不超过5年。

室温环境下,令牌时间偏差小于2min/年。

安全评估

动态令牌产品安全评估遵守以下国标规定:

GB/T18336.1-2008

GB/T18336.2-2008

GB/T18336.3-2008

GB/T21079.1-2007

附 录 B

(资料性附录)

动态口令生成算法C语言实现用例

B.1 采用SM3的动态口令生成算法用例

#include<

stdio.h>

string.h>

math.h>

#include"

sm3.h"

sm_dpwd.h"

#ifdef__cplusplus

#defineINLINEinline

#else

#defineINLINE

#endif

INLINEboolIsBigEndian()

{

unionT

{

charc[2];

shorts;

};

Tt;

t.s=0x0031;

if(t.c[1]==0x31)

returntrue;

}

returnfalse;

}

INLINEboolIsLittleEndian()

return!

IsBigEndian();

INLINEuint32Reverse32(uint32x)

return((x&

0x000000ff)<

<

24)

|((x&

0x0000ff00)<

8)

0x00ff0000)>

>

0xff000000)>

24);

INLINEuint64Reverse64(uint64x)

uint32nTemp[3]={0};

memcpy(nTemp+1,&

x,sizeof(uint64));

nTemp[0]=Reverse32(nTemp[2]);

nTemp[1]=Reverse32(nTemp[1]);

return*(uint64*)nTemp;

INLINEsm_wordML(byteX,uint8j)

if(IsBigEndian())

return(sm_word)(X<

(j%32));

else

returnReverse32((sm_word)(X<

(j%32)));

INLINEsm_wordSUM(sm_wordX,sm_wordY)

return(X+Y);

returnReverse32(Reverse32(X)+Reverse32(Y));

intTruncateSM3(INbytepSrc[32],INintnSrcLen,OUTbytepDst[4],INintnDstSize)

if(nSrcLen!

=32||nDstSize<

4)

return-1;

memset(pDst,0,nDstSize);

byte*S=(byte*)pSrc;

sm_wordS1=ML(S[0],24)|ML(S[1],16)|ML(S[2],8)|ML(S[3],0);

sm_wordS2=ML(S[4],24)|ML(S[5],16)|ML(S[6],8)|ML(S[7],0);

sm_wordS3=ML(S[8],24)|ML(S[9],16)|ML(S[10],8)|ML(S[11],0);

sm_wordS4=ML(S[12],24)|ML(S[13],16)|ML(S[14],8)|ML(S[15],0);

sm_wordS5=ML(S[16],24)|ML(S[17],16)|ML(S[18],8)|ML(S[19],0);

sm_wordS6=ML(S[20],24)|ML(S[21],16)|ML(S[22],8)|ML(S[23],0);

sm_wordS7=ML(S[24],24)|ML(S[25],16)|ML(S[26],8)|ML(S[27],0);

sm_wordS8=ML(S[28],24)|ML(S[29],16)|ML(S[30],8)|ML(S[31],0);

sm_wordOD=SUM(SUM(SUM(SUM(SUM(SUM(SUM(S1,S2),S3),S4),S5),S6),S7),S8);

memcpy(pDst,&

OD,sizeof(sm_word));

return0;

#defineSM_DPWD_KEY_LEN_MIN(128/8)

#defineSM_DPWD_CHALLENGE_LEN_MIN(4)

#defineSM_DPWD_LEN_MAX(10)

#defineSM_HASH_OUT_LEN(32)

intSM3_DPasswd(INbyte*pKey,INintnKeyLen,INuint64*pTime,INuint64*pInterval,INuint32*pCounter,

INchar*pChallenge,INintnGenLen,OUTchar*pDynPwd,INintnDynPwdSize)

if(pKey==NULL||(pTime==NULL&

&

pCounter==NULL&

pChallenge==NULL)

||pDynPwd==NULL||nKeyLen<

SM_DPWD_KEY_LEN_MIN||nGenLen>

SM_DPWD_LEN_MAX

||(pChallenge!

=NULL&

strlen(pChallenge)<

SM_DPWD_CHALLENGE_LEN_MIN)

||nDynPwdSize<

nGenLen+1)

returnSM_DPWD_PARAM_ERROR;

memset(pDynPwd,0,nDynPwdSize);

//T=To/Tc

if(pTime!

pInterval!

*pInterval!

=0)

*pTime=(*pTime)/(*pInterval);

//Converttobig-endian.

if(!

IsBigEndian())

=NULL)

*pTime=Reverse64(*pTime);

if(pCounter!

*pCounter=Reverse32(*pCounter);

intoffset=0;

byte*sm_i=NULL;

bytesm_o[SM_HASH_OUT_LEN]={0};

intsm_i_len=0;

intsm_o_len=sizeof(sm_o);

uint32pwd={0};

//ID(T|C|Q)Lengthatleast128bits

sm_i_len=(pTime?

sizeof(ui

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1