【问题标题】:How JDK RSACore.priCrypt works and what does getBlindingRandomPair mean?JDK RSACore.priCrypt 如何工作以及 getBlindingRandomPair 是什么意思?
【发布时间】:2019-04-11 09:53:16
【问题描述】:

我正在研究 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 是私钥。 我的问题是“getBlindingRandomPair”是什么意思?我无法弄清楚它的功能。如果再深入一点,谁能解释一下 BigInteger.modPow 函数是如何实现的?

【问题讨论】:

    标签: java encryption rsa biginteger


    【解决方案1】:

    首先,这是 RSA 私钥原语的非 CRT 版本,用于解密和签名(不,签名不是用私钥加密,尽管它的 部分是数学上相似;crypto.SX 和 security.SX 上有几十个关于此的 Q)。非 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] 致盲是一种防止(或至少减少)定时攻击的技术,它可以让对手找到您的私钥,从而破坏您的安全性,因为它破坏了私有密钥加密的基本要求。密钥保密,不为对手所知。 (请注意,加密中使用了其他类型的盲法,其中一些包括 RSA,所以不要混淆它们。)它使用一对随机的相关指数值(称为 u 和 v)在“真实”私钥之前和之后应用操作,getRandomBlindingPair 表示获取随机致盲值对。 Wikipedia 有一个很好的 brief description 并且来源(见上文)详细说明了它是如何实现的。请注意,在某些错误情况下,它并不像预期的那样随机;这是在最好的安全性和让人们的程序有时会因为大多数用户永远无法理解或无法快速修复甚至根本无法修复的原因之间的权衡,这会让他们对 Java 非常不满意。

    谁能解释一下 BigInteger.modPow 函数是如何实现的?

    不在堆栈答案中。近几十年来,数学家对使用“bignums”,特别是模块化 bignums(如 RSA 所使用的)进行计算的高效(快速)算法和方法进行了大量研究,这在很大程度上是由于它们在 RSA 等公钥密码学中的使用。 modPow 的实现使用了这些方法;从 java 8 开始,它使用 Karatsuba、Toom-Cook 和 Montgomery 的方法,如果以后的版本(我还没有下载)添加更多,我不会感到惊讶。除非您想学习(或已经知道)一些高等数学知识,否则最好相信 modPow 符合其名称所暗示并在 Javadoc 中说明的(简单)规范,而忽略其内部结构。

    【讨论】:

    • 感谢您详细而专业的回答。我对JDK源代码不是很熟悉,我只是在IDEA中编写了一个RSA加密示例并调试到RSACore中。现在我在 github JDK 上找到了源代码。非常感谢!
    猜你喜欢
    • 2021-09-16
    • 2018-04-24
    • 2020-04-22
    • 1970-01-01
    • 2012-07-22
    • 2010-11-22
    • 2015-02-02
    • 2011-06-29
    • 2012-09-12
    相关资源
    最近更新 更多