1. 程式人生 > >2018-04-08橢圓曲線測試程式

2018-04-08橢圓曲線測試程式

曲線sm2p256v1基於ANSI X9.62 elliptic curve prime256v1 (aka secp256r1, NIST P-256)

橢圓曲線 NID

  • NID_X9_62_prime256v1
  • NID_sm2p256v1
    (256 bit prime)
    _EC_SM2_PRIME_256V1
  • NID_sm2b257v1 曲線方程f(x) = x^257 + x^12 + 1
    257位元二進位制域橢圓曲線域引數
  • NID_wapi192v1
    (WAPI curve over a 192 bit prime field)
typedef struct {
    int field_type;             /* either NID_X9_62_prime_field or
                                 * NID_X9_62_characteristic_two_field */
    int seed_len;
    int param_len;
    unsigned int cofactor;      /* promoted to BN_ULONG */
} EC_CURVE_DATA;
#ifndef OPENSSL_NO_SM2
static const struct {
    EC_CURVE_DATA h;
    unsigned char data[0 + 32 * 6];
} _EC_SM2_PRIME_256V1 = {
    {
        NID_X9_62_prime_field, 0, 32, 1
    },
    {
        /* no seed */
        /* p */
        0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        /* a */
        0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
        /* b */
        0x28, 0xE9, 0xFA, 0x9E, 0x9D, 0x9F, 0x5E, 0x34, 0x4D, 0x5A, 0x9E, 0x4B,
        0xCF, 0x65, 0x09, 0xA7, 0xF3, 0x97, 0x89, 0xF5, 0x15, 0xAB, 0x8F, 0x92,
        0xDD, 0xBC, 0xBD, 0x41, 0x4D, 0x94, 0x0E, 0x93,
        /* x */
        0x32, 0xC4, 0xAE, 0x2C, 0x1F, 0x19, 0x81, 0x19, 0x5F, 0x99, 0x04, 0x46,
        0x6A, 0x39, 0xC9, 0x94, 0x8F, 0xE3, 0x0B, 0xBF, 0xF2, 0x66, 0x0B, 0xE1,
        0x71, 0x5A, 0x45, 0x89, 0x33, 0x4C, 0x74, 0xC7,
        /* y */
        0xBC, 0x37, 0x36, 0xA2, 0xF4, 0xF6, 0x77, 0x9C, 0x59, 0xBD, 0xCE, 0xE3,
        0x6B, 0x69, 0x21, 0x53, 0xD0, 0xA9, 0x87, 0x7C, 0xC6, 0x2A, 0x47, 0x40,
        0x02, 0xDF, 0x32, 0xE5, 0x21, 0x39, 0xF0, 0xA0,
        /* order */
        0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x03, 0xDF, 0x6B, 0x21, 0xC6, 0x05, 0x2B,
        0x53, 0xBB, 0xF4, 0x09, 0x39, 0xD5, 0x41, 0x23
    }
};

