如何计算 Java 中 KeyPairGenerator 的密钥大小?
How to calculate keysize of KeyPairGenerator in Java?
我想在 Java 中使用 KeyPairGenerator 创建 public 和私钥,稍后在 Cipher 中使用“RSA/ECB/PKCS1Padding”对我来说很重要。
阅读后this answer我应该使用这个公式:
maximum bytes = key length in bits / 8 - 11
现在:
512 Byte = 4096 bit
1024 Byte = 8192 bit
如果我使用 8192/8-11,它运行良好,但当我使用 4096/8-11 时,出现此错误:“密钥大小无效”。
为什么我不能使用 512Byte?这是 KeyPairGenerator 的限制还是什么?
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(4096/8-11);
这些天我从未听说过限制密钥长度,但你永远不知道。下面是一个示例,它创建了一个 4096 位的 RSA 密钥对,并给出了有关 Java 版本和正在使用的操作系统的一些详细信息。
我正在生成一个 RSAPrivate/PublicKey 而不是 Private/PublicKey KeyPair 来获取位长,但在你的情况下你会生成后者。
这是 运行 在我的 Online-compiler 上运行程序时的结果,运行 这里的示例:https://paiza.io/projects/RGfFI7g3a2WyjjdtU8vsAA:
RSA Key Generation
Java version: main: 13 major: 0 minor: 1+9 update: build:
Operation system: Linux
RSA key generation
PrivateKey: RSA format: PKCS#8 modulus: 4096
PublicKey: RSA format: X.509 modulus: 4096
代码如下:
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
public class Main {
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println("RSA Key Generation");
System.out.println("Java version: " + getJavaVersion());
System.out.println("Operation system: " + System.getProperty("os.name"));
System.out.println("RSA key generation");
KeyPairGenerator rsaGenerator = KeyPairGenerator.getInstance("RSA");
SecureRandom random = new SecureRandom();
rsaGenerator.initialize(4096, random);
KeyPair rsaKeyPair = rsaGenerator.generateKeyPair();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) rsaKeyPair.getPrivate();
RSAPublicKey rsaPublicKey = (RSAPublicKey) rsaKeyPair.getPublic();
System.out.println("PrivateKey: " + rsaPrivateKey.getAlgorithm()
+ " format: " + rsaPrivateKey.getFormat()
+ " modulus: " + rsaPrivateKey.getModulus().bitLength());
System.out.println("PublicKey: " + rsaPublicKey.getAlgorithm()
+ " format: " + rsaPublicKey.getFormat()
+ " modulus: " + rsaPublicKey.getModulus().bitLength());
}
public static String getJavaVersion() {
String[] javaVersionElements = System.getProperty("java.runtime.version").split("\.|_|-b");
String main = "", major = "", minor = "", update = "", build = "";
int elementsSize = javaVersionElements.length;
if (elementsSize > 0) {main = javaVersionElements[0];}
if (elementsSize > 1) {major = javaVersionElements[1];}
if (elementsSize > 2) {minor = javaVersionElements[2];}
if (elementsSize > 3) {update = javaVersionElements[3];}
if (elementsSize > 4) {build = javaVersionElements[4];}
return "main: " + main + " major: " + major + " minor: " + minor + " update: " + update + " build: " + build;
}
}
我想在 Java 中使用 KeyPairGenerator 创建 public 和私钥,稍后在 Cipher 中使用“RSA/ECB/PKCS1Padding”对我来说很重要。
阅读后this answer我应该使用这个公式:
maximum bytes = key length in bits / 8 - 11
现在:
512 Byte = 4096 bit
1024 Byte = 8192 bit
如果我使用 8192/8-11,它运行良好,但当我使用 4096/8-11 时,出现此错误:“密钥大小无效”。 为什么我不能使用 512Byte?这是 KeyPairGenerator 的限制还是什么?
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(4096/8-11);
这些天我从未听说过限制密钥长度,但你永远不知道。下面是一个示例,它创建了一个 4096 位的 RSA 密钥对,并给出了有关 Java 版本和正在使用的操作系统的一些详细信息。
我正在生成一个 RSAPrivate/PublicKey 而不是 Private/PublicKey KeyPair 来获取位长,但在你的情况下你会生成后者。
这是 运行 在我的 Online-compiler 上运行程序时的结果,运行 这里的示例:https://paiza.io/projects/RGfFI7g3a2WyjjdtU8vsAA:
RSA Key Generation
Java version: main: 13 major: 0 minor: 1+9 update: build:
Operation system: Linux
RSA key generation
PrivateKey: RSA format: PKCS#8 modulus: 4096
PublicKey: RSA format: X.509 modulus: 4096
代码如下:
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
public class Main {
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println("RSA Key Generation");
System.out.println("Java version: " + getJavaVersion());
System.out.println("Operation system: " + System.getProperty("os.name"));
System.out.println("RSA key generation");
KeyPairGenerator rsaGenerator = KeyPairGenerator.getInstance("RSA");
SecureRandom random = new SecureRandom();
rsaGenerator.initialize(4096, random);
KeyPair rsaKeyPair = rsaGenerator.generateKeyPair();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) rsaKeyPair.getPrivate();
RSAPublicKey rsaPublicKey = (RSAPublicKey) rsaKeyPair.getPublic();
System.out.println("PrivateKey: " + rsaPrivateKey.getAlgorithm()
+ " format: " + rsaPrivateKey.getFormat()
+ " modulus: " + rsaPrivateKey.getModulus().bitLength());
System.out.println("PublicKey: " + rsaPublicKey.getAlgorithm()
+ " format: " + rsaPublicKey.getFormat()
+ " modulus: " + rsaPublicKey.getModulus().bitLength());
}
public static String getJavaVersion() {
String[] javaVersionElements = System.getProperty("java.runtime.version").split("\.|_|-b");
String main = "", major = "", minor = "", update = "", build = "";
int elementsSize = javaVersionElements.length;
if (elementsSize > 0) {main = javaVersionElements[0];}
if (elementsSize > 1) {major = javaVersionElements[1];}
if (elementsSize > 2) {minor = javaVersionElements[2];}
if (elementsSize > 3) {update = javaVersionElements[3];}
if (elementsSize > 4) {build = javaVersionElements[4];}
return "main: " + main + " major: " + major + " minor: " + minor + " update: " + update + " build: " + build;
}
}