2010-06-02 2 views
10

Как сделать RSA-шифрование байтового массива с открытым ключом с ключом-64?RSA encrypt с открытым ключом, закодированным base64, в Android

После прочтения нескольких статей (поиск Google) о том, как сделать шифрование 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? Это, вероятно, модуль и общественный показатель, но какая форма? * Вероятно * кодирование DER для X509EncodedKeySpec. –

ответ

8

Ваша строка base64, возможно, X509EncodedKeySpec. Я могу только догадываться. Если это так, вы должны base64 декодировать строку, чтобы получить byte []. Затем постройте X509EncodedKeySpec из этого byte []. Затем создайте экземпляр RSA KeyFactory и используйте метод generatePublic() этого KeyFactory для получения PublicKey. Затем этот открытый ключ можно передать в Cipher.init().

Примечание: для выполнения декодирования base64 используйте либо apache commons codec, либо the Harder base64 decoder.

UPDATE 8 марта 2017: В лучше поздно, чем никогда новости, Java 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(); 
    } 
} 
Смежные вопросы