gpt4 book ai didi

java - 如何使用另一个 RSAKey 加密一个 RSAKey?

转载 作者:行者123 更新时间:2023-12-01 19:23:08 25 4
gpt4 key购买 nike

我知道这不是平常的事情。但我正在实现的规范是这样描述的,我不能用完。

我试图加密私钥的模数和指数,但以下测试代码引发异常,因为字节数组比 RSA block 允许的最大值大 1 个字节:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

import javax.crypto.Cipher;

import org.apache.commons.lang.ArrayUtils;

public class TEST {

public static KeyPair generateKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC");
keyPairGenerator.initialize(1024);
return keyPairGenerator.generateKeyPair();
}

public static void main(String[] args) throws Exception {

KeyPair keyPair = generateKeyPair();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

System.out.println("Priv modulus len = " + privateKey.getModulus().bitLength());
System.out.println("Priv exponent len = " + privateKey.getPrivateExponent().bitLength());
System.out.println("Priv modulus toByteArray len = " + privateKey.getModulus().toByteArray().length);

byte[] byteArray = privateKey.getModulus().toByteArray();
// the byte at index 0 have no value (in every generation it is always zero)
byteArray = ArrayUtils.subarray(byteArray, 1, byteArray.length);

System.out.println("byteArray size: " + byteArray.length);

RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
Cipher cipher = Cipher.getInstance("RSA", "BC");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(byteArray);

System.out.println("Success!");
}

}

(obs。这只是一个测试,我永远不会用它的公钥对私钥加密)

字节数组是 128 字节,正是 RSA block 允许的最大值,那么为什么会出现异常呢?又该如何解决呢?

编辑:如果我使用 1023(而不是 1024)初始化 key 对生成器,它可以工作,但 RSA key 大小不是通常的 1024 吗?

最佳答案

首先:有人写了这个规范。与他们联系而不是询问我们。他们写这个要求是有原因的,你需要知道它是什么。当面对不明确的需求时,最糟糕的事情就是开始猜测 - 尤其是在处理密码学时。

第二:在您的测试代码中,您正在加密私钥模数。模数在 RSA 加密系统中不是 secret 的,因此不需要对其进行加密。您并不是试图加密私有(private)指数(这是实际的 secret 部分)。私有(private)指数始终小于模数,因此您应该能够使用原始 RSA 操作对其进行加密(如果您确保删除前置零)。这应该是安全的(翻译:考虑到它 30 秒,我没有看到任何明显的攻击)- 如果非标准。

编辑:正如 GregS 在评论中指出的那样,您无法确定要加密的 key 的私有(private)指数是否小于要用于加密的 key 的模数。我认为大约 25% 的情况下情况并非如此。因此请改用下面的方法。

更好的方法(这是完全标准的,我怀疑这是规范编写者的实际意图)是使用通常的混合方法加密私钥:生成对称 key ,用它来加密私钥(在这里您可以使用标准序列化格式,而不必担心长度),使用另一个公钥(使用 RSA/PKCS#1)加密对称 key ,并将这两种加密传输给执行相反操作的接收者步骤。

关于java - 如何使用另一个 RSAKey 加密一个 RSAKey?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2924150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com