java 创建唯一的RSA密钥对(多对)

arknldoa  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(269)

我在我的代码中做RSA密钥对生成。我也能够使用此代码进行加密和解密。我需要的是每个用户的唯一密钥对。在我的应用程序中将有多个用户。我想将这些密钥对分配给不同的用户,以便他们可以通过我的应用程序使用它进行加密和解密。
目前我正在使用下面的代码来生成我的RSA公钥和私钥对。

RSAKeyPairGenerator adam = new RSAKeyPairGenerator();

try {

        String path = "C:\\Users\\Dream\\Documents\\NetBeansProjects\\ABEPHR\\web\\KeyFiles";

        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");

        keyGen.initialize(1024);
        KeyPair generatedKeyPair = keyGen.genKeyPair();

        PublicKey pub = generatedKeyPair.getPublic();
        System.out.println("Public Key: " + getHexString(pub.getEncoded()));

        PrivateKey priv = generatedKeyPair.getPrivate();
        System.out.println("Private Key: " + getHexString(priv.getEncoded()));

    } catch (Exception e) {
        e.printStackTrace();
        return;
    }

这段代码只能给予我一对RSA密钥。我如何才能得到多对密钥?

**++注意:**很多人建议我在这里添加循环。为了清楚起见,我不能在我的代码中添加循环,因为这些代码将在服务器上为每个用户运行(在JSP中)。

让我用一个例子来解释:假设我有3个用户用户A、B和C。现在验证凭据后,每当用户A来到此页面时(包含上述代码的页面),此页面应生成用户A的唯一密钥对。以后用户A可以存储此密钥以供将来使用。现在当用户B使用其凭据登录时,比他也土地在同一页与上述代码.但上述代码并没有给予我不同的公钥和私钥对.所以在这里我得到相同的RSA密钥对,因为它是在那里的情况下,用户A.同样的情况也发生在用户C身上。
希望这清楚了我的问题。正如下面所建议的,我也尝试在循环中执行上面的代码。在每次迭代中,代码都给我相同的密钥对。我还尝试用第一次迭代中生成的公钥加密msg,并尝试用第二次迭代中生成的私钥解密它。msg成功解密。
我想知道,在尝试获得唯一的RSA密钥对时,我是否遗漏了一些东西?

goqiplq2

goqiplq21#

这里有一个简单的测试,在我的系统上运行良好。尝试一下,并在你的问题中发布你的结果。

import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;

final class UniqueKey
{

  public static void main(String... argv)
    throws Exception
  {
    SecureRandom gen = new SecureRandom();
    System.out.println(gen.getProvider());
    System.out.println(gen.getAlgorithm());
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
    keyGen.initialize(2048);
    System.out.println(keyGen.getProvider().getName());
    for (String user : new String[]{"A", "B"}) {
      KeyPair pair = keyGen.genKeyPair();
      String pub = getHexString(pair.getPublic().getEncoded());
      System.out.printf("Public Key of %s: %s%n", user, pub);
    }
  }

  private static String getHexString(byte[] arr)
  {
    return new BigInteger(arr).toString(16).toUpperCase();
  }

}

我的试验结果:

SUN version 1.8
NativePRNG
SunRsaSign
Public Key of A: 30820122300D06092A864886F70D01010105000382010F003082010A02820101009EEE0526A9EBA8E2CCA4CE7FFAB78257F8275EB36DCBFADB9488939455BD4303804DEBFB2D544983CE8D12511042A20370CAE3E440EAA8873448DB68A4ACDD2C63D309B9550A2B3A2D2AF94E9F879F1DE120FFA061534EA6F5D72A32F064739562E9A6032DC0598A6750AF4CF1CDC0A214A4F9E514171DC847CBA2CDA3F95046EA74F67039806994789D8F0B2BE8539F597F97321C5387F5B51FFB5D5CE1271F216C790AC1D6885A8DE043BEAFD123CFD77B560F8B1FCFA4EF542C3205233A4FFFF151950E1278FC6C7CEA0C66992A58A0823CF5209AFEDEAAA201CB40977019F2988AFFDA4DA6B0E7933A9E5A3087C1CEF3D0BAD95FC776B974D6EC25B2E6EB0203010001
Public Key of B: 30820122300D06092A864886F70D01010105000382010F003082010A028201010096BE6F281FD41D0F282F3162ECC0225D973630D2582004D8C1A80BB97C7F959372892C653D7FD29AC1D25EA563139F49073E32182CA8CDF429FBEF67423A701B6C6A9B0A3C9F95CBF6D09F7E54D0F6C3E239BC40AFF877687FCF0B0E88B69A4693E3BC28BED6FEBED0C6CEAE744D712EC24E3809830687D982689F729A3B9AB711945BEBCB55BA780849071F6D0ED26563E5D26BCF6C72327DB2F41459E8879631722DEA0652B8AD4D7FA32F2A981D6B24D6EF7F8C72F784C5894A5B39092489380EF9A12734E30BE2B1A6FE0652CF43B33574650F66C27F49031DDC2FC3D6E8A54C1C6811710FEDFAC41DF69D3D7DE82E7C7409C85DF6836DFB87B6289406670203010001
jhiyze9q

jhiyze9q2#

generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048, new SecureRandom());
Keypair kp1 = generator.generateKeyPair(); // key pair 1
Keypair kp2 = generator.generateKeyPair(); // another key pair

这样生成的密钥对将是唯一的。记住不要初始化两次,只需要多次生成密钥对。

相关问题