teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

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

2021/01/29 06:38

投稿

Q3fdxrGzWzu0u5n
Q3fdxrGzWzu0u5n

スコア8

title CHANGED
File without changes
body CHANGED
@@ -2,6 +2,7 @@
2
2
  なお,以前同じ内容で質問してベストアンサーを決めて解決済みになってしまったため,もう一度質問し直しました.また,以前ご指摘のあった,領域の問題は解決したと思います.
3
3
  40,41行目でp,q,Nを宣言して,151行目以降の検証フェーズにて,値がおかしくなっています.
4
4
  コードの下に実行結果を載せました.
5
+ 検証フェーズの直前で,p,q,Nの値を確認したところ正しい値が出力されました.
5
6
 
6
7
  ```C
7
8
  //逐次秘密分散法の実装

2

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

2021/01/29 06:38

投稿

Q3fdxrGzWzu0u5n
Q3fdxrGzWzu0u5n

スコア8

title CHANGED
File without changes
body CHANGED
@@ -283,6 +283,32 @@
283
283
  ```
284
284
 
285
285
  ```出力結果
286
+ initialize.c:59:15: warning: implicit declaration of function 'pow1' is invalid in C99 [-Wimplicit-function-declaration]
287
+ R[i][j]=pow1(g,s1[i][j],N);
288
+ ^
289
+ initialize.c:89:29: warning: implicit declaration of function 'phi' is invalid in C99 [-Wimplicit-function-declaration]
290
+ printf("Φ(N)=%d, f=%d\n",phi(N),f);
291
+ ^
292
+ initialize.c:91:10: warning: implicit declaration of function 'pow1' is invalid in C99 [-Wimplicit-function-declaration]
293
+ int R0=pow1(g,s0,N);
294
+ ^
295
+ initialize.c:112:10: warning: implicit declaration of function 'jacobi' is invalid in C99 [-Wimplicit-function-declaration]
296
+ if(jacobi(K[i],P)==1){
297
+ ^
298
+ initialize.c:130:24: warning: implicit declaration of function 'h' is invalid in C99 [-Wimplicit-function-declaration]
299
+ r[i][j]=fmod(h(I[i][j],R1[i],t[i],P),P);
300
+ ^
301
+ initialize.c:142:20: warning: implicit declaration of function 'h' is invalid in C99 [-Wimplicit-function-declaration]
302
+ y[i][j]=fmod(h(I[i][j],S[i],t[i],P),P);
303
+ ^
304
+ initialize.c:161:45: warning: more '%' conversions than data arguments [-Wformat]
305
+ printf("R0=%d, s[%d][%d]=%d, N=%d, p=%d, q=%d\n",R0,s1[i][j],N,p,q);
306
+ ~^
307
+ initialize.c:163:46: warning: format specifies type 'int' but the argument has type 'double' [-Wformat]
308
+ printf("I'[%d][%d]=%d,f=%d,N=%d\n",i,j,I1[i][j],f,N);
309
+ ~~ ^~~~~~~~
310
+ %f
311
+ 8 warnings generated.
286
312
  m=3
287
313
  t[0]=2, n[0]=2
288
314
  t[1]=2, n[1]=3

1

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

2021/01/29 06:35

投稿

Q3fdxrGzWzu0u5n
Q3fdxrGzWzu0u5n

スコア8

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,8 @@
1
1
  ある秘密分散法のプログラムを作成していたところ,元の方で定義していた"p","q","N"(他にもあるかもしれません)の値をのちにもう一度使おうとしたら,おかしな値になってしまいました.理由がわかる方がいたらご教授いただきたいです.
2
2
  なお,以前同じ内容で質問してベストアンサーを決めて解決済みになってしまったため,もう一度質問し直しました.また,以前ご指摘のあった,領域の問題は解決したと思います.
3
+ 40,41行目でp,q,Nを宣言して,151行目以降の検証フェーズにて,値がおかしくなっています.
4
+ コードの下に実行結果を載せました.
5
+
3
6
  ```C
4
7
  //逐次秘密分散法の実装
5
8
  #include <stdbool.h>
@@ -158,13 +161,13 @@
158
161
  for(i=0;i<m;i++){
159
162
  for(j=0;j<n[i];j++){
160
163
  //I'ijを計算する
164
+
165
+ //N,p,qの値がおかしい
166
+
161
- printf("R0=%d, s[%d][%d]=%d, N=%d\n",R0,s1[i][j],N);
167
+ printf("R0=%d, s[%d][%d]=%d, N=%d, p=%d, q=%d\n",R0,s1[i][j],N,p,q);
162
168
  I1[i][j]=pow1(R0,s1[i][j],N);
163
169
  printf("I'[%d][%d]=%d,f=%d,N=%d\n",i,j,I1[i][j],f,N);
164
170
  //Rij==I'ij^f mod Nを検証する
165
-
166
- ここでN,p,qの値がおかしくなっている.
167
-
168
171
  int h=pow1(I1[i][j],f,N);
169
172
  printf("I'[%d][%d]^f mod N=%d\n",i,j,h);
170
173
  printf(" R[%d][%d]=%d\n",i,j,R[i][j]);
@@ -175,8 +178,35 @@
175
178
  }
176
179
  }
177
180
  if(countv==0)printf("全て正しいシェアでした\n");
