【发布时间】:2011-02-24 19:59:33
【问题描述】:
我知道这不是通常的做法。但是我正在实现的规范是这样描述的,我不能用完。
我试图加密私钥的模数和指数,但以下测试代码引发异常,因为字节数组比 RSA 块允许的最大值大 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 块所允许的最大值,那么为什么会出现异常呢?以及如何解决?
编辑:如果我用 1023(而不是 1024)初始化密钥对生成器,它可以工作,但 RSA 密钥大小不是 1024 的通常情况吗?
【问题讨论】:
-
它也不适用于 1023。
-
为什么要加密无论如何都是公开的模数 byte[] byteArray = privateKey.getModulus().toByteArray();我认为你应该自己加密指数:privateKey.getPrivateExponent().toByteArray()
-
@GregS 正如我所说,它有效.. 你试过了吗?
-
@Krystian 我想我需要指数和模数来恢复密钥。
-
@Tom Brito:是的,我试过了。您的代码有一个错误(您丢弃了模数的高字节),这意味着它不会抛出异常,但它也不会工作。
标签: java encryption rsa