2010-06-02 129 views
10

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

阅读夫妇如何做RSA加密的Java(的谷歌搜索)的文章后,发现下面的代码片段

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一起使用。

+0

我们如何知道base64编码字符串中包含的内容?它可能是一个模数和一个公开的指数,但是什么形式? *可能是* X509EncodedKeySpec的DER编码。 – 2010-06-02 20:22:21

回答

8

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

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

UPDATE 2017年3月8日: 更好的后期高于从未消息,爪哇8现在包括一个Base64编码/解码类,java.util.Base64

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(); 
    } 
}