我目前正在尝试编写一个将利用诸如RSA或ElGamal之类的公钥密码系统的程序。我一直在寻找不同的来源,最接近的是公共密钥加密的Bouncy Castle FIPS documentation,其中RSA的示例代码有些简单:

public byte[] pkcs1Encrypt(RSAPublicKey pubKey, byte[] data) {
   Cipher c = Cipher.getInstance(“RSA/NONE/PKCS1Padding”, “BCFIPS”);
   c.init(Cipher.ENCRYPT_MODE, pubKey);
   return c.doFinal(data);
}

我经常使用对称密钥密码系统,例如AES和Triple-DES(DESede),但是我查看了Bouncy Castle文档,发现RSAPublicKey不是SecretKey类的子接口/类。

有没有什么方法可以生成这个RSAPublicKey对象,或者有没有更有效的方法用Bouncy Castle或JCE来实现这种加密?

最佳答案

充气城堡文件不清晰。 cipher.init(Cipher.ENCRYPT_MODE, pubKey);需要java.security.interfaces.RSAPublicKey实例,而不是org.bouncycastle.asn1.pkcs.RSAPublicKey

您可以从DER编码数据中使用模数和指数构建RSAPublicKey,也可以生成新的密钥对

//RSA public key from DER encoded data
byte publicKeyData[] = ...;
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyData);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey publicKey = kf.generatePublic(keySpec );

//RSA from modulus and exponent
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey publicKey = kf.generatePublic(keySpec);

//Generate a key pair using a secure random algorithm
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(2048, random);
KeyPair pair = keyGen.generateKeyPair();
PrivateKey privateKey = pair.getPrivate();
PublicKey publicKey = pair.getPublic();
byte publicKeyData[] = publicKey.getEncoded();

07-27 17:28