gpt4 book ai didi

java - Java中使用模数和指数的RSA加密

转载 作者:行者123 更新时间:2023-12-01 17:27:02 25 4
gpt4 key购买 nike

我目前正在 Java 上进行 RSA 加密,并且必须使用私有(private)和公共(public)模数进行加密。我目前有以下内容:

private void createPublicKey() throws NoSuchAlgorithmException, InvalidKeySpecException {
String publicModulus = "d2c34017ef94f8ab6696dae66e3c0d1ad186bbd9ce4461b68d7cd017c15bda174045bfef36fbf048" +
"73cfd6d09e3806af3949f99c3e09d6d3c37f6398d8c63f9a3e39b78a187809822e8bcf912f4c44a8" +
"92fe6a65a477ddea9582738317317286a2610ba30b6b090c3b8c61ffb64207229b3f01afe928a960" +
"c5a44c24b26f5f91";

BigInteger keyInt = new BigInteger(publicModulus, 16);
BigInteger exponentInt = new BigInteger("10001", 16);
RSAPublicKeySpec keySpeck = new RSAPublicKeySpec(keyInt, exponentInt);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
publicKey = keyFactory.generatePublic(keySpeck);

}

private void createPrivateKey() throws NoSuchAlgorithmException, InvalidKeySpecException {
String privateModulus = "6c97ab6369cf00dd174bacd7c37e6f661d04e5af10670d4d88d30148ec188e63227b8dac0c517cf9" +
"67aa73cd23684c9165dc269f091bfab33b6c5c7db95b54130e348255c30aaaac1c7f09ef701e0d6f" +
"6dc142d2e4ed78466cc104e28d50be7adf3863afc021dbdd8b5f0b968b7cd965242c7d8d4b32ee84" +
"0fac3cad134344c1";
BigInteger privateModulusInt = new BigInteger(privateModulus, 16);
BigInteger exponentInt = new BigInteger("10001", 16);
RSAPrivateKeySpec privateKeySpec = new RSAPrivateKeySpec(privateModulusInt, exponentInt);
KeyFactory factory = KeyFactory.getInstance("RSA");
privateKey = factory.generatePrivate(privateKeySpec);
}

在主要方法中我有以下内容:

        createPrivateKey();
createPublicKey();

String data = "12";

Cipher cipher1 = Cipher.getInstance("RSA/ECB/NoPadding");
cipher1.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedData = cipher1.doFinal(data.getBytes());

Cipher cipher2 = Cipher.getInstance("RSA/ECB/NoPadding");
cipher2.init(Cipher.DECRYPT_MODE,privateKey);
byte[] decryptedData = cipher2.doFinal(encryptedData);
System.out.println(new String(decryptedData));

在控制台中,我得到以下信息:���.7���p;%kV�9y���xa�ɼ{ 而不是 "12" 如果我制作 String data = "12345";,然后我得到:javax.crypto.BadPaddingException:消息大于模数

首先为什么加密和解密不起作用?为什么我没有返回“12”。其次,为什么我的数据不能大于2个字符?

请注意,我正在使用以下 website获取模数和指数值。

最佳答案

创建私钥时出错。您提供的是公共(public)指数而不是私有(private)指数(如 @dave_thomsom_085 评论)私有(private)指数而不是模数

更改createPrivateKey()

private static PrivateKey createPrivateKey() throws NoSuchAlgorithmException, InvalidKeySpecException {
String publicModulus = "d2c34017ef94f8ab6696dae66e3c0d1ad186bbd9ce4461b68d7cd017c15bda174045bfef36fbf048" +
"73cfd6d09e3806af3949f99c3e09d6d3c37f6398d8c63f9a3e39b78a187809822e8bcf912f4c44a8" +
"92fe6a65a477ddea9582738317317286a2610ba30b6b090c3b8c61ffb64207229b3f01afe928a960" +
"c5a44c24b26f5f91";
String privateExponent = "6c97ab6369cf00dd174bacd7c37e6f661d04e5af10670d4d88d30148ec188e63227b8dac0c517cf9" +
"67aa73cd23684c9165dc269f091bfab33b6c5c7db95b54130e348255c30aaaac1c7f09ef701e0d6f" +
"6dc142d2e4ed78466cc104e28d50be7adf3863afc021dbdd8b5f0b968b7cd965242c7d8d4b32ee84" +
"0fac3cad134344c1";
BigInteger privateExponenInt = new BigInteger(privateExponent, 16);
BigInteger keyInt = new BigInteger(publicModulus, 16);
RSAPrivateKeySpec privateKeySpec = new RSAPrivateKeySpec(keyInt, privateExponenInt);
KeyFactory factory = KeyFactory.getInstance("RSA");
return factory.generatePrivate(privateKeySpec);
}

此外,出于安全原因,您不应使用未经填充的原始 RSA。使用RSA/ECB/PKCS1Padding或新的 OAEP 填充 RSA/ECB/OAEPWithSHA1AndMGF1Padding

根据this answer您可以使用 PKCS1Padding 进行加密数据最多比 key 大小少 11 个字节。 and using OAEP它必须小于 key 模数的大小 – 41

然后,使用您的 1024 位 key :

  • PKCS1:(1024 bits / 8) - 11 = 117 bytes
  • OAEP:(1024 bits / 8) - 42 = 86 bytes

还建议直接使用CRT而不是私有(private)指数

RSAPrivateCrtKeySpec privateKeySpec = 
new RSAPrivateCrtKeySpec(modulus, publicExponent, privateExponent, primeP, primeQ, primeExpP, primeExpQ, crtCoefficient);

关于java - Java中使用模数和指数的RSA加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41584629/

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