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

时间:2015-02-10 19:22:18

标签: java encryption rsa

我正在代码中生成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密钥。我如何获得多对?

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

让我通过一个例子来解释: 假设我有3个用户用户A,B和C.现在,在验证凭据后,每当用户A访问此页面(包含上述代码的页面)时,此页面应为用户A生成唯一密钥对。以后用户A可以存储此密钥供将来使用。 现在,当用户B使用他的凭据登录时,他也会使用上面的代码登陆同一页面。但是上面的代码没有给我不同的公钥和私钥对。所以在这里我获得了与用户A相同的RSA密钥对。 用户C也发生了同样的情况。

希望现在清楚我的问题。如下所示,我也尝试在循环中执行上面的代码。在每次迭代中,Code都给了我相同的密钥对。我还尝试使用在第一次迭代中生成的公钥来加密msg,并尝试使用在第二次迭代中生成的私钥对其进行解密。 msg已成功解密。

我想知道,为了获得独特的RSA密钥对,我是否遗漏了一些东西?

1 个答案:

答案 0 :(得分:0)

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

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