我正在研究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
是密文,var1
是模数,var2
是private_key。
我的问题是“ getBlindingRandomPair”是什么意思?我不知道它的功能。如果更深入,谁能解释BigInteger.modPow函数是如何实现的?
答案 0 :(得分:1)
首先,这是RSA私钥原语的非CRT版本,用于解密和签名(不,签名不是用私钥加密,尽管它的 part 是在数学上相似;关于crypto.SX和security.SX有数十个Q。非CRT版本不必要地昂贵,应避免使用CRT格式键(RSAPrivateCrtKey
),在这种情况下,RSACore
会使用crtCrypt()
。
我也希望您知道RSA加密/解密和签名/验证不仅是原语x ^ e mod pq和y ^ d mod pq,它们本身也不安全;必须始终添加“填充”操作 ,并且对于签名,通常还必须添加安全的哈希(aka摘要)操作;加密和安全性也对此进行了广泛的讨论。
第二,此代码显然是反编译的,因为除了丢失标识符之外,它还进行了恒定的if
测试,并在源代码中组合了单独的声明和赋值。我建议改用源代码,因为它可以部分回答您的一些问题。 (再加上至少在旧的Sun许可下,反编译是违反许可条款的,尽管人们还是这样做了。在OpenJDK与商业许可的新组合中,我没有考虑过。)所有OpenJDK的源代码都可以在{{3}下找到},而我也看到了对其他几个存储库的引用(但并不熟悉)。
“ getBlindingRandomPair”是什么意思?
RSA [私有密钥]盲是一种防止(或至少减少)定时攻击的技术,该技术可使攻击者发现您的私有密钥,从而破坏了公共密钥密码学的基本要求,从而破坏了安全性,即私有密钥密钥应保密,并且不会被对手知道。 (请注意,加密中还有其他类型的盲法,其中有些包括RSA,因此请不要混淆。)它使用在“真实”私钥之前和之后应用的一对随机相关的指数值(称为u和v)。 getRandomBlindingPair
表示获取一对随机盲值。 Wikipedia有一个不错的https://hg.openjdk.java.net,其来源(请参阅上文)详细说明了其实现方式。请注意,在某些错误情况下,它并没有达到预期的随机性。这是在最好的安全性之间做出的权衡,人们程序有时由于大多数用户永远无法理解或无法快速修复甚至根本无法修复的原因而失败,这会使他们对Java感到不满。
谁能解释BigInteger.modPow函数是如何实现的?
不在堆栈中回答。最近几十年来,数学家已经对使用“ bignums”,尤其是模块化bignums(如RSA使用)进行高效(快速)计算的算法和方法进行了广泛的研究,这在很大程度上是由于它们在诸如RSA的公钥密码学中的使用。 modPow
的实现使用以下方法;从Java 8开始,它使用了Karatsuba,Toom-Cook和Montgomery的方法,如果以后的版本(我还没有下载的麻烦)再添加更多的内容,我不会感到惊讶。除非您想学习(或已经知道)大量的高等数学,否则最好不要相信modPow
符合其名称所隐含且在Javadoc中声明的(简单)规范,而忽略其内部知识。>