質問編集履歴
3
p,q,Nが検証フェーズ前では正しい値が与えられたことを追加しました.
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
出力結果を更新しました.
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
どこで宣言して,どこがおかしくなったのか具体的な行数を追加し,出力結果を載せました.
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
|
```
|