178
-
181
+ /*
182
+ //復元フェーズ
183
+ //プレイヤー
184
+ double S1[m],r[m]; //求めるSi
185
+ double y1[m][P];
186
+ for(i=1;i<=m;i++){
187
+ S1[i]=0;
188
+ for(j=1;j<=t[i];j++){
189
+ //ラグランジュ補間を使用して,Siを求める
190
+ y1[i][j]=fmod(h(I[i][j],S[i],t[i],P),P);
191
+ printf("y[%d][%d]=%lf, ",i,j,y1[i][j]);
192
+ r[i]=y1[i][j];
193
+ for(k=1;k<=t[i];k++){
194
+ if(j!=k){
195
+ r[i]*=(0-I1[i][k])/(I1[i][j]-I1[i][k]);
196
+
197
+ }
198
+ }
199
+
200
+ S1[i]+=r[i];
201
+ printf("S[%d]=%lf ",i,S1[i]);
202
+ S1[i]=fmod(S1[i],P);
203
+
204
+ }
205
+ S1[i]=round(S1[i]);
206
+ printf("S[%d]=%lf\n",i,S1[i]);
207
+ }
179
208
 
209
+ */
180
210
  return 0;
181
211
  }
182
212
 
@@ -250,6 +280,86 @@
250
280
  if (a == 0) return 1;
251
281
  return x;
252
282
  }
283
+ ```
253
284
 
254
-
285
+ ```出力結果
286
+ m=3
287
+ t[0]=2, n[0]=2
288
+ t[1]=2, n[1]=3
289
+ t[2]=3, n[2]=4
290
+ P=23
291
+ s[0]=3, s[1]=5, s[2]=5,
292
+ p=7, q=3, N=21
293
+ g=5
294
+ s[0][0]=1, s[0][1]=2,
295
+ s[1][0]=1, s[1][1]=2, s[1][2]=3,
296
+ s[2][0]=1, s[2][1]=2, s[2][2]=3, s[2][3]=4,
297
+ R[0][0]=5, R[0][1]=4,
298
+ R[1][0]=5, R[1][1]=4, R[1][2]=20,
299
+ R[2][0]=5, R[2][1]=4, R[2][2]=20, R[2][3]=16,
300
+ レベル1,2,3,で一意である.
301
+ s0=5
302
+ Φ(N)=12, f=17
303
+ R0=17
304
+ I[0][0]=17, I[0][1]=16,
305
+ y[0][0]=20, y[0][1]=19,
306
+ S[0]=3, s'[0]=10
307
+ I[1][0]=17, I[1][1]=16, I[1][2]=20,
308
+ K[1]=4
309
+ K[1]は平方剰余である
310
+ S[1]=2
311
+ y[1][0]=19, y[1][1]=18, y[1][2]=22,
312
+ S[1]=2, s'[1]=2
313
+ I[2][0]=17, I[2][1]=16, I[2][2]=20, I[2][3]=4,
314
+ K[2]=10
315
+ K[2]は平方剰余でない
316
+ R[2]=5
317
+ r[2][0]=2, r[2][1]=4, r[2][2]=20, r[2][3]=18,
318
+ y[2][0]=22, y[2][1]=1, y[2][2]=17, y[2][3]=15,
319
+ S[2]=2
320
+ R0=17, s[1][21]=7, N=3, p=23, q=0
321
+ I'[0][0]=17,f=21,N=0
322
+ I'[0][0]^f mod N=-2147483648
323
+ R[0][0]=5
324
+ レベル0の0番目のプレイヤーは,誤ったシェアを提出しました
325
+ R0=17, s[2][21]=7, N=3, p=0, q=0
326
+ I'[0][1]=17,f=21,N=0
327
+ I'[0][1]^f mod N=-2147483648
328
+ R[0][1]=4
329
+ レベル0の1番目のプレイヤーは,誤ったシェアを提出しました
330
+ R0=17, s[1][21]=7, N=3, p=0, q=0
331
+ I'[1][0]=17,f=21,N=0
332
+ I'[1][0]^f mod N=-2147483648
333
+ R[1][0]=5
334
+ レベル1の0番目のプレイヤーは,誤ったシェアを提出しました
335
+ R0=17, s[2][21]=7, N=3, p=0, q=0
336
+ I'[1][1]=17,f=21,N=0
337
+ I'[1][1]^f mod N=-2147483648
338
+ R[1][1]=4
339
+ レベル1の1番目のプレイヤーは,誤ったシェアを提出しました
340
+ R0=17, s[3][21]=7, N=3, p=0, q=0
341
+ I'[1][2]=17,f=21,N=0
342
+ I'[1][2]^f mod N=-2147483648
343
+ R[1][2]=20
344
+ レベル1の2番目のプレイヤーは,誤ったシェアを提出しました
345
+ R0=17, s[1][21]=7, N=3, p=0, q=0
346
+ I'[2][0]=17,f=21,N=0
347
+ I'[2][0]^f mod N=-2147483648
348
+ R[2][0]=5
349
+ レベル2の0番目のプレイヤーは,誤ったシェアを提出しました
350
+ R0=17, s[2][21]=7, N=3, p=0, q=0
351
+ I'[2][1]=17,f=21,N=0
352
+ I'[2][1]^f mod N=-2147483648
353
+ R[2][1]=4
354
+ レベル2の1番目のプレイヤーは,誤ったシェアを提出しました
355
+ R0=17, s[3][21]=7, N=3, p=0, q=0
356
+ I'[2][2]=17,f=21,N=0
357
+ I'[2][2]^f mod N=-2147483648
358
+ R[2][2]=20
359
+ レベル2の2番目のプレイヤーは,誤ったシェアを提出しました
360
+ R0=17, s[4][21]=7, N=3, p=0, q=0
361
+ I'[2][3]=17,f=21,N=0
362
+ I'[2][3]^f mod N=-2147483648
363
+ R[2][3]=16
364
+ レベル2の3番目のプレイヤーは,誤ったシェアを提出しました
255
365
  ```