RSA с использованием SpongyCastle

1

Мои знания шифрования очень просты, поэтому извиняюсь за любое незнание с моей стороны.

В приложении Android я сейчас пытаюсь воспроизвести выполнение этой команды с помощью библиотеки SpongyCastle и стандартных java.security libs:

echo 'test' | openssl rsautl -encrypt -pubin -inkey test.pub | base64 > encrypted_file

Следует отметить, что чтение/запись в и из файлов в команде не будет реализовано, и у меня есть открытый ключ (т.е. test.pub) как строка с кодировкой Base64 base64key в моем коде.

Я попытался выполнить следующее, но уверен, что он не работает:

static {
       Security.insertProviderAt(new BouncyCastleProvider(), 1);
      }

//...more code here

byte[] pka = Base64.decode(base64key);

X509EncodedKeySpec x = new X509EncodedKeySpec(pka);
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(x);

byte[] testToByte = "test".getBytes("UTF8"); 

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
keyGen.initialize(2048); 

Cipher cipher = Cipher.getInstance("RSA"); 
cipher.init(Cipher.ENCRYPT_MODE, publicKey); 

byte[] cipherText = cipher.doFinal(testToByte); 

String encrypted = Base64.encode((new String(cipherText, "UTF8").toString().getBytes()))

Я знаю, что это далеко, но я не уверен, куда обратиться. Любая помощь будет оценена по достоинству.

Теги:
encryption
spongycastle

1 ответ

1
Лучший ответ

В конечном итоге это было решено с помощью следующих методов:

private void stripHeaders(){

    public_key = public_key.replace("-----BEGIN PUBLIC KEY-----", "");
    public_key = public_key.replace("-----END PUBLIC KEY-----", "");

}

public byte[] encryptWithPublicKey(String encrypt) throws Exception {
    byte[] message = encrypt.getBytes("UTF-8");
    stripHeaders(); 
    PublicKey apiPublicKey= getRSAPublicKeyFromString(); 
    Cipher rsaCipher = Cipher.getInstance("RSA/None/PKCS1Padding", "SC");
    rsaCipher.init(Cipher.ENCRYPT_MODE, apiPublicKey); 
    return rsaCipher.doFinal(message);
}

private PublicKey getRSAPublicKeyFromString() throws Exception{
    KeyFactory keyFactory = KeyFactory.getInstance("RSA", "SC"); 
    byte[] publicKeyBytes = Base64.decode(public_key.getBytes("UTF-8"), Base64.DEFAULT); 
    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyBytes); 
    return keyFactory.generatePublic(x509KeySpec);
}
  • 0
    Режим цепочки является важной проблемой для симметричных шифров (за исключением редких случаев, когда данные всегда короткие и случайные). RSA является асимметричным шифром (и сигнатурой) с довольно большим блоком (например, около 230 байтов для 2048-битного ключа) и почти никогда не используется с данными, размер которых превышает один блок. Интерфейс Java JCA использует стандартный формат шифра / режима / заполнения, но для режима RSA не имеет смысла. Padding, однако; использование RSA // NoPadding, вероятно, небезопасно, если вы не будете очень осторожны с данными.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню