文章目录

  • 题目
  • 环境
  • 方案设计
    • 背景
    • 原理
    • 算法步骤
  • 方案实现
    • 流程图
    • 主要函数
    • C代码
    • 测试
    • 注意问题
  • 说明

题目

一个秘密?,被分割成?个子秘密(??,??),从?个子秘密(??,??)中任意选择大于等于?个,能够恢复出秘密?,少于t个则不能恢复出秘密?。

环境

Windows10,MinGW-W64-builds-4.3.5,miracl 7.0.1

方案设计

背景

中国剩余定理

原理

  1. (?,?)门限,一个秘密?,被分割成?个子秘密 (??,??)
    对于某个秘密 ?,计算

{k1≡k(modd1)k2≡k(modd2)kn≡k(moddk)\begin{cases} k_1 ≡ k (mod \, d1) \\ k_2≡ k (mod \, d2)\\\\\\ k_n ≡ k (mod \, dk) \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​k1​≡k(modd1)k2​≡k(modd2)kn​≡k(moddk)​则子秘密为 (??,??)
要求一: 选择?个整数??,??,⋯,??,满足
(1)?? < ?? < ⋯ < ??
(2) (??,??) = ?,? ≠ ?;
(3)? = ??×?? ×⋯×??
? = ??−?+? ×??−?+? ×⋯×??,有? > ?
要求二: ? > ? > ?

  1. ?个子秘密中任意选择?个,(???,???), (???,???),⋯, (???,???),恢复出秘密 ?,计算{ki1≡k(moddi1)ki2≡k(moddi2)kit≡k(moddit)\begin{cases} k_{i1} ≡ k (mod \, di1) \\ k_{i2}≡ k (mod \, di2)\\\\\\ k_{it} ≡ k (mod \, dit) \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​ki1​≡k(moddi1)ki2​≡k(moddi2)kit​≡k(moddit)​恢复出秘密 ? ≡ ? ??? ??,?? = ??? ⋯???。
    任意选择?−? 个子秘密不能恢复出秘密:(???,???), (???,???), ⋯, (???−?,???−?
    ? ≡ ? ???? ,?? = ?????? ⋯???−?
    N1> N > k > M > M1

算法步骤

(3,5)门限,一个秘密?,被分割成5个子秘密 (??,??)。

  1. 随机生成300 bits的大整数K
  2. 在2300/3和2300/(5-3)之间取5个素数作为di,?? < ?? < ?3 < ?4< ?5
  3. 计算 ? = ?? ×?? ×?3 ,? = ?4 ×?5
  4. 计算 ki ≡ K (??? di)
  5. 恢复:随机选择3个di,利用中国剩余定理计算x {ki1≡k(moddi1)ki2≡k(moddi2)kit≡k(moddit)\begin{cases} k_{i1} ≡ k (mod \, di1) \\ k_{i2}≡ k (mod \, di2)\\\\\\ k_{it} ≡ k (mod \, dit) \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​ki1​≡k(moddi1)ki2​≡k(moddi2)kit​≡k(moddit)​? ≡ ? ???? ,?? = ?????? ⋯???
  6. 比较x与K是否相等。

方案实现

流程图

主要函数

  • bigdig(int b, int t,big w) 生成b位t进制的大数w
  • expint(int t, int b, big z)求z=tb
  • isprime(big v)判断v是否素数
  • incr(big v, int t, big w)计算w = v + t
  • mr_compare(big a, big b),如果a>b,函数返回值为1;如果a=b,函数返回值为0;如果a<b,函数返回值为-1;
  • fft_mult(big x, big y, big z) z=x*y
  • divide(big x, big y, big z) z=x/y;如果y==z,x=x mod y

C代码

#include"miracl.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define T 3
#define S 5
#define RCV 3
#define OFFSET 7
#define BITS 300int main(void)
{miracl  *mip = mirsys(1000,16);int i = 0, j = 0, seed[RCV];big K, k[S], d[S], N, M, v;big D[S], D_1[S], n, x;K = mirvar(0); N = mirvar(1); M = mirvar(1);v = mirvar(1); n = mirvar(1); x = mirvar(0);for (i = 0; i < S; i++) {k[i] = mirvar(0); d[i] = mirvar(0);D_1[i] = mirvar(0); D[i] = mirvar(0);}irand(time(NULL));puts("secret K:");//generate K// bigdig(BITS, 10, K);bigbits(BITS, K); cotnum(K, stdout);// expint(10, BITS/T + OFFSET, v);expb2(BITS/T + OFFSET, v); incr(v,1,v);                // find 5 d[i]for (i = 0; i < S; i++) {while (1) {incr(v, 2, v);if (isprime(v)) {printf("d[%d]: ",i);cotnum(v, stdout);copy(v, d[i]);break;}}}puts("N: ");for (i = 0; i < T; i++) {fft_mult(d[i], N, N);} cotnum(N, stdout);puts("M: ");for (i=1; i < T ; i++) {fft_mult(d[S-i], M, M);} cotnum(M, stdout);for (i = 0; i < S; i++) { //compute k[i]copy(K, k[i]);divide(k[i], d[i], d[i]);printf("k[%d]: ",i);cotnum(k[i], stdout);}srand(time(NULL));//generate RCV random differente numbersfor (i = 0; i < RCV; i++) {seed[i] = rand() % S;   do {for (j = 0; j < i; j++) {if (seed[i] == seed[j]) break;}if (i != j) {seed[i] = rand() % S;  }else {break;}}while(1);} // chinese remainder theory recover Kfor (i = 0; i < RCV; i++) {fft_mult(n, d[seed[i]], n);}       printf("\nchoose %d k:\n", RCV);for (i = 0; i < RCV; i++) {printf("k[%d]:",seed[i]); cotnum(k[seed[i]], stdout);copy(n, v);divide(v, d[seed[i]], D[seed[i]]);invmodp(D[seed[i]],d[seed[i]],D_1[seed[i]]);fft_mult(k[seed[i]], D[seed[i]], d[seed[i]]);fft_mult(d[seed[i]], D_1[seed[i]], d[seed[i]]);divide(d[seed[i]], n, n);add(d[seed[i]], x, x);}divide(x, n, n);putchar('\n'); printf("x= "); cotnum(x, stdout); printf("K= "); cotnum(K, stdout);!mr_compare(x, K)?puts("x == K"):puts("x != K");mirexit();return 0;
}

测试


2.

注意问题

因为要求选择?个整数??,??,⋯,??,满足 ?个最小的??的乘 积严格大于?−? 个最大的??的乘积且? > ? > ?,又由于k是300位的数所以di应该在100到150位之间。在100到150位之间取5个素数即可满足条件。

说明

课程作业,仅作记录

秘密共享方案-中国剩余定理相关推荐

  1. 秘密共享方案介绍SS

    秘密共享 概念 Shamir秘密共享方案 秘密拆分 秘密恢复 补充 网页参考链接 概念 问题1:保险柜中存放有10个人的共有财产,要从保险柜中取出物品,必须有半数以上的人在场才可取出,半数以下则不行. ...

  2. 基于中国剩余定理的(t, n)门限秘密共享方案

    基于中国剩余定理的(t, n)门限秘密共享方案 目录 实验目的 实验环境 实现目标 方案设计 背景 实验原理 算法步骤 方案实现 流程图 主要函数介绍 主要代码 数据分析 数据1 数据1运行结果 数据 ...

  3. 基于Miracl库的中国剩余定理C语言实现

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/tch3430493902/articl ...

  4. 信息安全基础综合实验-中国剩余定理

    最近没有什么事情,打算把之前的作业整理一下发出来,有需要的学弟学妹们可以参考一下. 相关:某电的密码学实验,信安专业必选实验 实验题目:中国剩余定理 实验目的 (包括实验环境.实现目标等等) 实验环境 ...

  5. 中国剩余定理matlab程序,中国剩余定理即孙子定理的五种解法

    中国剩余定理即孙子定理的五种解法 -- 学习初等数论心得笔记 2013-10-04 博文2015-12修改 "中国剩余定理"是公元5-6世纪.我国南北朝时期的一部著名算术著作< ...

  6. CF338D GCD Table(拓展中国剩余定理,细节处理,2900分)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 CF338D GCD Table(拓展中国剩余定理,细节处理,2900分) Problem 有一张 n ...

  7. 初等数论--同余方程--同余方程组:中国剩余定理

    初等数论--同余方程--同余方程组:中国剩余定理 博主是初学初等数论(整除+同余+原根),本意是想整理一些较难理解的定理.算法,加深记忆也方便日后查找:如果有错,欢迎指正. 我整理成一个系列:初等数论 ...

  8. 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

    打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...

  9. 信奥中的数学:孙子定理 中国剩余定理

    孙子定理 中国剩余定理 孙子定理 中国剩余定理_Dreamer Thinker Doer-CSDN博客 中国剩余问题(简介+详解) 中国剩余问题(简介+详解)_dreamzuora的博客-CSDN博客 ...

最新文章

  1. 移动端省际联动插件mobiscroll
  2. 2019年猪年海报PSD模板-第四部分
  3. 导购的路上,媒体向左,社区向右
  4. sql server 2012远程链接的方法及步骤
  5. oracle销售服务器吗,oracle 服务器 版本
  6. FileZilla软件下载使用简易教程
  7. quartz获取缓存中所有运行中的Job
  8. openstack初探
  9. 小心那些年末还在努力的狠人!
  10. 组件化开发Android应用及SDK
  11. 32岁了,我有机会转行做程序员吗?——Leo网上答疑(1)
  12. 开放源代码不得不知的一些事情
  13. 管理系统中计算机er图怎么画,使用PowerDesigner绘制ER图的详细教程
  14. msys2+mingw64+ragel安装
  15. 企业微信4.0:上下游功能上线,用一款APP连接所有企业组织和用户
  16. 学生上课睡觉班主任怎么处理_学生上课睡觉,老师该怎么处理? | 实操课103
  17. python web 开发从入门到精通 pdf_Python Web开发从入门到精通
  18. 使用jq来封装一个瀑布流插件
  19. [usaco3.2.4]ratios
  20. 银联进件渠道教程-云闪付收银台最新方法(可对接易支付)

热门文章

  1. 7.3结构体是纸老虎,旧知识新用法
  2. App Store审核条款(2016.06.21更新)
  3. 实习之家 - 专注于实习生招聘的平台。找实习职位,发布实习信息,就上实习之家!...
  4. void* shu_zu_ming[n][m] 传参的函数定义写法 【C++】
  5. wps中删除我的设备(已经不使用的)
  6. 【Scrum】守、破、离(shu ha ri)
  7. 递归组件(简单介绍)
  8. Python入门之元组-元组的定义和操作
  9. 如何删除无效的网络驱动器
  10. uniapp 固定首行和固定列的表格