不经意传输
考虑这样的场景:A意欲出售许多个问题的答案,B打算购买其中一个问题的答案,但又不想让A知道他买的哪个问题的答案。即B不愿意泄露给A他究竟掌握哪个问题的秘密,此类场景可通过不经意传输协议实现。
不经意传输(OT,Oblivious Transfer)又称健忘传输或茫然传输,由Rabin于1981年提出。不经意传输是从一个消息集合秘密获取取部分消息的方法,该协议执行完毕后,接收方知道他是否收到这个秘密,但发送方却不知道。不经意传送是密码学中的基本构件,广泛应用于比特承诺、零知识证明、安全多方计算和电子支付等协议中。
不经意传输包括:1-out-of-2不经意传输、1-out-of-n不经意传输、m-out-of-n不经意传输。
Blum不经意传输又称Rabin不经意传输,该协议中发送方以50%的概率传送一个秘密(整数 n n n的因数分解)给接收者,接收者有50%的机会收到这个秘密,有50%的机会什么也没有收到。
(1)A选择形式为 4 r + 3 4r+3 4r+3的两个个大素数,发送Blum数 n = p × q n=p\times q n=p×q给B,但将 p , q p,q p,q作为秘密保留。
(2)B随机选取一个整数 x x x,满足 0 < x < n , gcd ( x , n ) = 1 0<x<n,\operatorname{gcd}(x, n)=1 0<x<n,gcd(x,n)=1,即 x x x是比 n n n小且与 n n n互素的正整数,然后发送 a ≡ x 2 ( m o d n ) a \equiv x^{2}(\bmod n) a≡x2(modn)给A。
(3)A根据已知的 p , q p,q p,q求出 x 2 ≡ a ( m o d p ) x^{2} \equiv a(\bmod p) x2≡a(modp)对应的 2 2 2个根,然后A随机选择其中的一个根发送给B。
(4)如果B接收到的是 y y y或 n − y n-y n−y,则B通过已知的 x x x和接收到的 y y y就可以得出 p p p和 q q q: gcd ( x + y , n ) = p \operatorname{gcd}(x+y, n)=p gcd(x+y,n)=p 或 gcd ( x + y , n ) = q \operatorname{gcd}(x+y, n)=q gcd(x+y,n)=q。若 B 接收到的是 x x x或 n − x n-x n−x,则B得不出 n n n的任何信息。
O T 1 2 OT_{1}^{2} OT12不经意传输:Alice拥有两个消息 M 1 , M 2 M_1,M_2 M1,M2,Bob得到其中的一份消息且Alice不知道是哪一个。
(1) Alice产生两个公开密钥/私人密钥对,共4个密钥,她把两个公开密钥发进给Bob。
(2) Bob生成一个对称算法(例如DES)密钥 K K K,选择Alice的一个公开密钥加密他的DES密钥 K K K,发送给 Alice(但不告诉她使用的是哪个公开密钥)。
(3) Alice每次使用一个她的私人密钥来解密Bob的密钥。Alice要么使用了正确的密钥并成功地解密Bob的DES密钥 K K K,要么使用了错误的密钥只是产生了一堆毫无意义而看上去又像一个随机DES密钥的位 K ‘ K‘ K‘。由于她不知道正确明文,所以不知道哪个是正确的。
(4) Alice分别使用产生的两个DES密钥加密她的两个消息,假设使用 K K K加密 M 1 M_1 M1,使用 K ‘ K‘ K‘加密 M 2 M_2 M2,将 E K ( M 1 ) , E K ′ ( M 2 ) E_{K}(M_1),E_{K'}(M_2) EK(M1),EK′(M2)发送给 Bob。
(5) Bob收到一个用正确DES密钥加密的消息 E K ( M 1 ) E_{K}(M_1) EK(M1)和一个用无意义DES密钥加密的消息 E K ′ ( M 2 ) E_{K'}(M_2) EK′(M2),当Bob用他的DES密钥解密每一份消息时,他能读其中之一,另一份在他看起来毫无意义。
此时Bob现在有了Alice两份消息中的一个(本例中是 M 1 M_1 M1),而Alice不知道他能读懂哪一个。
(1)Alice选择两个随机数 r 0 , r 1 r_{0}, r_{1} r0,r1,发送给Bob。
(2)Bob选择一个随机数 r r r,用Alice的公钥 d d d加密 r r r: E d ( r ) = r d E_d(r)=r^{d} Ed(r)=rd,并且选择一个随机数(假设选择 r 0 r_{0} r0),计算 S = r 0 + E d ( r ) S=r_0+E_d(r) S=r0+Ed(r),发送给Alice。
(3)Alice计算 S 0 = S − r 0 , S 1 = S − r 1 S_{0}=S-r_{0},S_{1}=S-r_{1} S0=S−r0,S1=S−r1,并用私钥 e e e解密计算 D e ( S 0 ) , D e ( S 1 ) D_e(S_{0}),D_e(S_{1}) De(S0),De(S1),然后发送 M 0 ′ = M 0 ⊕ D e ( S 0 ) , M 1 ′ = M 1 ⊕ D e ( S 1 ) M_{0}'=M_{0} \oplus D_e(S_{0}),M_{1}'=M_{1} \oplus D_e(S_{1}) M0′=M0⊕De(S0),M1′=M1⊕De(S1) 给Bob。
(4)Bob计算 M 0 ′ ⊕ r , M 1 ′ ⊕ r M_{0}'\oplus r,M_{1}'\oplus r M0′⊕r,M1′⊕r,其中 M 0 ′ ⊕ r = M 0 ⊕ D e ( S 0 ) ⊕ r = M 0 ⊕ D e ( S − r 0 ) ⊕ r = M 0 ⊕ D e ( r 0 + E d ( r ) − r 0 ) ⊕ r = M 0 ⊕ D e ( E d ( r ) ) ⊕ r = M 0 ⊕ r ⊕ r = M 0 \begin{aligned} M_{0}' \oplus r &= M_{0} \oplus D_e(S_{0}) \oplus r \\ &= M_{0} \oplus D_e(S-r_0)\oplus r \\ &= M_{0} \oplus D_e(r_0+E_d(r)-r_0)\oplus r \\ &= M_{0} \oplus D_e(E_d(r)) \oplus r \\ &= M_{0} \oplus r \oplus r \\ &= M_{0}\end{aligned} M0′⊕r=M0⊕De(S0)⊕r=M0⊕De(S−r0)⊕r=M0⊕De(r0+Ed(r)−r0)⊕r=M0⊕De(Ed(r))⊕r=M0⊕r⊕r=M0Bob恢复了消息 M 0 M_0 M0,同时Alice不知道Bob恢复的哪个消息。
O T 1 n OT_{1}^{n} OT1n不经意传输:Alice拥有 n n n个消息 ( M 1 , M 2 , … , M n ) (M_{1}, M_{2}, \ldots, M_{n}) (M1,M2,…,Mn),Bob得到其中某一个 M i M_{i} Mi且Alice不知道是哪一个。
系统参数:设 p , q p,q p,q均为素数, p = 2 q + 1 p=2q+1 p=2q+1, G q G_{q} Gq是 Z P ∗ Z_{P}^{*} ZP∗的一个 q q q阶子群, g , h g,h g,h为 G q G_{q} Gq的两个生成元, Z q Z_{q} Zq表示模 q q q的最小剩余集,协议两个参与方Alice和Bob都知道 ( g , h , G q ) \left(g, h, G_{q}\right) (g,h,Gq)。
(1) Bob选择 r ∈ R Z q r \in_{R} Z_{q} r∈RZq和 i ( 1 ≤ i ≤ n ) i(1 \leq i \leq n) i(1≤i≤n),计算 y = g r h i m o d p y=g^{r} h^{i} \bmod p y=grhimodp 发送给Alice;
(2) Alice对所有 1 ≤ j ≤ n , k j ∈ z q 1 \leq j \leq n, k_{j} \in z_{q} 1≤j≤n,kj∈zq,计算 a j = g k j m o d p , b j = M j ( y / h i ) k j m o d p a_{j}=g^{k_{j}} \bmod p, b_{j}=M_{j}\left(y / h^{i}\right)^{k_{j}} \bmod p aj=gkjmodp,bj=Mj(y/hi)kjmodp 将 ( a 1 , b 1 ) , ( a 2 , b 2 ) , … , ( a n , b n ) \left(a_{1}, b_{1}\right),\left(a_{2}, b_{2}\right), \ldots,\left(a_{n}, b_{n}\right) (a1,b1),(a2,b2),…,(an,bn) 发送给Bob;
(3) Bob 计算 b i / a i r m o d p = M i ( y / h i ) k i / a i r m o d p = M i ( g r h i / h i ) k i / ( g k j ) r m o d p = M i \begin{aligned} b_{i} /a_{i}^{r} \bmod p &= M_{i}\left(y/h^{i}\right)^{k_{i}}/a_{i}^{r} \bmod p \\ &= M_{i}\left(g^{r} h^{i}/h^{i}\right)^{k_{i}}/{(g^{k_{j}})}^{r} \bmod p \\ &= M_{i} \end{aligned} bi/airmodp=Mi(y/hi)ki/airmodp=Mi(grhi/hi)ki/(gkj)rmodp=MiBob恢复了消息 M i M_i Mi,同时Alice不知道Bob恢复的哪个消息。
O T k n OT_{k}^{n} OTkn不经意传输:Alice有 n n n个秘密, ( M 1 , M 2 , … , M n ) (M_{1}, M_{2}, \ldots, M_{n}) (M1,M2,…,Mn),Bob得到其中 k k k个且Alice不知道是哪一个。
通过执行 k k k次 O T 1 n OT_{1}^{n} OT1n协议m,来实现m-out-of-n的不经意传输。
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in
给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at
默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同
我在一个ruby文件中有一个函数可以像这样写入一个文件File.open("myfile",'a'){|f|f.puts("#{sometext}")}这个函数在不同的线程中被调用,使得像上面这样的文件写入不是线程安全的。有谁知道如何以最简单的方式使这个文件写入线程安全?更多信息:如果重要的话,我正在使用rspec框架。 最佳答案 您可以通过File#flock给锁File.open("myfile",'a'){|f|f.flock(File::LOCK_EX)f.puts("#{sometext}")}