miracl实现sm2

这篇博客讲述了作者在Windows环境下使用MIRACL库实现SM2加密算法的过程,遇到与ECDSA加解密不匹配的问题。由于时间紧迫,作者决定转向Linux环境进行调试,并表达了对加入讨论会和有人指导的渴望。
摘要由CSDN通过智能技术生成

没有被注释掉的是miracl实现的sm2,被注释掉的是ECDSA,加解密没对上,不知道哪里出了问题。不想debug了。
我要抓紧时间写毕设。
就调个linux下面的sm2练练手吧。

伤心。

以下代码是win上写的。linux下面稍微有些不同。

Win环境的代码如下

#include <stdio.h>
#include "big.h"
#include "miracl.h"
#include "ecn.h"
#include "string.h"
#include "mirdef.h"
#include <time.h>
#include "typedef.h"
#include <ctime>

typedef struct
{
   
	big r;
	big s;
}digital_sign;//签名的结果的结构体

//定义参数
static const char sm2_p[] = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF";
static const char sm2_a[] = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC";
static const char sm2_b[] = "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93";
static const char sm2_n[] = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123";
static const char sm2_Gx[] = "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7";
static const char sm2_Gy[] = "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0";
//声明静态变量 全局变量
static big g_p;
static big g_a;
static big g_b;
static big g_n;
static big g_nb;   //私钥
static epoint* g_Q;//公钥
static epoint* g_G;//椭圆曲线的基点

void ECDSA_Initialize(miracl* pm)
{
   
	pm->IOBASE = 16;//说明是十六进制
	g_p = mirvar(0);
	g_a = mirvar(0);
	g_b = mirvar(0);
	g_n = mirvar(0);
	cinstr(g_p, (char*)sm2_p);
	cinstr(g_a, (char*)sm2_a);
	cinstr(g_b, (char*)sm2_b);
	cinstr(g_n, (char*)sm2_n);

	ecurve_init(g_a, g_b, g_p, MR_AFFINE);

	big tmp_x = mirvar(0);
	big tmp_y = mirvar(0);
	cinstr(tmp_x, (char*)sm2_Gx);
	cinstr(tmp_y, (char*)sm2_Gy);
	g_G = epoint_init();//将内存分配给GF(p)椭圆曲线上的一个点,并将其初始化为“无穷大点”。
	if (!epoint_set(tmp_x, tmp_y, 1, g_G))
	{
   
		exit(0);
	}

	//私钥
	g_nb = mirvar(0);
	irand(time(NULL));
	bigbits(256, g_nb);//256bit

	while (mr_compare(g_nb, g_n) >= 0)//私钥nb要比n小
	{
   
		bigbits(256, g_nb);
	}

	//公钥
	g_Q = epoint_init();
	ecurve_mult(g_nb, g_G, g_Q);
	//FILE* stream;//输入到文件中,用于生成含有用户标识的za
	//stream = fopen("transfer.txt", "r+");
	//otnum(g_a, stream);
	//otnum(g_b, stream);
	//otnum(g_G->X, stream);
	//otnum(g_G->Y, stream);
	//otnum(g_Q->X, stream);
	//otnum(g_Q->Y, stream);
	//fclose(stream);
	//FILE* stream2;//私钥保存
	//stream2 = fopen("secret.txt", "r+");
	//otnum(g_nb, stream2);
	//fclose(stream2);
}
void ShaTest()
{
   
	sha256 sha123;
	shs256_init(&sha123);
	char lpStr[] = "1234567890abcdef1234567890abcdef优雅人生www.dllhook.com";
	char szSha[32] = {
    0 };
	char* lpStr_ = lpStr;
	printf("明文:%s\n", lpStr);
	while (*lpStr_ != 0)
		shs_process(&sha123, *lpStr_++);
	shs_hash(&sha123, szSha);
	printf("SHA256:");
	for (int i = 0; i < 32; i++)
	{
   
		if (szSha[i] == 0)
			break;

		printf("%.2X", (unsigned char)szSha[i]);
	}
	printf("\n");
}
//digital_sign ECDSA_Sign( miracl* pm, big e_b)
//{
   
//
//
//	big k = mirvar(0);//A3:用随机数发生器产生随机数k ∈[1,n-1];
//	irand(time(NULL));
//	bigrand(g_n, k);
//
//	epoint* kk = epoint_init();
//	ecurve_mult(k, g_G, kk);// A4:计算椭圆曲线点(x 1, y 1) = [k]G
//	big z = mirvar(0);
//	z = kk->X;
//	divide(z, g_n, g_n);
//	while (z == 0) //计算r=z modn,若r=0则返回第一步;
//	{
   
//		irand(time(NULL));
//		bigrand(g_n, k);
//		ecurve_mult(k, g_G, kk);
//		z = kk->X;
//		divide(z, g_n, g_n);
//	}
//	digital_sign a;
//	a.r = mirvar(0);
//	a.s = mirvar(0);
//	//big e_b = mirvar(0);
//	pm->IOBASE = 16;//说明是十六进制//r计算完毕
//	
//	big tmp_rd = mirvar(0);
//
//	multiply(g_nb, a.r, tmp_rd);//计算s = k(e+dr)mod n
//	add(tmp_rd, e_b, tmp_rd);
//	multiply(k, tmp_rd, tmp_rd);
//	divide(tmp_rd, g_n, g_n);//mod n
//	a.s = tmp_rd;
//	while (0 == a.s) //A6:若s=0则返回A3;
//	{
   
//		irand(time(NULL));
//		bigrand(g_n, k);
//		ecurve_mult(k, g_G, kk);
//		z = kk->X;
//		divide(z, g_n, g_n);
//		while (z == 0) //计算r=z modn,若r=0则返回第一步;
//		{
   
//			irand(time(NULL));
//			bigrand(g_n, k);
//			ecurve_mult(k, g_G, kk);
//			z = kk->X;
//			divide(z, g_n, g_n);
//		}
//		multiply(g_nb, a.r, tmp_rd);//计算s = k(e+dr)mod n
//		add(tmp_rd, e_b, tmp_rd);
//		multiply(k, tmp_rd, tmp_rd);
//		divide(tmp_rd, g_n, g_n);//mod n
//		a.s = tmp_rd;
//	}//r/s计算完毕 
//		add(a.s, g_n, a.s);
//	divide(a.s, g_n, g_n);
//	return a;
//}
digital_sign ECDSA_Sign(miracl* pm, big e_b)
{
   


	big k = mirvar(0);//A3:用随机数发生器产生随机数k ∈[1,n-1];
	irand(time(NULL));
	bigrand(g_n, k);

	epoint* kk = epoint_init();
	ecurve_mult(k, g_G, kk);// A4:计算椭圆曲线点(x 1, y 1) = [k]G

	digital_sign a;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值