没有被注释掉的是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;