JDK RSACore.priCrypt如何工作以及getBlindingRandomPair是什么意思?

问题描述 投票:0回答:1

我正在研究JDK如何实现RSA解密。我在RSACore.class中找到了函数“priCrypt”,下面是代码:

    private static byte[] priCrypt(byte[] var0, BigInteger var1, BigInteger var2) throws BadPaddingException {
        BigInteger var3 = parseMsg(var0, var1);
        RSACore.BlindingRandomPair var4 = null;
        var4 = getBlindingRandomPair((BigInteger)null, var2, var1);
        var3 = var3.multiply(var4.u).mod(var1);
        BigInteger var5 = var3.modPow(var2, var1);
        var5 = var5.multiply(var4.v).mod(var1);
        return toByteArray(var5, getByteLength(var1));
    }

var0是cipher_text,var1是模数,var2是private_key。我的问题是“getBlindingRandomPair”是什么意思?我无法弄清楚它的功能。如果深入一点,任何人都可以解释BigInteger.modPow功能是如何实现的?

java encryption rsa biginteger
1个回答
1
投票

首先,这是RSA私钥原语的非CRT版本,用于解密和签名(不,签名不是用私钥加密,虽然它的一部分在数学上是相似的;加密有几十个Qs .SX和security.SX关于那个)。非CRT版本的成本不必要,应该通过使用CRT表格密钥(RSAPrivateCrtKey)来避免,在这种情况下RSACore使用crtCrypt()代替。

另外我希望你知道RSA加密/解密和签名/验证不仅仅是原始的x ^ e mod pq和y ^ d mod pq,它们本身并不安全;必须始终添加“填充”操作,并且对于签名,通常还必须添加安全散列(也称为摘要)操作;这些也在加密和安全性方面进行了广泛讨论。

其次,这个代码显然是反编译的,因为除了丢失标识符之外,它还省略了一个恒定的if测试,并结合了源中单独的声明和赋值。我推荐使用源码,因为它部分回答了你的一些问题。 (至少根据旧的Sun许可证,反编译违反了许可条款,尽管人们仍然这样做。我没有在新的拆分OpenJDK与商业许可下重新审视。)所有OpenJDK源都可以在https://hg.openjdk.java.net和我'下找到已经看过几个其他存储库的引用(但我不熟悉)。

“getBlindingRandomPair”是什么意思?

RSA [privatekey] blinding是一种防止(或至少减少)定时攻击的技术,它可以让攻击者找到你的私钥,从而通过破坏保存私钥的公钥加密的基本要求来破坏你的安全性私人的,不为对手所知。 (注意在加密中使用了其他类型的盲法,其中一些包括RSA,因此不要混淆它们。)它使用在“真实”私钥之前和之后应用的随机对相关指数值(称为u和v)操作,getRandomBlindingPair意味着得到一对随机的盲目值。维基百科有一个很好的brief description和源(见上文)详细介绍了它是如何实现的。请注意,在某些错误情况下,它并不像预期的那样随机;这是最好的安全性之间的权衡,并且人们的程序有时会失败的原因是大多数用户永远无法理解或能够快速修复而根本不能修复,这会让他们对Java非常不满意。

任何人都可以解释BigInteger.modPow功能是如何实现的?

不在堆栈答案中。近几十年来,数学家对用于“bignums”计算的高效(快速)算法和方法,特别是模块化bignums(作为RSA使用)进行了大量研究,这在很大程度上归功于它们在RSA等公钥密码学中的应用。 modPow的实施使用这些方法;从Java 8开始,它使用Karatsuba,Toom-Cook和Montgomery的方法,如果以后的版本(我还没有打扰下载),我也不会感到惊讶。除非你想学习(或已经知道)一些高等数学,否则你最好相信modPow符合其名称所隐含的(简单)规范并在Javadoc中陈述,并忽略了内部。

© www.soinside.com 2019 - 2024. All rights reserved.