資源簡介
利用miracl.lib 大數庫實現SM2加解密算法。SM2橢圓曲線加密解密,在博客里有實現的效果
代碼片段和文件信息
#include?
#include?
#include?
#include?“sm2.h“
#include?
#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?=?{
“FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF“//p
“FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC“//a
“28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93“//b
“FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123“//n
“32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7“//Gx
“BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0“//Gy
};
#define?SEED_CONST?0x1BD8C95A
//秘鑰生成函數
void?sm2_keygen(unsigned?char?*wx?int?*wxlen?unsigned?char?*wy?int?*wylen?unsigned?char?*privkey?int?*privkeylen)
{
struct?FPECC?*cfig?=?&Ecc256;
epoint?*g;
big?a?b?p?n?x?y?key1;
miracl?*mip?=?mirsys(20?0);
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(p?cfig->p);
cinstr(a?cfig->a);
cinstr(b?cfig->b);
cinstr(n?cfig->n);
cinstr(x?cfig->x);
cinstr(y?cfig->y);
//初始化橢圓曲線
ecurve_init(a?b?p?MR_PROJECTIVE);
g?=?epoint_init();
epoint_set(x?y?0?g);
//初始化隨機種子
irand(time(NULL)?+?SEED_CONST);
bigrand(n?key1);?//隨機數dB
ecurve_mult(key1?g?g);//倍點運算后的g點即為PB
epoint_get(g?x?y);//得到PB的x和y坐標
*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)
{
unsigned?char?buf[70];
unsigned?char?digest[32];
unsigned?int?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? {
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++;
}
if?(n?!=?0)
{
buf[64]?=?(ct?>>?24)?&?0xFF;
buf[65]?=?(ct?>>?16)?&?0xFF;
buf[66]?=?(ct?>>?8)?&?0xFF;
buf[67]?=?ct?&?0xFF;
sm3(buf?68?digest);
}
memcpy(p?digest?n);
for?(i?=?0;?i? {
if?(kbuf[i]?!=?0)
break;
}
if?(i? return?1;
else
return?0;
}
int?sm2_encrypt(unsigned?char?*msg?int?msglen?unsigned?char?*wx?int?wxlen?unsigned?char?*wy?int?wylen?unsigned?char?*outmsg)
{
struct?FPECC?*cfig?=?&Ecc256;
big?x2?y2?c1?c2?k;
big?a?b?p?n?x?y;
epoint?*g?*w;
int?ret?=?-1;
int?i;
unsigned?char?zl[32]?zr[32];
unsigned?char?*tmp;
miracl?*mip;
tmp?=?malloc(msglen?+
評論
共有 條評論