• 大小: 6KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: 其他
  • 标签: sm2  vc6  miracl  

资源简介

国密SM2是非对称密码算法,是基于ECC算法的非对称算法(需要添加miracle库)

资源截图

代码片段和文件信息

#include 
#include 
#include
#include 
#include 
#include “sm2.h“

#define SM2_PAD_ZERO TRUE
#define SM2_DEBUG   0
struct FPECC{
char *p;
char *a;
char *b;
char *n;
char *x;
char *y;
};
/*SM2*/
struct FPECC Ecc256 = {
“8542D69E4C044F18E8B92435BF6FF7DE457283915C45517D722EDB8B08F1DFC3“
“787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E498“
“63E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A“
“8542D69E4C044F18E8B92435BF6FF7DD297720630485628D5AE74EE7C32E79B7“
“421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D“
“0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2“
};
unsigned char radom1[] = { 0x4C0x620xEE0xFD0x6E0xCF0xC20xB90x5B0x920xFD0x6C0x3D0x950x750x140x8A0xFA0x170x420x550x460xD40x900x180xE50x380x8D0x490xDD0x7B0x4F };
void PrintBuf(unsigned char *buf int buflen)
{
int i;
for (i = 0; i < buflen; i++) {
if (i % 32 != 31)
printf(“%02x“ buf[i]);
else
printf(“%02x\n“ buf[i]);
}
printf(“\n“);
//return 0;
}
void Printch(unsigned char *buf int buflen)
{
int i;
for (i = 0; i < buflen; i++) {
if (i % 32 != 31)
printf(“%c“ buf[i]);
else
printf(“%c\n“ buf[i]);
}
printf(“\n“);
//return 0;
}

void sm2_keygen(unsigned char *wx int *wxlen unsigned char *wy int *wylenunsigned char *privkey int *privkeylen)
{

struct FPECC *cfig = &Ecc256;
epoint *g;
    big abpnxykey1;
    miracl *mip = mirsys(200);
    mip->IObase = 16;
    p = mirvar(0);
a = mirvar(0);
    b = mirvar(0);
    n = mirvar(0);
    x = mirvar(0);
    y = mirvar(0);
    key1 = mirvar(0);
    cinstr(pcfig->p);
cinstr(acfig->a);
    cinstr(bcfig->b);
cinstr(ncfig->n);
cinstr(xcfig->x);
    cinstr(ycfig->y);
ecurve_init(abpMR_PROJECTIVE);
    g = epoint_init();
    epoint_set(xy0g); 
    irand(time(NULL));
    bigrand(nkey1);   ////私钥db
    ecurve_mult(key1gg); //计算Pb
    epoint_get(gxy);
    *wxlen = big_to_bytes(32 x (char *)wx TRUE);
    *wylen = big_to_bytes(32 y (char *)wy TRUE);
*privkeylen = big_to_bytes(32 key1 (char *)privkey TRUE);
mirkill(key1);
mirkill(p);
mirkill(a);
mirkill(b);
mirkill(n);
mirkill(x);
mirkill(y);
epoint_free(g);
mirexit();
}
int kdf(unsigned char *zl unsigned char *zr int klen unsigned char *kbuf)
{
/*
return 0: kbuf = 0 不可
   1: kbuf 可
*/
unsigned char buf[70];
unsigned char digest[32];
unsigned int ct = 0x00000001; //初始化一个32比特构成的计数器ct=0x00000001
int i m n;
unsigned char *p;
memcpy(buf zl 32);
memcpy(buf+32 zr 32);
m = klen / 32;
n = klen % 32;
p = kbuf;
for(i = 0; i < m; i++)
{
buf[64] = (ct >> 24) & 0xFF;
buf[65] = (ct >> 16) & 0xFF;
buf[66] = (ct >> 8) & 0xFF;
buf[67] = ct & 0xFF;
sm3(buf 68 p);
p += 32;
ct++;
}
/*对i从1到?klen/v?执行:b.1)计算Hai=Hv(Z ∥ ct);b.2) ct++*/
if(n != 0)
{
b

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        1591  2019-01-05 14:25  sm2.h
     文件        5431  2019-01-05 14:27  sm3.c
     文件         960  2019-01-05 14:26  sm3.h
     文件        9093  2019-01-05 14:56  sm2.c

评论

共有 条评论