使用Java BigInteger从g ^(xr)和x计算g ^ r
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Java BigInteger从g ^(xr)和x计算g ^ r,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2821字,纯文字阅读大概需要5分钟。
内容图文
我正在尝试使用Java的BigInteger对象实现类似ElGamal的加密算法.
> q是2p 1形式的安全素数
> g是该组的生成器
我想计算,但遇到麻烦了.使用modInverse我可以计算,但是如果我将此值与modPow一起使用,只会得到错误的结果.
我在网上发现的唯一示例是this one,其中作者使用modInverse计算:
BigInteger temp = c1.modPow(a,p);
temp = temp.modInverse(p);
// Print this out.
System.out.println("Here is c1^ -a = "+temp);
我尝试了一些变体(包括将modPow与-1一起使用),但无法使其正常工作.我认为数学应该是正确的,但是可以提供任何帮助.
这是我的代码:
final static BigInteger q = new BigInteger("179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624225795083");
final static BigInteger p = new BigInteger("89884656743115795386465259539451236680898848947115328636715040578866337902750481566354238661203768010560056939935696678829394884407208311246423715319737062188883946712432742638151109800623047059726541476042502884419075341171231440736956555270413618581675255342293149119973622969239858152417678164812112897541");
final static BigInteger g = new BigInteger("117265744532406309959187881490003058805548219220442880294934902019840205433866971629230940840348591638390822573295684678850519428432938503385192533090834775615734759306193531798190548626342600942782601381215002354918333367595380233608085319759193895027739039963819751637948789055533978566423454988608037601806");
/**
* @param args
*/
public static void main(String[] args) {
BigInteger x = new BigInteger("1143167411333064507035595976576260123572705969224418468247407610494944119131645169381885774886951623439260024159767473519706771572117243833759909829897948112642480886709322424314787175230081859236165044801596619590783556439791012887937120324676147585272259948372265307207312838134079528284932292492131276823586631161241002772401238870376093826305673839039010423270418706970005486897400");
BigInteger r = new BigInteger("28622599320501138892999789676320846139720948572640603818980549097364886339367");
// g^(xr) = g^(x*r)
BigInteger g_xr = g.modPow(x.multiply(r), q);
// 1/x
BigInteger x_inverse = x.modInverse(q);
System.out.println(x.multiply(x_inverse).mod(q)); // -> 1 --> correct
// g^r = g^(xr) ^ (1/x)
BigInteger g_r = g_xr.modPow(x_inverse, q); // FIXME: wrong result
System.out.println(g_r); //result
System.out.println(g.modPow(r, q)); // expected result
}
解决方法:
乘法组的阶数为q-1-即gq-1 = 1 mod q.因此,您需要找到的不是x模q的倒数,而是q-1的模.
(此外,user1008646是正确的,即gxr =(gx)r≠gxgr = gx r.)
编辑:总结一下下面的讨论,描述OP正在实现的算法的paper有一个错别字:不是工作于,他需要工作在它的order-p子组中. (此外,本文使用的p和q与OP在此处使用它们的方式相反.)
内容总结
以上是互联网集市为您收集整理的使用Java BigInteger从g ^(xr)和x计算g ^ r全部内容,希望文章能够帮你解决使用Java BigInteger从g ^(xr)和x计算g ^ r所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。