static const struct {
    EC_CURVE_DATA h;
    unsigned char data[0 + 24 * 6];
} _EC_WAPI_PRIME_192V1 = {
    {
        NID_X9_62_prime_field, 0, 24, 1
    },
    {
        /* no seed */
        /* p */
        0xBD, 0xB6, 0xF4, 0xFE, 0x3E, 0x8B, 0x1D, 0x9E, 0x0D, 0xA8, 0xC0, 0xD4,
        0x6F, 0x4C, 0x31, 0x8C, 0xEF, 0xE4, 0xAF, 0xE3, 0xB6, 0xB8, 0x55, 0x1F,
        /* a */
        0xBB, 0x8E, 0x5E, 0x8F, 0xBC, 0x11, 0x5E, 0x13, 0x9F, 0xE6, 0xA8, 0x14,
        0xFE, 0x48, 0xAA, 0xA6, 0xF0, 0xAD, 0xA1, 0xAA, 0x5D, 0xF9, 0x19, 0x85,
        /* b */
        0x18, 0x54, 0xBE, 0xBD, 0xC3, 0x1B, 0x21, 0xB7, 0xAE, 0xFC, 0x80, 0xAB,
        0x0E, 0xCD, 0x10, 0xD5, 0xB1, 0xB3, 0x30, 0x8E, 0x6D, 0xBF, 0x11, 0xC1,
        /* x */
        0x4A, 0xD5, 0xF7, 0x04, 0x8D, 0xE7, 0x09, 0xAD, 0x51, 0x23, 0x6D, 0xE6,
        0x5E, 0x4D, 0x4B, 0x48, 0x2C, 0x83, 0x6D, 0xC6, 0xE4, 0x10, 0x66, 0x40,
        /* y */
        0x02, 0xBB, 0x3A, 0x02, 0xD4, 0xAA, 0xAD, 0xAC, 0xAE, 0x24, 0x81, 0x7A,
        0x4C, 0xA3, 0xA1, 0xB0, 0x14, 0xB5, 0x27, 0x04, 0x32, 0xDB, 0x27, 0xD2,
        /* order */
        0xBD, 0xB6, 0xF4, 0xFE, 0x3E, 0x8B, 0x1D, 0x9E, 0x0D, 0xA8, 0xC0, 0xD4,
        0x0F, 0xC9, 0x62, 0x19, 0x5D, 0xFA, 0xE7, 0x6F, 0x56, 0x56, 0x46, 0x77,
    }
};
#endif
static EC_NIST_NAME nist_curves[] = {
    {"B-163", NID_sect163r2},
    {"B-233", NID_sect233r1},
    {"B-283", NID_sect283r1},
    {"B-409", NID_sect409r1},
    {"B-571", NID_sect571r1},
    {"K-163", NID_sect163k1},
    {"K-233", NID_sect233k1},
    {"K-283", NID_sect283k1},
    {"K-409", NID_sect409k1},
    {"K-571", NID_sect571k1},
    {"P-192", NID_X9_62_prime192v1},
    {"P-224", NID_secp224r1},
    {"P-256", NID_X9_62_prime256v1}, // X9.62 elliptic curve prime256v1 也稱 secp256r1 或 NIST P-256
    {"P-384", NID_secp384r1},
    {"P-521", NID_secp521r1},
    {"SM2",   NID_sm2p256v1}
};
// prime, a, b
    BIGNUM *p = NULL;
    BIGNUM *a = NULL;
    BIGNUM *b = NULL;

// affine coordinates G x y 
    EC_POINT *G = NULL;
    BIGNUM *x = NULL;
    BIGNUM *y = NULL;

// generator
    BIGNUM *n = NULL;
    BIGNUM *h = NULL;

EC_GROUP相關函式

  • EC_GROUP_set_generator(group, G, n, h);
  • EC_GROUP *EC_GROUP_new_by_curve_name(NID_sm2p256v1);
  • EC_GROUP *EC_GROUP_new(EC_GFp_mont_method());
  • EC_GROUP_set_curve_GFp(EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, ctx);
  • EC_GROUP *EC_GROUP_new_curve_GFp(BIGNUM *p, BIGNUM *a, BIGNUM *b, ctx);
  • EC_GROUP *EC_GROUP_new_curve_GF2m(p, a, b, ctx);

EC_POINT 相關函式

  • EC_POINT *G = EC_POINT_new(group);
  • EC_POINT_set_affine_coordinates_GFp(group, G, x, y, ctx);
  • EC_POINT_set_affine_coordinates_GF2m(group, G, x, y, ctx);

EC_KEY相關函式, 包括橢圓曲線金鑰生成並計算曲線ZA值32位元組

  • EC_KEY *EC_KEY_new_by_curve_name(NID_sm2p256v1);
  • EC_KEY_generate_key(EC_KEY *);
  • 國密附加函式EC_KEY_compute_za(za)
    unsigned char za[32];
    除錯錯誤碼#define EC_F_EC_KEY_COMPUTE_ZA 501 /* Extension */
  • 國密附加函式EC_KEY_compose_pkey_data(unsigned char *buf, int buflen, EC_KEY *ec_key);
    除錯錯誤碼#define EC_F_EC_KEY_COMPOSE_PKEY_DATA 500 /* Extension */

舊版ECDSA簽名相關函式

  • ECDSA_SIG *sig = ECDSA_do_sign(...)
  • ECDSA_do_verify(...)

新版ECDSA簽名相關函式, 注意字尾帶_ex的函式需要指定曲線引數k和x

  • ECDSA_sign_setup(EC_KEY *, BN_CTX *, BIGNUM **k, BIGNUM **x);
  • ECDSA_SIG *sig = ECDSA_do_sign_ex();
  • ECDSA_do_verify(...);

BIGNUM 相關函式

  • BN_CTX *ctx = BN_CTX_new();

附 測試程式

本程式已經過時, 僅供參考
curve_name: NID_sm2t257v1
curve_name: NID_sm2p256v1

#include <openssl/ec.h>
#include <openssl/evp.h>
#include <openssl/bn.h>

