Android Сохранить частный и открытый ключ RSA

Мне нужно сохранить закрытый и открытый ключи RSA. Вот создаю.

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.genKeyPair();
publicKey = kp.getPublic();
privateKey = kp.getPrivate();

Теперь я хочу использовать оба ключа в следующий раз. Поэтому они должны храниться на устройстве.

        byte[] publicKeyBytes = publicKey.getEncoded();
        byte[] privateKeyBytes = privateKey.getEncoded();

Таким образом, я могу получить массивы байтов, а затем сохранить их в виде текстового файла. Затем в следующий раз, когда я прочитаю его и преобразую обратно в массив байтов.

Теперь мой вопрос: как я могу преобразовать массив байтов обратно в ключ?

Это действительно не работает:

    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKeyBytes);
    publicKey = keyFactory.generatePublic(spec);
    spec = new X509EncodedKeySpec(privateKeyBytes);
    privateKey = keyFactory.generatePrivate(spec);

В LogCat это будет отображаться:

Необходимо использовать RSAPublicKeySpec или PKCS8EncodedKeySpec; был java.security.spec.X509EncodedKeySpec

Любые идеи, что не так с этим кодом?

Спасибо за вашу помощь.


person NewDeveloper    schedule 03.02.2015    source источник


Ответы (2)


Попробуйте использовать PKCS8EncodedKeySpec для закрытого ключа.

RSAPublicKeySpec для открытого ключа вместо X509EncodedKeySpec для обоих.

Также обратите внимание, что сохранение ключей в текстовом файле может быть не самой безопасной идеей. Android предоставляет удобный KeyStore API, который прост в использовании.

person jHilscher    schedule 03.02.2015
comment
Хотя я не проверял это, я считаю, что X509EncodedKeySpec для открытого ключа правильно. - person President James K. Polk; 05.02.2015
comment
Спасибо jHilscher, не работает! - И да, GregS, теперь я использую X509EncodedKeySpec для открытого ключа и PKCS8EncodedKeySpec для закрытого ключа. - person NewDeveloper; 06.02.2015
comment
Привет. Можете ли вы предоставить код для инициализации для RSAPublicKeySpec. Проблемы с поиском в сети - person CodeSlayer; 05.03.2018

Вы пытаетесь закодировать ключи в Base64 и сохранить как строку, когда вам нужно получить только декодированные ключи из массивов Base64 в Byte.

person f3rn4nd000    schedule 03.02.2015