質問編集履歴

3

p,q,Nが検証フェーズ前では正しい値が与えられたことを追加しました.

2021/01/29 06:38

投稿

Q3fdxrGzWzu0u5n
Q3fdxrGzWzu0u5n

スコア8

test CHANGED
File without changes
test CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  コードの下に実行結果を載せました.
8
8
 
9
+ 検証フェーズの直前で,p,q,Nの値を確認したところ正しい値が出力されました.
10
+
9
11
 
10
12
 
11
13
  ```C

2

出力結果を更新しました.

2021/01/29 06:38

投稿

Q3fdxrGzWzu0u5n
Q3fdxrGzWzu0u5n

スコア8

test CHANGED
File without changes
test CHANGED
@@ -568,6 +568,58 @@
568
568
 
569
569
  ```出力結果
570
570
 
571
+ initialize.c:59:15: warning: implicit declaration of function 'pow1' is invalid in C99 [-Wimplicit-function-declaration]
572
+
573
+ R[i][j]=pow1(g,s1[i][j],N);
574
+
575
+ ^
576
+
577
+ initialize.c:89:29: warning: implicit declaration of function 'phi' is invalid in C99 [-Wimplicit-function-declaration]
578
+
579
+ printf("Φ(N)=%d, f=%d\n",phi(N),f);
580
+
581
+ ^
582
+
583
+ initialize.c:91:10: warning: implicit declaration of function 'pow1' is invalid in C99 [-Wimplicit-function-declaration]
584
+
585
+ int R0=pow1(g,s0,N);
586
+
587
+ ^
588
+
589
+ initialize.c:112:10: warning: implicit declaration of function 'jacobi' is invalid in C99 [-Wimplicit-function-declaration]
590
+
591
+ if(jacobi(K[i],P)==1){
592
+
593
+ ^
594
+
595
+ initialize.c:130:24: warning: implicit declaration of function 'h' is invalid in C99 [-Wimplicit-function-declaration]
596
+
597
+ r[i][j]=fmod(h(I[i][j],R1[i],t[i],P),P);
598
+
599
+ ^
600
+
601
+ initialize.c:142:20: warning: implicit declaration of function 'h' is invalid in C99 [-Wimplicit-function-declaration]
602
+
603
+ y[i][j]=fmod(h(I[i][j],S[i],t[i],P),P);
604
+
605
+ ^
606
+
607
+ initialize.c:161:45: warning: more '%' conversions than data arguments [-Wformat]
608
+
609
+ printf("R0=%d, s[%d][%d]=%d, N=%d, p=%d, q=%d\n",R0,s1[i][j],N,p,q);
610
+
611
+ ~^
612
+
613
+ initialize.c:163:46: warning: format specifies type 'int' but the argument has type 'double' [-Wformat]
614
+
615
+ printf("I'[%d][%d]=%d,f=%d,N=%d\n",i,j,I1[i][j],f,N);
616
+
617
+ ~~ ^~~~~~~~
618
+
619
+ %f
620
+
621
+ 8 warnings generated.
622
+
571
623
  m=3
572
624
 
573
625
  t[0]=2, n[0]=2

1

どこで宣言して,どこがおかしくなったのか具体的な行数を追加し,出力結果を載せました.

2021/01/29 06:35

投稿

Q3fdxrGzWzu0u5n
Q3fdxrGzWzu0u5n

スコア8

test CHANGED
File without changes
test CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  なお,以前同じ内容で質問してベストアンサーを決めて解決済みになってしまったため,もう一度質問し直しました.また,以前ご指摘のあった,領域の問題は解決したと思います.
4
4
 
5
+ 40,41行目でp,q,Nを宣言して,151行目以降の検証フェーズにて,値がおかしくなっています.
6
+
7
+ コードの下に実行結果を載せました.
8
+
9
+
10
+
5
11
  ```C
6
12
 
7
13
  //逐次秘密分散法の実装
@@ -318,7 +324,13 @@
318
324
 
319
325
  //I'ijを計算する
320
326
 
327
+
328
+
329
+ //N,p,qの値がおかしい
330
+
331
+
332
+
321
- printf("R0=%d, s[%d][%d]=%d, N=%d\n",R0,s1[i][j],N);
333
+ printf("R0=%d, s[%d][%d]=%d, N=%d, p=%d, q=%d\n",R0,s1[i][j],N,p,q);
322
334
 
323
335
  I1[i][j]=pow1(R0,s1[i][j],N);
324
336
 
@@ -326,12 +338,6 @@
326
338
 
327
339
  //Rij==I'ij^f mod Nを検証する
328
340
 
329
-
330
-
331
- ここでN,p,qの値がおかしくなっている.
332
-
333
-
334
-
335
341
  int h=pow1(I1[i][j],f,N);
336
342
 
337
343
  printf("I'[%d][%d]^f mod N=%d\n",i,j,h);
@@ -352,9 +358,63 @@
352
358
 
353
359
  if(countv==0)printf("全て正しいシェアでした\n");
354
360
 
355
-
361
+ /*
362
+
356
-
363
+ //復元フェーズ
364
+
357
-
365
+ //プレイヤー
366
+
367
+ double S1[m],r[m]; //求めるSi
368
+
369
+ double y1[m][P];
370
+
371
+ for(i=1;i<=m;i++){
372
+
373
+ S1[i]=0;
374
+
375
+ for(j=1;j<=t[i];j++){
376
+
377
+ //ラグランジュ補間を使用して,Siを求める
378
+
379
+ y1[i][j]=fmod(h(I[i][j],S[i],t[i],P),P);
380
+
381
+ printf("y[%d][%d]=%lf, ",i,j,y1[i][j]);
382
+
383
+ r[i]=y1[i][j];
384
+
385
+ for(k=1;k<=t[i];k++){
386
+
387
+ if(j!=k){
388
+
389
+ r[i]*=(0-I1[i][k])/(I1[i][j]-I1[i][k]);
390
+
391
+
392
+
393
+ }
394
+
395
+ }
396
+
397
+
398
+
399
+ S1[i]+=r[i];
400
+
401
+ printf("S[%d]=%lf ",i,S1[i]);
402
+
403
+ S1[i]=fmod(S1[i],P);
404
+
405
+
406
+
407
+ }
408
+
409
+ S1[i]=round(S1[i]);
410
+
411
+ printf("S[%d]=%lf\n",i,S1[i]);
412
+
413
+ }
414
+
415
+
416
+
417
+ */
358
418
 
359
419
  return 0;
360
420
 
@@ -502,8 +562,168 @@
502
562
 
503
563
  }
504
564
 
505
-
506
-
507
-
508
-
509
565
  ```
566
+
567
+
568
+
569
+ ```出力結果
570
+
571
+ m=3
572
+
573
+ t[0]=2, n[0]=2
574
+
575
+ t[1]=2, n[1]=3
576
+
577
+ t[2]=3, n[2]=4
578
+
579
+ P=23
580
+
581
+ s[0]=3, s[1]=5, s[2]=5,
582
+
583
+ p=7, q=3, N=21
584
+
585
+ g=5
586
+
587
+ s[0][0]=1, s[0][1]=2,
588
+
589
+ s[1][0]=1, s[1][1]=2, s[1][2]=3,
590
+
591
+ s[2][0]=1, s[2][1]=2, s[2][2]=3, s[2][3]=4,
592
+
593
+ R[0][0]=5, R[0][1]=4,
594
+
595
+ R[1][0]=5, R[1][1]=4, R[1][2]=20,
596
+
597
+ R[2][0]=5, R[2][1]=4, R[2][2]=20, R[2][3]=16,
598
+
599
+ レベル1,2,3,で一意である.
600
+
601
+ s0=5
602
+
603
+ Φ(N)=12, f=17
604
+
605
+ R0=17
606
+
607
+ I[0][0]=17, I[0][1]=16,
608
+
609
+ y[0][0]=20, y[0][1]=19,
610
+
611
+ S[0]=3, s'[0]=10
612
+
613
+ I[1][0]=17, I[1][1]=16, I[1][2]=20,
614
+
615
+ K[1]=4
616
+
617
+ K[1]は平方剰余である
618
+
619
+ S[1]=2
620
+
621
+ y[1][0]=19, y[1][1]=18, y[1][2]=22,
622
+
623
+ S[1]=2, s'[1]=2
624
+
625
+ I[2][0]=17, I[2][1]=16, I[2][2]=20, I[2][3]=4,
626
+
627
+ K[2]=10
628
+
629
+ K[2]は平方剰余でない
630
+
631
+ R[2]=5
632
+
633
+ r[2][0]=2, r[2][1]=4, r[2][2]=20, r[2][3]=18,
634
+
635
+ y[2][0]=22, y[2][1]=1, y[2][2]=17, y[2][3]=15,
636
+
637
+ S[2]=2
638
+
639
+ R0=17, s[1][21]=7, N=3, p=23, q=0
640
+
641
+ I'[0][0]=17,f=21,N=0
642
+
643
+ I'[0][0]^f mod N=-2147483648
644
+
645
+ R[0][0]=5
646
+
647
+ レベル0の0番目のプレイヤーは,誤ったシェアを提出しました
648
+
649
+ R0=17, s[2][21]=7, N=3, p=0, q=0
650
+
651
+ I'[0][1]=17,f=21,N=0
652
+
653
+ I'[0][1]^f mod N=-2147483648
654
+
655
+ R[0][1]=4
656
+
657
+ レベル0の1番目のプレイヤーは,誤ったシェアを提出しました
658
+
659
+ R0=17, s[1][21]=7, N=3, p=0, q=0
660
+
661
+ I'[1][0]=17,f=21,N=0
662
+
663
+ I'[1][0]^f mod N=-2147483648
664
+
665
+ R[1][0]=5
666
+
667
+ レベル1の0番目のプレイヤーは,誤ったシェアを提出しました
668
+
669
+ R0=17, s[2][21]=7, N=3, p=0, q=0
670
+
671
+ I'[1][1]=17,f=21,N=0
672
+
673
+ I'[1][1]^f mod N=-2147483648
674
+
675
+ R[1][1]=4
676
+
677
+ レベル1の1番目のプレイヤーは,誤ったシェアを提出しました
678
+
679
+ R0=17, s[3][21]=7, N=3, p=0, q=0
680
+
681
+ I'[1][2]=17,f=21,N=0
682
+
683
+ I'[1][2]^f mod N=-2147483648
684
+
685
+ R[1][2]=20
686
+
687
+ レベル1の2番目のプレイヤーは,誤ったシェアを提出しました
688
+
689
+ R0=17, s[1][21]=7, N=3, p=0, q=0
690
+
691
+ I'[2][0]=17,f=21,N=0
692
+
693
+ I'[2][0]^f mod N=-2147483648
694
+
695
+ R[2][0]=5
696
+
697
+ レベル2の0番目のプレイヤーは,誤ったシェアを提出しました
698
+
699
+ R0=17, s[2][21]=7, N=3, p=0, q=0
700
+
701
+ I'[2][1]=17,f=21,N=0
702
+
703
+ I'[2][1]^f mod N=-2147483648
704
+
705
+ R[2][1]=4
706
+
707
+ レベル2の1番目のプレイヤーは,誤ったシェアを提出しました
708
+
709
+ R0=17, s[3][21]=7, N=3, p=0, q=0
710
+
711
+ I'[2][2]=17,f=21,N=0
712
+
713
+ I'[2][2]^f mod N=-2147483648
714
+
715
+ R[2][2]=20
716
+
717
+ レベル2の2番目のプレイヤーは,誤ったシェアを提出しました
718
+
719
+ R0=17, s[4][21]=7, N=3, p=0, q=0
720
+
721
+ I'[2][3]=17,f=21,N=0
722
+
723
+ I'[2][3]^f mod N=-2147483648
724
+
725
+ R[2][3]=16
726
+
727
+ レベル2の3番目のプレイヤーは,誤ったシェアを提出しました
728
+
729
+ ```