Java RSA中的字符串密钥

7

我在我的应用程序中使用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;
}

你有任何想法吗?非常感谢。


请,千万不要在您的数据库中存储未加密的私钥。如果您必须存储私钥,则应该将其称为托管,并且应该使用仅由您的应用程序知道的对称密钥加密它们。 - KyleM
谢谢,是的我在考虑这个问题。你能给我一个建议吗?存储应用程序密钥的最佳方法是什么?谢谢。 - rgreso
使用密码保护的Java密钥库。查找Java keytool... - KyleM
@KyleM 感谢您的回答,我会尝试它。 - rgreso
2个回答

13

将publicK(String)转换为公钥,请按以下步骤执行:

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

要将 privateK(String) 转换为私钥,请按以下步骤操作:

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

谢谢回答。Eclipse显示了一个错误:The method decodeBase64(byte [])is undefined for the type Base64.你能帮帮我吗?非常感谢。 - rgreso
谢谢你的回答,但仍然出现错误,这一次它想要另一个参数:类型Base64中的decode(byte[], int)方法不适用于参数(byte[])。你有什么想法吗?非常感谢你的时间。 - rgreso
你可以使用Apache Commons Codec项目中的Base64.encodeBase64String(byte[])。 - txedo
我正在尝试做同样的事情,但是PrivateKey priv = fact.generatePrivate(keySpec);会抛出InvalidDeySpecException异常,说我必须使用RSAPublicKeySpec,但它不会接受byte[]作为参数。 - Dean Blakely
尝试将以下代码: byte[] keyBytes = Base64.decode(privateK.getBytes("utf-8")); 替换为: byte[] keyBytes = Base64.decode(privateK, Base64.DEFAULT); - Danylo.Vus

0

我只能假设这行代码:

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(clear);

"clear" 的意思应该是 "keyBytes"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接