Зашифруйте в java с помощью открытого ключа c и расшифруйте в C# с помощью закрытого ключа RSA - PullRequest
0 голосов
/ 07 января 2020

У меня есть ключ publi c, который был сгенерирован в C# в конце.

Я хочу зашифровать сообщение в Android / Java, но когда я шифрую сообщение зашифрованное сообщение не такое, как в C#.

Я попытался зашифровать с помощью этой спецификации для алгоритма RSA:

‫‪KeyExchangeAlgorithm‬‬ ==> ‫‪RSA-PKCS1-KeyEx‬‬
‫‪KeySize‬‬ ==>2048 
‫‪RSAEncryptionPadding‬‬ ==> ‫‪false‬‬

Это спецификация, которую сервер ожидает меня; ниже мой алгоритм реализации на Android.

String encoded = "";

byte[] encrypted = null;
try {

    byte[] publicBytes = Base64.decode(PUBLIC_KEY,Base64.DEFAULT);
    byte[] exponent = Base64.decode("AQAB",Base64.DEFAULT);
    BigInteger key = new BigInteger(1,publicBytes);
    BigInteger expo = new BigInteger(1,exponent);
    RSAPublicKeySpec keySpec = new RSAPublicKeySpec(key,expo);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PublicKey pubKey = keyFactory.generatePublic(keySpec);

    Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");

    //Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    encrypted = cipher.doFinal(txt.getBytes());
    encoded = Base64.encodeToString(encrypted, Base64.DEFAULT);
}
catch (Exception e) {
    e.printStackTrace();
    Log.e("3771",""+e.getMessage());
}
return encoded;

1 Ответ

1 голос
/ 09 января 2020

RSA использует случайное заполнение, поэтому сигнатура должна быть разной каждый раз. Используйте заполнение PKCS # 1 v1.5 ("PKCS1Padding" по историческим причинам), и проверка выполняется, а не шифрование того же сообщения снова.

...