int main(int argc, char **argv)
{
    char *prog = basename(argv[0]);
    EC_GROUP *ec_group = NULL;
    EC_KEY *ec_key = NULL;
    BN_CTX *ctx = BN_CTX_new();
    const char *id = "[email protected]";
    unsigned char za[32];
    BIGNUM *k = NULL;
    BIGNUM *x = NULL;
    ECDSA_SIG *sig = NULL;
    unsigned char dgst[20] = "abc"; 
    int ret;

    if (!(ec_group = EC_GROUP_new_by_curve_name(NID_sm2t257v1))) {
        fprintf(stderr, "%s: no such curve\n", prog);
        return -1;
    }
    if (!(ec_key = EC_KEY_new_by_curve_name(NID_sm2p256v1))) {
        fprintf(stderr, "%s: %s %d\n", prog, __FUNCTION__, __LINE__);
        return -1;
    }
    if (!EC_KEY_generate_key(ec_key)) {
        ERR_print_errors_fp(stderr);
        return -1;
    }

    
    if ((ret = EC_KEY_compute_za(za, EVP_sha256(), id, strlen(id), ec_key)) < 0) {
        ERR_print_errors_fp(stderr);
        return -1;
    }
    printf("Za length = %d\n", ret);

    if (!(sig = ECDSA_do_sign(dgst, sizeof(dgst), ec_key))) {
        ERR_print_errors_fp(stderr);
        return -1;
    }
    if ((ret = ECDSA_do_verify(dgst, sizeof(dgst), sig, ec_key)) < 0) {
        ERR_print_errors_fp(stderr);
        return -1;
    }
    printf("result = %d\n", ret);

    if (!ECDSA_sign_setup(ec_key, ctx, &k, &x)) {
        ERR_print_errors_fp(stderr);
        return -1;
    }
    if (!(sig = ECDSA_do_sign_ex(dgst, sizeof(dgst), k, x, ec_key))) {
        ERR_print_errors_fp(stderr);
        return -1;
    }
    if ((ret = ECDSA_do_verify(dgst, sizeof(dgst), sig, ec_key)) < 0) {
        ERR_print_errors_fp(stderr);
        return -1;
    }
    printf("result = %d\n", ret);

    
    return 0;
}

相關推薦

2018-04-08橢圓曲線測試程式

曲線sm2p256v1基於ANSI X9.62 elliptic curve prime256v1 (aka secp256r1, NIST P-256) 橢圓曲線 NID NID_X9_62_prime256v1 NID_sm2p256v1 (256 bit prime) _EC_

2018-04-08橢圓曲線的多種國際標準

ANSI X9.62 prime192v1: NIST/X9.62/SECG curve over a 192 bit prime field prime192v2: X9.62 curve over a 192 bit prime field prime192v3: X

阿里巴巴前端三面-2018.04.08

