我正在为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密钥对
感谢。
答案 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最佳实践,仅演示代码 。