2014-04-06 78 views
5

我在我的应用程序中使用RSA加密技术。要存储生成的公钥,我将其转换为字符串,然后将其保存在数据库中。Java中的字符串的密钥RSA

Key publicKey=null; 
    Key privateKey=null; 

    KeyPair keyPair=RsaCrypto.getKeyPairRSA(1024); 
    publicKey=keyPair.getPublic(); 
    privateKey=keyPair.getPrivate(); 



    String publicK=Base64.encodeToString(publicKey.getEncoded(), Base64.DEFAULT); 
    String privateK=Base64.encodeToString(privateKey.getEncoded(), Base64.DEFAULT); 

我保存字符串publicKprivateK。 我的问题是,当我想用​​RSA加密/解密文本并使用我保存的字符串格式的密钥时,我不知道如何将其转换为Key

public static String encrypt(Key publicKey, String inputText){ 
    byte[]encodedBytes=null; 
    String encryptedText=""; 
    try { 
     Cipher cipher=Cipher.getInstance("RSA"); 
     cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
     encodedBytes=cipher.doFinal(inputText.getBytes()); 
    } catch (Exception e) {Log.e("Error", "RSA encryption error"); } 

    encryptedText=Base64.encodeToString(encodedBytes, Base64.DEFAULT); 
    return encryptedText; 
} 

你有什么想法吗? 非常感谢

+0

请,请,请不要将未加密的私钥存储在数据库中。如果您必须存储称为托管的私钥,并且您应该使用只有您的应用程序已知的对称密钥对它们进行加密。 – KyleM

+0

谢谢,是的,我正在考虑这个问题。您能否给我一个建议,在应用程序中存储密钥的最佳方式是什么?谢谢 – rgreso

+0

使用受密码保护的Java密钥库。查找Java keytool ... – KyleM

回答

7

要publicK(字符串)转换为公共密钥做如下:

byte[] keyBytes = Base64.decode(publicK.getBytes("utf-8")); 
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
PublicKey key = keyFactory.generatePublic(spec); 

要转换privateK(字符串)私钥做如下:

byte[] keyBytes = Base64.decode(privateK.getBytes("utf-8")); 
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); 
KeyFactory fact = KeyFactory.getInstance("RSA"); 
PrivateKey priv = fact.generatePrivate(keySpec); 
+0

谢谢你的回答。 Eclipse向我展示了一个错误:对于Base64类型,方法decodeBase64(byte [])未定义。你可以帮我吗?非常感谢 – rgreso

+0

@rgreso试试这段代码。 – Rahil2952

+0

感谢您的回答,但它仍然显示错误,这次它需要另一个参数:类型Base64中的方法decode(byte [],int)不适用于参数(byte [])。你有什么主意吗?非常感谢您的时间 – rgreso

1

未能进行能够对之前的帖子发表评论。我想知道什么

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(clear); 
0

是“明确的”我只能假设行:

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(clear); 

与“清晰”的意思是“keyBytes”