使用65537以外的公共指数生成RSA密钥(十六进制为0x10001)

时间:2014-08-09 08:34:22

标签: key rsa javacard exponent

我正在为2048位RSA实现一个Java卡小程序。我想知道如何用除65537之外的公共指数(e)创建RSA密钥对。

该卡生成RSA密钥对,并返回其公共指数(e)和模数(n)。但每次公共指数为65537(十六进制为0x10001)。我的代码如下

// Initialize objects for RSA Keys and Pair
objRSAPriKey = (RSAPrivateCrtKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_CRT_PRIVATE, KeyBuilder.LENGTH_RSA_2048, false);
objRSAPubKey = (RSAPublicKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC,  KeyBuilder.LENGTH_RSA_2048, false);
objRSAKeyPair= new KeyPair(KeyPair.ALG_RSA_CRT, KeyBuilder.LENGTH_RSA_2048);

    ...

// Generate Key Pairs    
objRSAKeyPair.genKeyPair();

objRSAPriKey = (RSAPrivateCrtKey)objRSAKeyPair.getPrivate();
objRSAPubKey = (RSAPublicKey)objRSAKeyPair.getPublic();

GetResLen = objRSAPubKey.getModulus(Rb_GetRes, BAS);
GetResLen += objRSAPubKey.getExponent(Rb_GetRes, GetResLen);

当然,我知道这些键是不同的,因为每次applet生成密钥时,key(n,d,p,q)的其他值都不同。但我想知道如何使用2048位大小的公共指数生成RSA密钥对

感谢。

1 个答案:

答案 0 :(得分:2)

通常,密钥对生成仅限于平台实现的Java Card上的某些值。对于公钥指数来说肯定是这种情况。

目前,您正在构建公钥和私钥对,只是用genKeyPair生成的对象覆盖对它们的引用。相反,你可以像这样构建密钥对:

objRSAPriKey = (RSAPrivateCrtKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_CRT_PRIVATE, KeyBuilder.LENGTH_RSA_2048, false);
objRSAPubKey = (RSAPublicKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC,  KeyBuilder.LENGTH_RSA_2048, false);
objRSAPubKey.setExponent(myLargeExponent, 0, (short) myLargeExponent.length);
objRSAKeyPair= new KeyPair(objRSAPubKey, objRSAPriKey);
objRSAKeyPair.genKeyPair();

如果平台支持>,这将生成具有任何值的静态指数的公钥。如果不支持,请尝试使用RSAPrivateKey,而不是使用CRT参数的randomExponentRSAKeyPair = new KeyPair(KeyPair.ALG_RSA, KeyBuilder.LENGTH_RSA_2048); randomExponentRSAKeyPair.genKeyPair(); byte[] myLargeExponent = new byte[KeyBuilder.LENGTH_RSA_2048 / 8]; RSAPrivateKey tmpKey = (RSAPrivateKey)randomRSAKeyPair.getPrivate(); key.getExponent(myLargeExponent, (short) 0); 。现在,如果你想要一个随机的公共指数,你可以使用一个技巧:

{{1}}

如果此代码运行,您创建了一个非常慢的公钥,与其他公钥相比,没有优势应该不能用来代替私钥

注意:上面的Java Card代码不符合Java Card最佳实践,仅演示代码