RSA使用Android中的base64编码公钥进行加密

时间:2010-06-02 10:08:00

标签: java android rsa

如何使用base-64编码的公钥对字节数组进行RSA加密?

在阅读了几篇关于如何在Java中进行RSA加密的文章(谷歌搜索)之后,找到了以下代码段

public byte[] rsaEncrypt(byte[] data) {
  PublicKey pubKey = readKeyFromFile("/public.key");
  Cipher cipher = Cipher.getInstance("RSA");
  cipher.init(Cipher.ENCRYPT_MODE, pubKey);
  byte[] cipherData = cipher.doFinal(src);
  return cipherData;
}

我将公钥作为base64编码的字符串(126个字符),如何使用编码字符串创建“PublicKey”并将其与Cipher一起使用。

2 个答案:

答案 0 :(得分:8)

您的base64字符串可能是X509EncodedKeySpec。我只能猜测。如果是这样,您应该对字符串进行base64解码以获得byte []。然后从此X509EncodedKeySpec构建byte []。然后创建RSA KeyFactory的实例,并使用此KeyFactory的generatePublic()方法获取PublicKey。然后可以将此公钥传递给Cipher.init()

注意:要执行base64解码,请使用apache commons codecthe Harder base64 decoder

2017年3月8日更新: 在优于迟到的新闻中,Java 8现在包括Base64编码/解码类java.util.Base64

答案 1 :(得分:4)

这是您生成公钥和私钥对的方法 下面是将它们存储在硬盘中的功能

enter code here
public static void GenerateKeyPair()
{       
    try{
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(2048);
        KeyPair kp = kpg.genKeyPair();

        KeyFactory fact = KeyFactory.getInstance("RSA");
        RSAPublicKeySpec pub = fact.getKeySpec(kp.getPublic(),
          RSAPublicKeySpec.class);
        RSAPrivateKeySpec priv = fact.getKeySpec(kp.getPrivate(),
          RSAPrivateKeySpec.class);

        saveToFile("public.key", pub.getModulus(),
                  pub.getPublicExponent());
        saveToFile("private.key", priv.getModulus(),
                  priv.getPrivateExponent());
    }catch(Exception e){
        System.out.println(e.getMessage());
    }
}

public static void saveToFile(String fileName,
  BigInteger mod, BigInteger exp) throws Exception {
  ObjectOutputStream oout = new ObjectOutputStream(
    new BufferedOutputStream(new FileOutputStream(fileName)));
  try {
    oout.writeObject(mod);
    oout.writeObject(exp);
  } catch (Exception e) {
    throw new Exception("error", e);
  } finally {
    oout.close();
  }
}