四月份初受了點傷,整個人都不太好了,趁著清明假期好好休息了一段時間。調整了下自己的生物鐘,好好祭拜了先祖。不過可惜的是老家那邊竟然沒有映山紅了…然後清明假期後,上學的第一天中午就接到了面試官的電話,約了晚上八點的面試。下面我們進入正題吧。(這幾天事情比較多,僅憑記憶記錄一下當時面試的問題

2018/11/08-偵錯程式-《惡意程式碼分析實戰》

  偵錯程式是用來檢測或測試其他程式執行的以來軟體或硬體。由於剛完成的程式包含錯誤,因此偵錯程式在軟體開發過程中可以大顯身手。偵錯程式讓你能夠洞察程式在執行過程中做了什麼。偵錯程式的目的是允許開發者監控程式的內部狀態和執行。   從偵錯程式獲得程式的資訊可能比較困難,但並不意味著不可能,可以從反彙編器中獲得

2018/10/08測試T1】【SOJ 2175】斐波那契

【題目】 題目描述: 斐波那契數列又稱兔子數列,可以通過以下方式產生:一開始只有一隻兔子,一個月之後這隻兔子每個月會繁殖出另一隻兔子。之後每隻兔子出生後都按照以上規則繁殖。我們把每個月的兔子的數量作為數列中的數就可以得到斐波那契數列。 現在草原上有 nnn 只兔

java 字串2018-04-10T10:33:08.72轉日期型別

public static void main(String[] args) { // 時間文字 String dateText = "2018-04-10T10:33:08.72"; // 格式 SimpleDateFormat formatter = new Simpl

2018-04-27 《程式設計師的職業素養

第一章 專業主義 1.1 清楚你要什麼 專業主義的精髓在於將公司利益視同個人利益。所以犯錯不是“在所難免的”,而是應當極力避免,並勇於承擔後果。 1.2 擔當責任 1.3 不行損害之事 不破壞軟體功能 讓QA找不出問題,而

2018/09/08測試T3】【WOJ 3933】觀光旅行

【題目】 【分析】 這道題和我之前寫過的一道題比較像戳這裡看題 不同點是:1、道路改成雙向的了;2、題目要求出方案數 雖說有這樣的不同,但是思路還是一樣的,我就不贅述了,具體看程式碼吧 【程式碼】 #include<cstdio>

mybatis plus + oracle date時間樣式問題 2018-04-09T17:48:22.000+08:00

使用mybatis plus讀取 oracle的date時間型別,查詢結果型別為2018-04-09T17:48:22.000+08:00處理方法:@JsonFormat(pattern = "yyyy

Hadoop 0.20.2+Ubuntu13.04配置和WordCount測試

password trac 讓我 說明 core jvm -m launchpad 1.7 事實上這篇博客寫的有些晚了。之前做過一些總結後來學校的事給忘了,這幾天想又一次拿來玩玩發現有的東西記不住了。翻博客發現居然沒有。好吧,所以趕緊寫一份留著自己用吧。這東西網上有非常

SM2橢圓曲線公鑰密碼算法

left lock 沃通ca width 數據 是什麽 理論 我們 實現 國家必須要有屬於自己的一套加密機制才行。。。好復雜。分享下看哪位看得懂其中的原理 國家密碼管理局於2010年12月17日發布了SM2橢圓曲線公鑰密碼算法,並要求為對現有基於RSA算法的電子

01班04組白盒測試實踐任務分配

記錄 bsp 靜態 總結 評審 負責 自動 作業 自動化 今日開始完成任務分工,具體分工如下:第三次小組作業分工1)小李:使用白盒測試方法設計測試用例,使用測試管理工具或者excel來記錄測試用例,至少40個; 2)小司和小林:負責並組織靜態評審,完成評審會議紀要和評審結果

2018-01-08 Linux目錄管理類命令

bin linux目錄 管理類 som directory 路徑 過程 自動 -m cd, pwd, ls mkdir, rmdir, tree mkdir [options] /path/to/somewhere-p: 存在於不報錯,且可自動創建所需的各目錄;-v: 顯示

2018-1-15性能測試之虛擬用戶開發(1)

base window 體系 工作 網絡 平臺 嵌入 class 神馬 1.1Vuser開發前的準備 1)深入了解系統功能:深入了解系統是進行性能需求分析的前提。2)深入了解系統架構:分析系統的架構弄清楚開展測試需要做哪些準備工作,系統潛在的壓力點在哪,確定重點模擬用戶的哪

2018-03-08阿銘Linux學習

Linux學習8.6 管道符和作業控制 cat 1.txt |wc -l;cat 1.txt |grep ‘aaa‘ ctrl+z 暫停一個任務 jobs 查看後臺的任務 bg[id] 把任務調到後臺 fg[id] 把任務調到前臺 命令後面加 & 直接丟到後臺 8.7 shell變量 上 PATH,

2018/04/01 理解控制反轉和依賴註入

name post user 使用 -o lod 就是 public list 首先,控制反轉和依賴註入不是一種編碼,是一種設計的思想。實現的方式也有很多。 控制反轉(IOC)是一種思想,依賴註入(DI)是實施這種思想的方法。 具體的概念也不多贅述,網上一搜一大片對於這方面

2018/04/02】學習小記

webp style pac error 進度條 成功 .config lB lba 復習了webpack的一些基礎~ --progress 帶進度條 --watch 使用緩存 --colors 醒目標記 node_modules本地最好自己有一份(~ ̄(OO) ̄)ブ,要不

2018/04/07

問題 次數 math.h 體會 sign 星期 sum %d print 2018上IEC計算機高級語言(C)作業 第1次作業 一、學習內容總結 1.經過這幾周的學習,總結一下學習的心得與體會。 在這幾周的學習中,老師講解了C語言的框架以及算法,並學

2018-04-09 Linux學習

Linux 學習 11.1 LAMP架構介紹 Linux+Apache(httpd)+MySQL+PHP PHP 網站(Google、淘寶、百度、51cto博客、猿課論壇) 三個角色可以在一臺機器,也可以分開(httpd和PHP要在一起) MySQL 存儲動態文件 PHP 是Ap

小米 2018.04.10 春招AK 代碼

bre pla BE add fin 圖片 double RR display 題目 自己百度一下,我直接貼一份AK 代碼 A 求一個數的每一位n^2 #include<bits/stdc++.h> using namespace std; type