Я искал около недели + для реализации метода, который я имею в виду. Я натолкнулся (и прочитал) много статей по всем этим различным методам, но я все еще оставлен в замешательстве, поэтому я надеялся, что кто-то сможет распространять свои знания по этим темам, чтобы я мог более легко начать создавать мой популярный метод и реализуя его в Android.
Мой метод поиска:
- Должен генерировать общедоступные и приватные ключи RSA
- Публика должна иметь дополнение PKCS # 1
- Должно быть RSA 2048
- Возвращает открытый ключ в массиве байтов
Очевидно, вы можете использовать четыре способа:
- Стандартная Java
- Bouncy Castle
- Spongy Castle (Android Friendly?)
- JSch
Поскольку я очень новичок в сфере безопасности и Java в целом, мне было интересно, может ли кто-нибудь наконец дать хорошее четкое объяснение всего этого.
Ниже приведены способы, с помощью которых я попытался реализовать мой метод поиска (упомянутый выше) в четырех различных методах программирования. Если я чего-то не знаю, потому что я не могу разобраться в соответствующей документации. Пожалуйста, не стесняйтесь исправлять меня.
1. Стандартная Java (не уверен, что PKCS # 1):
public byte[] returnPublicKeyInBytes() throws NoSuchAlgorithmException {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair keyPair = kpg.genKeyPair();
byte[] pri = keyPair.getPrivate().getEncoded();
byte[] pub = keyPair.getPublic().getEncoded();
return pub;
}
2. Bouncy Castle (еще не функционирует =/Идеи?):
public byte[] returnPublicKeyInBytes() throws NoSuchAlgorithmException {
RSAKeyPairGenerator r = new RSAKeyPairGenerator();
r.init(new KeyGenerationParameters(new SecureRandom(),4096));
AsymmetricCipherKeyPair keys = r.generateKeyPair();
CipherParameters pri = keys.getPrivate();
CipherParameters pub = keys.getPublic();
byte[] pubbyte = pub.toString().getBytes();
return pubbyte; //NOT WORKING
}
3. SpongyCastle (Havn't начал/То же, что и Bouncy Castle?):
4. JSch (очень не работает/не работает)
public byte[] returnPublicKeyInBytes(JSch jSch) {
try {
KeyPair keyPair = KeyPair.genKeyPair(jSch, KeyPair.RSA);
ByteArrayOutputStream bs = new ByteArrayOutputStream();
keyPair.writePrivateKey(bs);
jSch.addIdentity("Generated", bs.toByteArray(), keyPair.getPublicKeyBlob(), null);
return keyPair.getPublicKeyBlob();
} catch (JSchException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
Мне бы хотелось, чтобы это действительно стало ресурсом для всех, у кого возникли проблемы с генерацией ключей RSA в Android (например, я и многие другие).
Я чувствую, что у Bouncy Castle очень мало информации об этом API, что делает его чрезвычайно трудным для начинающего (как я), чтобы понять его. Из моих исследований люди используют Bouncy Castle в Java вместо встроенного поставщика безопасности, потому что Bouncy Castle гораздо более надежный. Использование Bouncy Castle в Android не желательно, потому что оно "поставляется с поврежденной версией Bouncy Castle", которое может быть подвержено ошибкам. Spongy Castle - это просто переупаковка замка Bouncy.
С этой целью я задам свой последний вопрос о том, какой метод следует использовать для Android?
Update
Надеюсь, кто-то сможет ответить на это позже. Что касается того, что я сделал для решения моей проблемы, было просто использовать NDK.