1. 程式人生 > >如何在iOS中使用SM2進行數字簽名及校驗

如何在iOS中使用SM2進行數字簽名及校驗

有網友留言關於sm2的數字簽名,因此用了一天時間寫完了,時間倉促,程式碼還有優化空間。

國家密碼管理局釋出SM2橢圓曲線公鑰密碼演算法地址是:http://www.oscca.gov.cn/News/201012/News_1198.htm。文末的程式碼包裡也會提供這個文件。

看過我的另一篇部落格sm2公鑰加密後,應該會比較瞭解了,這裡就簡單說一下簽名。地址  http://blog.csdn.net/qq_15509071/article/details/51862664

關於數字簽名 ,大概看了一下,對於程式設計師來講最重要的應該是:

1.簽名時候的輸入引數:使用者A的id,明文,使用者A的私鑰,使用者A的公鑰

2.簽名時候的輸出引數:簽名(r,s)

3.橢圓曲線引數要使用pdf推薦的,不要使用pdf例子中的,因為實際使用都是按照推薦引數來的

4.驗證簽名輸入的引數:使用者A的id,使用者A的公鑰,收到的明文,收到的簽名(r',s')

5.驗證簽名輸出的引數:通過和不通過

6.這裡隨機數應該是自動生成的,現在寫死,隨機生成方法可以看sm2公鑰的部落格

7.匯入openssl可以看sm2公鑰的部落格

下面直接粘程式碼,遇到什麼問題,寫的有不對的地方,歡迎指正

//
//數字簽名
//
- (void)sedBtnClicked:(UIButton*)button {
    //    //pdf文件的第一個例子
//        test_part2(sm2_param_fp_256, TYPE_GFp, 256);
    //    //pdf文件的第二個例子
    //    test_part2(sm2_param_f2m_257, TYPE_GF2m, 257);
    
    //實際使用中
//        test_part2(sm2_param_recommand, TYPE_GFp, 256);
//    return;
    
    //使用者A的id
    NSString *userId = @"
[email protected]
"; NSData *userId_data = [userId dataUsingEncoding:NSUTF8StringEncoding]; NSLog(@"16進位制的userId = %@",userId_data); //明文 NSString *data = @"message digest"; NSData *data_data = [data dataUsingEncoding:NSUTF8StringEncoding]; NSLog(@"16進位制的data = %@",data_data); //私鑰 NSString *pa = [@"128B2FA8 BD433C6C 068C8D80 3DFF7979 2A519A55 171B1B65 0C23661D 15897263" stringByReplacingOccurrencesOfString:@" " withString:@""]; NSData *pa_data = [self dataFromHexString:pa]; //公鑰 NSString *px_ = [@"D5548C78 25CBB561 50A3506C D57464AF 8A1AE051 9DFAF3C5 8221DC81 0CAF28DD " stringByReplacingOccurrencesOfString:@" " withString:@""]; NSString *py_ = [@"92107376 8FE3D59C E54E79A4 9445CF73 FED23086 53702726 4D168946 D479533E" stringByReplacingOccurrencesOfString:@" " withString:@""]; NSData *px_data = [self dataFromHexString:px_]; NSData *py_data = [self dataFromHexString:py_]; //簽名 char singResultR[1024]; char singResultS[1024]; sm2Sign([userId UTF8String],[data UTF8String],pa_data.bytes,px_data.bytes,py_data.bytes,singResultR,singResultS); //簽名結果列印 NSData *Rdata = [[NSData alloc]initWithBytes:singResultR length: 64 ]; NSLog(@"密文data=%@", Rdata ); NSLog(@"密文r str=%@",[[NSString alloc]initWithData:Rdata encoding:NSUTF8StringEncoding] ); NSData *Sdata = [[NSData alloc]initWithBytes:singResultS length: 64 ]; NSLog(@"密文data=%@", Sdata ); NSLog(@"密文s str=%@",[[NSString alloc]initWithData:Sdata encoding:NSUTF8StringEncoding] ); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:[NSString stringWithFormat:@"r=%@,s=%@",[[NSString alloc]initWithData:Rdata encoding:NSUTF8StringEncoding],[[NSString alloc]initWithData:Sdata encoding:NSUTF8StringEncoding]] delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil]; [alert show]; }
void sm2Sign(char userAid[],char mingwen[],unsigned char pa[],unsigned char px[],unsigned char py[],char *singResultR,char *singResultS){

    
    ec_param *ecp;
    sm2_ec_key *key_A;
    sm2_sign_st sign;
    
    ecp = ec_param_new();
    ec_param_init(ecp, sm2_param_recommand, TYPE_GFp, 256);
    
    key_A = sm2_ec_key_new(ecp);
    sm2_ec_key_init(key_A, sm2_param_digest_d_A[ecp->type], ecp);
    
    memset(&sign, 0, sizeof(sign));
    
    //這是要簽名的訊息
    sign.message = (BYTE *)mingwen;
    sign.message_byte_length = strlen(mingwen);
    //這個簽名者的id
    sign.ID = (BYTE *)userAid;
    sign.ENTL = strlen(userAid);
    sm2_hex2bin((BYTE *)sm2_param_digest_k[ecp->type], sign.k, ecp->point_byte_length);
    
    //取出私鑰 公鑰 的值
    //設定pa
    for( int i=0;i<32;i++){
        sign.private_key[i]=pa[i];
    }
    //設定px
    for( int i=0;i<32;i++){
        sign.public_key.x[i]=px[i];
    }
    //設定py
    for( int i=0;i<32;i++){
        sign.public_key.y[i]=py[i];
    }
//    sm2_bn2bin(key_A->d, sign.private_key, ecp->point_byte_length);
//    sm2_bn2bin(key_A->P->x, sign.public_key.x, ecp->point_byte_length);
//    sm2_bn2bin(key_A->P->y, sign.public_key.y, ecp->point_byte_length);
    
    DEFINE_SHOW_STRING(sign.public_key.x, ecp->point_byte_length);
    DEFINE_SHOW_STRING(sign.public_key.y, ecp->point_byte_length);
    
    //dd這裡是簽名
    char singResultR_[1024];
    char singResultS_[1024];
    sm2_sign(ecp, &sign,singResultR_,singResultS_);
    
    printf("px\n");
    for( int i=0;i<64;i++){
        printf("%c", singResultR_[i]);
    }
    printf("\n");
    
    memcpy(singResultR, singResultR_, 64);
    memcpy(singResultS, singResultS_, 64);
    
    sm2_ec_key_free(key_A);
    ec_param_free(ecp);
    
}
//簽名驗證
- (void)thirdBtnClicked:(UIButton*)button {
    //使用者A的id
    NSString *userId = @"[email protected]";
    NSData *userId_data = [userId dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"16進位制的userId = %@",userId_data);
    //明文
    NSString *data = @"message digest";
    NSData *data_data = [data dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"16進位制的data = %@",data_data);
    //公鑰
    NSString *px_ = [@"D5548C78 25CBB561 50A3506C D57464AF 8A1AE051 9DFAF3C5 8221DC81 0CAF28DD " stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSString *py_ = [@"92107376 8FE3D59C E54E79A4 9445CF73 FED23086 53702726 4D168946 D479533E" stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSData *px_data = [self dataFromHexString:px_];
    NSData *py_data = [self dataFromHexString:py_];
    
    //r
    NSString *r = @"077BA4656350DAEEA3656EE042DDECE22D5E8DCA4882CB20080AD26E2CB62E9F";
    NSData *rData = [self dataFromHexString:r];
    //s
    NSString *s = @"2BF329F4AFF86EEE0F924888DDE20BF12A21B638A3B0F1FCA70395C4BE00D0AC";
    NSData *sData = [self dataFromHexString:s];
    
   int result = sm2CheckSign([userId UTF8String],[data UTF8String],px_data.bytes,py_data.bytes,rData.bytes,sData.bytes);

         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:[NSString stringWithFormat:@"%d",result]   delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil];
        [alert show];
 
}
//校驗簽名
int sm2CheckSign(char userAid[],char mingwen[],unsigned char px[],unsigned char py[],char *singResultR,char *singResultS){
    ec_param *ecp;
//    sm2_ec_key *key_A;
    sm2_sign_st sign;
    
    ecp = ec_param_new();
    
//   ec_param_init (ecp,sm2_param_fp_256, TYPE_GFp, 256);//pdf例子
    ec_param_init(ecp, sm2_param_recommand, TYPE_GFp, 256);//實際
    
//    key_A = sm2_ec_key_new(ecp);
    
//     sm2_param_digest_d_A[ecp->type]貌似是私鑰
//    sm2_ec_key_init(key_A, sm2_param_digest_d_A[ecp->type], ecp);
    
    memset(&sign, 0, sizeof(sign));
    
    //設定r s
    for( int i=0;i<32;i++){
    sign.r[i] = singResultR[i];
        printf("%02x", sign.r[i]);
}
    printf("\n");

    for( int i=0;i<32;i++){
        sign.s[i] = singResultS[i];
        printf("%02x", sign.s[i]);

    }
    printf("\n");

    //這是要簽名的訊息
    sign.message = (BYTE *)mingwen;
    //驗證時不用這個引數嗎
    
//    for( int i=0;i<32;i++){
//        sign.Z[i] = mingwen[i];
//        printf("%02x", sign.Z[i]);
//        
//    }
    
    
    sign.message_byte_length = strlen(mingwen);
    //這個簽名者的id
    sign.ID = (BYTE *)userAid;
    sign.ENTL = strlen(userAid);
    //k 隨機數
    sm2_hex2bin((BYTE *)sm2_param_digest_k[ecp->type], sign.k, ecp->point_byte_length);
    
    //設定px
    for( int i=0;i<32;i++){
        sign.public_key.x[i]=px[i];
    }
    //設定py
    for( int i=0;i<32;i++){
        sign.public_key.y[i]=py[i];
    }
    
    memset(sign.private_key, 0, sizeof(sign.private_key)); //«Â≥˝ÀΩ‘ø

    char singResultR_[1024];
    //驗證簽名
    sm2_verify(ecp, &sign,singResultR_);

    
    for( int i=0;i<32;i++){
        if (singResultR[i] == singResultR_[i]) {
            
            printf("%c", singResultR_[i]);

        }else{
            return 0;
        }
    }
    
    
    
//    sm2_ec_key_free(key_A);
    ec_param_free(ecp);
    
    return 1;
}
//這裡面列印比較多,因為遇到一個問題
void sm2_verify(ec_param *ecp, sm2_sign_st *sign,char *singResulR)
{
	sm2_hash e;
	BIGNUM *e_bn;
	BIGNUM *t;
	BIGNUM *R;
	xy_ecpoint *result;
	xy_ecpoint *result1;
	xy_ecpoint *result2;
	xy_ecpoint *P_A;
	BIGNUM *r;
	BIGNUM *s;
	BIGNUM *P_x;
	BIGNUM *P_y;

	e_bn = BN_new();
	t = BN_new();
	R = BN_new();
	result = xy_ecpoint_new(ecp);
	result1 = xy_ecpoint_new(ecp);
	result2 = xy_ecpoint_new(ecp);
	P_A = xy_ecpoint_new(ecp);
	r = BN_new();
	s = BN_new();
	P_x = BN_new();
	P_y = BN_new();

    //bignum和byte轉換 r s x y
	BN_bin2bn(sign->r, ecp->point_byte_length, r);
	BN_bin2bn(sign->s, ecp->point_byte_length, s);
	BN_bin2bn(sign->public_key.x, ecp->point_byte_length, P_x);
	BN_bin2bn(sign->public_key.y, ecp->point_byte_length, P_y);
	xy_ecpoint_init_xy(P_A, P_x, P_y, ecp);

    
    //wo複製過來 的  獲取sign z  與 z_a
    sm2_hash Z_A;
    memset(&Z_A, 0, sizeof(Z_A));
    Z_A.buffer[0] = ((sign->ENTL * 8) >> 8) & 0xFF;
    Z_A.buffer[1] = (sign->ENTL * 8) & 0xFF;
    Z_A.position = Z_A.position + 2;
    BUFFER_APPEND_STRING(Z_A.buffer, Z_A.position, sign->ENTL, sign->ID);
    BUFFER_APPEND_BIGNUM(Z_A.buffer, Z_A.position, ecp->point_byte_length, ecp->a);
    BUFFER_APPEND_BIGNUM(Z_A.buffer, Z_A.position, ecp->point_byte_length, ecp->b);
    BUFFER_APPEND_BIGNUM(Z_A.buffer, Z_A.position, ecp->point_byte_length, ecp->G->x);
    DEFINE_SHOW_STRING(Z_A.buffer, Z_A.position);
//    0090414C 49434531 32334059 41484F4F 2E434F4D 787968B4 FA32C3FD 2417842E
//    73BBFEFF 2F3C848B 6831D7E0 EC65228B 3937E498 63E4C6D3 B23B0C84 9CF84241
//    484BFE48 F61D59A5 B16BA06E 6E12D1DA 27C5249A 421DEBD6 1B62EAB6 746434EB
//    C3CC315E 32220B3B ADD50BDC 4C4E6C14 7FEDD43D
    BUFFER_APPEND_BIGNUM(Z_A.buffer, Z_A.position, ecp->point_byte_length, ecp->G->y);
    DEFINE_SHOW_STRING(Z_A.buffer, Z_A.position);
//    0090414C 49434531 32334059 41484F4F 2E434F4D 787968B4 FA32C3FD 2417842E
//    73BBFEFF 2F3C848B 6831D7E0 EC65228B 3937E498 63E4C6D3 B23B0C84 9CF84241
//    484BFE48 F61D59A5 B16BA06E 6E12D1DA 27C5249A 421DEBD6 1B62EAB6 746434EB
//    C3CC315E 32220B3B ADD50BDC 4C4E6C14 7FEDD43D 0680512B CBB42C07 D47349D2
//    153B70C4 E5D7FDFC BFA36EA1 A85841B9 E46E09A2
    BUFFER_APPEND_BIGNUM(Z_A.buffer, Z_A.position, ecp->point_byte_length, P_x);
    DEFINE_SHOW_STRING(Z_A.buffer, Z_A.position);
    //p_x0AE4C779 8AA0F119 471BEE11 825BE462 02BB79E2 A5844495 E97C04FF 4DF2548A
    BUFFER_APPEND_BIGNUM(Z_A.buffer, Z_A.position, ecp->point_byte_length, P_y);
    //py  7C0240F8 8F1CD4E1 6352A73C  17B7F16F 07353E53 A176D684 A9FE0C6B B798E857
    DEFINE_SHOW_STRING(Z_A.buffer, Z_A.position);
//    0090414C 49434531 32334059 41484F4F 2E434F4D 787968B4 FA32C3FD 2417842E
//    73BBFEFF 2F3C848B 6831D7E0 EC65228B 3937E498 63E4C6D3 B23B0C84 9CF84241
//    484BFE48 F61D59A5 B16BA06E 6E12D1DA 27C5249A 421DEBD6 1B62EAB6 746434EB
//    C3CC315E 32220B3B ADD50BDC 4C4E6C14 7FEDD43D 0680512B CBB42C07 D47349D2
//    153B70C4 E5D7FDFC BFA36EA1 A85841B9 E46E09A2 //後面不一樣0AE4C779 8AA0F119 471BEE11
//    825BE462 02BB79E2 A5844495 E97C04FF 4DF2548A 7C0240F8 8F1CD4E1 6352A73C
//    17B7F16F 07353E53 A176D684 A9FE0C6B B798E857
    
    
    SM3_Init();
    SM3_Update(Z_A.buffer, Z_A.position);
    SM3_Final_byte(Z_A.hash);
    
    memcpy(sign->Z, Z_A.hash, HASH_BYTE_LENGTH);
    
    DEFINE_SHOW_STRING(Z_A.hash, HASH_BYTE_LENGTH);//F4A38489 E32B45B6 F876E3AC 2168CA39 2362DC8F 23459C1D 1146FC3D BFB7BC9A // 不一樣

    
    //wo複製過來 的
    

    
    //z是雜湊值  和msg
	memset(&e, 0, sizeof(e));
	BUFFER_APPEND_STRING(e.buffer, e.position, HASH_BYTE_LENGTH, sign->Z);
	BUFFER_APPEND_STRING(e.buffer, e.position, sign->message_byte_length, (BYTE*)sign->message);
    
    DEFINE_SHOW_STRING(sign->Z, HASH_BYTE_LENGTH);//F4A38489 E32B45B6 F876E3AC 2168CA39 2362DC8F 23459C1D 1146FC3D BFB7BC9A
    DEFINE_SHOW_STRING(e.buffer, HASH_BYTE_LENGTH + 100);//F4A38489 E32B45B6 F876E3AC 2168CA39 2362DC8F 23459C1D 1146FC3D BFB7BC9A  6D657373 61676520 64696765 73740000
    DEFINE_SHOW_STRING(e.hash, HASH_BYTE_LENGTH);//0
    
	SM3_Init();
	SM3_Update(e.buffer, e.position);
	SM3_Final_byte(e.hash);
	BN_bin2bn(e.hash, HASH_BYTE_LENGTH, e_bn);
    
    

    DEFINE_SHOW_STRING(e.buffer, HASH_BYTE_LENGTH);//E6E831E4 6D338322 F431ED5A C3364483 E9372D4B 7795EF54 5D68E91C 583A6693

    DEFINE_SHOW_STRING(e.hash, HASH_BYTE_LENGTH);//B524F552 CD82B8B0 28476E00 5C377FB1 9A87E6FC 682D48BB 5D42E3D9 B9EFFE76

    
    
    
//	DEFINE_SHOW_BIGNUM(e_bn);
    DEFINE_SHOW_BIGNUM(e_bn);//B524F552 CD82B8B0 28476E00 5C377FB1 9A87E6FC 682D48BB 5D42E3D9 B9EFFE76

    
    
    
	BN_mod_add(t, r, s, ecp->n, ecp->ctx);
    DEFINE_SHOW_BIGNUM(result1->x);
    DEFINE_SHOW_BIGNUM(result1->y);
    DEFINE_SHOW_BIGNUM(ecp->G->x);//32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7
    DEFINE_SHOW_BIGNUM(ecp->G->y);//BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0
    DEFINE_SHOW_BIGNUM(s);//2BF329F4 AFF86EEE 0F924888 DDE20BF1 2A21B638 A3B0F1FC A70395C4 BE00D0AC
    DEFINE_SHOW_BIGNUM(result2->x);
    DEFINE_SHOW_BIGNUM(result2->y);
    DEFINE_SHOW_BIGNUM(P_A->x);//D5548C78 25CBB561 50A3506C D57464AF 8A1AE051 9DFAF3C5 8221DC81 0CAF28DD
    DEFINE_SHOW_BIGNUM(P_A->y);//92107376 8FE3D59C E54E79A4 9445CF73 FED23086 53702726 4D168946 D479533E
    DEFINE_SHOW_BIGNUM(t);//336ECE5A 134949DC B2F7B769 20BFF8D3 57804402 EC33BD1C AF0E6832 EAB6FF4B
    DEFINE_SHOW_BIGNUM(result->x);
    DEFINE_SHOW_BIGNUM(result->y);
    
	xy_ecpoint_mul_bignum(result1, ecp->G, s, ecp);
    
    DEFINE_SHOW_BIGNUM(result1->x);//68D957D2 FA010371 C76F7B1C 9370D4B5 35E2A712 9FB7627A BF76F27B BC33A660
    DEFINE_SHOW_BIGNUM(result1->y);//8BB516B0 ABBD3CCE 34415612 F439203A FDC1BFA2 CBF0EA63 D1C0D07C A2E32FCC
    DEFINE_SHOW_BIGNUM(result2->x);
    DEFINE_SHOW_BIGNUM(result2->y);
    DEFINE_SHOW_BIGNUM(result->x);
    DEFINE_SHOW_BIGNUM(result->y);
    
	xy_ecpoint_mul_bignum(result2, P_A, t, ecp);

    DEFINE_SHOW_BIGNUM(s);
    DEFINE_SHOW_BIGNUM(result2->x);//31F17670 3062F3C8 C375F85E 2F8AA60C 9D8FFA70 DFBB9EA4 E3F9C3E7 7E72D5A8
    DEFINE_SHOW_BIGNUM(result2->y);//6BCCE490 61B56118 B4EC79A9 15B6A102 B8E94A1D 07571C97 5A660947 57B35F6B
    DEFINE_SHOW_BIGNUM(result->x);
    DEFINE_SHOW_BIGNUM(result->y);
    
	xy_ecpoint_add_xy_ecpoint(result, result1, result2, ecp);
    
    DEFINE_SHOW_BIGNUM(result1->x);
    DEFINE_SHOW_BIGNUM(result1->y);
    DEFINE_SHOW_BIGNUM(result->x);//F6A687AB 5744D5CB BA1CF93D 8436416F 75C3AEC3 D762814D 565314AF F57A89F9
    DEFINE_SHOW_BIGNUM(result->y);//F1B8EE05 41740565 491E4404 3DE53CF5 BBEDD613 33071260 DFC5783F 47A7B981
    DEFINE_SHOW_BIGNUM(R);//0
    DEFINE_SHOW_BIGNUM(result->x);//F6A687AB 5744D5CB BA1CF93D 8436416F 75C3AEC3 D762814D 565314AF F57A89F9
    DEFINE_SHOW_BIGNUM(ecp->n);//FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123
    
    BN_mod_add(R, e_bn, result->x, ecp->n, ecp->ctx);
    
    DEFINE_SHOW_BIGNUM(e_bn);//10D51CB9 0C0C0522 E94875A2 BEA7AB72 299EBE71 92E64EFE 0573B1C7 7110E5C9 這個也不一樣
    DEFINE_SHOW_BIGNUM(R);//077BA465 6350DAEE A3656EE0 42DDECE2 2D5E8DCA 4882CB20 080AD26E 2CB62E9F  就這不一樣
    DEFINE_SHOW_BIGNUM(result->x);
    DEFINE_SHOW_BIGNUM(ecp->n);
    
	sm2_bn2bin(R, sign->R, ecp->point_byte_length);

	DEFINE_SHOW_STRING(sign->R, ecp->point_byte_length);

    
    

    
    memcpy(singResulR, sign->R, ecp->point_byte_length);
    
    
	BN_free(e_bn);
	BN_free(t);
	BN_free(R);
	xy_ecpoint_free(result);
	xy_ecpoint_free(result1);
	xy_ecpoint_free(result2);
	xy_ecpoint_free(P_A);
	BN_free(r);
	BN_free(s);
	BN_free(P_x);
	BN_free(P_y);
}


相關推薦

如何在iOS使用SM2進行數字簽名

有網友留言關於sm2的數字簽名,因此用了一天時間寫完了,時間倉促,程式碼還有優化空間。 國家密碼管理局釋出SM2橢圓曲線公鑰密碼演算法地址是:http://www.oscca.gov.cn/News/201012/News_1198.htm。文末的程式碼包裡也會提供這個

JAVA -----RSA加密解密簽名

由於專案要用到非對稱加密解密簽名校驗什麼的,於是參考《Java加密解密的藝術》寫一個RSA進行加密解密簽名及校驗的Demo,程式碼很簡單,特此分享! RSA加密解密類: package com.ihep; import java.io.BufferedRead

Java使用RSA加密解密簽名

由於專案要用到非對稱加密解密簽名校驗什麼的,於是參考《Java加密解密的藝術》寫一個RSA進行加密解密簽名及校驗的Demo,程式碼很簡單,特此分享!RSA加密解密類:package com.ihep; import java.io.BufferedReader; impor

關於在applet對jar包進行數字簽名問題.

昨天真鬱悶....部門老大給我提出了一種難於想象的需求,通常我們從網站上下載檔案都有IE彈出框。而他對我的要求是:不要彈出IE對話方塊,點按鈕後直接把檔案儲存到本地。當時即時暈倒,都不知道是什麼客戶來的,居然有這種需求。-_-!綜合考慮後,我決定用applet在客戶端執行一段程式碼。在客戶端裡用apache的

國家商用password(五)基於SM2的軟件授權碼生成

clas 信息 ecp register 方法 序列號 mod 生成 pub 將公開密鑰算法作為軟件註冊算法的優點是Cracker非常難通過跟蹤驗證算法得到註冊機。以下。將介紹使用SM2國密算法進行軟件註冊的方法。 生成授權碼 選擇SM2橢圓曲線參數(P,a,b,N,

php使用openssl進行數字簽名驗證

簽名 contents create 個數字 字符 一個 logs php ont 1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: hanks 5 * Date: 6/2/2017 6 * Tim

iOS ipa包進行重新簽名

home all url info http 技術分享 resign 重新 image 1.安裝brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma

統一認證加密簽名引數

1 、openssl //aes加密 $key = '7dD11GshBatrxKdt'; $input = '13579265781'; //aes解密 $encrypted_value = openssl_encrypt($input, 'AES-128-ECB', $key, 1); echo

密碼學06--數字簽名之go的RSA數字簽名

目錄 1.數字簽名 1.1 概念 1.2 原理 1.3 實現 2.go語言實現RSA數字簽名 2.1 數字簽名【簽名-核驗】流程 2.1.1 使用rsa包生成金鑰對 2.1.2 使用私鑰對資訊進行數字簽名 2.1.3 使用公鑰對數字簽名進行校驗 2.

使用GnuPG對檔案進行數字簽名

為什麼要進行數字簽名   按照Maven的要求,我們需要對即將要上傳的構件進行數字簽名,下面是Maven官網的原話:   為了提高中央Maven儲存庫的質量,我們要求您為所有的構件(除了校驗和之外的所有檔案)提供PGP簽名,並將您的公鑰分發給一個金

java安全之數字簽名證書

MD5/SHA的應用 l  訊息摘要是一種演算法:無論原始資料多長,訊息摘要的結果都是固定長度的;原始資料任意bit位的變化,都會導致訊息摘要的結果有很大的不同,且根據結果推算出原始資料的概率極低。訊息摘要可以看作原始資料的指紋,指紋不同則原始資料不同。 l  數字摘要與M

使用SignTool對軟體安裝包進行數字簽名

一、製作根證書   1、開始選單—執行—輸入cmd,彈出命令列窗體。     2、輸入命令:cd /d F:\SignTool,將當前工作目錄修改到SignTool路徑下。     3、使用makecert命令製作證書,可通過makecert -?或makece

對sys、cat檔案進行數字簽名

管理員許可權開啟VS 工具->Visual Studio命令提示 輸入命令:makecert -r -pe -ss Ctcloud -n CN=Ctcloud.com(Test) xxx.cer 生成cer證書檔案 備註:Ctcloud 、Ct

十一,iOS的按鈕數字紅點提示

1,具體效果如圖 2,按鈕數字紅點其中的巨集定義 #define SPColor(r,g,b,a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)] 3,.h檔案程式碼 #i

signtool.exe 對exe程式進行數字簽名

signtool.exe是微軟的數字簽名製作工具,只能製作windows平臺的簽名, 本使用指南演示如何使用 WoSign微軟程式碼簽名證書 來給Windows平臺程式碼簽名,簽名工具為WDK自帶的簽名工具軟體 SignTool.exe,此簽名工具軟體僅支援DOS命令符

數字簽名驗證例子

1. 數字簽名和驗證 數字簽名的生成:將簽名者的私鑰對資訊的雜湊值進行加密,獲得簽名者的數字簽名。 數字簽名的驗證:將簽名者的公鑰解密簽名者的數字簽名,然後和資訊的雜湊值作對比。如果兩者相同則數字簽名驗證成功,否則失敗。 2. 數字簽名和驗證的 Pytho

SpringMVC的 JSR 303 數據框架說明

bind 工作 電子 支持 length spring容器 error digits 獲取 JSR 303 是java為Bean數據合法性校驗提供的標準框架,它已經包含在JavaEE 6.0中。 JSR 303 通過在Bean屬性上標註類似於@NotNull、@Max等標

js和java使用正則表達式郵箱

reg 表達 mat 表達式 正則表達式 javascrip 格式 正則 pri 問題:經常在項目中要校驗郵箱?   郵箱格式:首位必須為字母,必須包含一個@符號,並且@之後有個名字,之後還有個.,再有一個後綴名   例如:[email protected]   一、java

SpringSecurity 進行自定義Token

單獨 snapshot author 調試 wired vax net figure cas 背景 Spring Security默認使用「用戶名/密碼」的方式進行登陸校驗,並通過cookie的方式存留登陸信息。在一些定制化場景,比如希望單獨使用token串進行部分頁面的訪

input只輸入數字和js是否輸入框只有數字以及游標放輸入框時,輸入框裡內容消失

input只輸入數字和js校驗是否輸入框只有數字以及游標放輸入框時,輸入框裡內容消失 input框只能輸入數字: 1 onkeyup="value=value.replace(/[^\d]/g,'')" js校驗是否是純數字 1 if(isNaN(bankAccountNo)){ 2