Внедрение алгоритмов шифрования замковых замков с Android

Как я могу использовать провайдера Bouncy Castle для реализации таких алгоритмов, как Serpent и Twofish, потому что поставщики Sun не реализуют их вообще. Я знаю, что, когда несколько провайдеров могут реализовать один и тот же алгоритм, вы получаете форму внедрения самого высокого провайдера, который будет поставщиком Sun. Если по какой-то причине вы хотите использовать реализацию от определенного провайдера (возможно, потому, что вы знаете, что это быстрее), вы можете указать поставщика в двух-arg-версии getInstance (). В моем случае поставщик Sun не реализует алгоритмы, которые меня интересуют вообще.

Я попытался реализовать Змей:

public static final String FILE_EXTENSION = ".serpent"; public static final String PROVIDER = "BC"; // Bouncy Castle public static final String BLOCK_CIPHER = "Serpent"; public static final String TRANSFORMATION = "Serpent/CBC/PKCS7Padding"; public static final String KEY_ALGORITHM = "PBKDF2WithHmacSHA1"; public static final String PRNG_ALGORITHM = "SHA1PRNG"; public static final int BLOCK_SIZE = 128; // bits public static final int KEY_SIZE = 256; // bits public static final int ITERATION_COUNT = 1024; // for PBE /** Performs the encryption of a file. */ public void encrypt(String pathname, char[] password, byte[] salt) { // Use bouncy castle as our provider Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); // Convert the file into a byte array byte[] plaintext = fileToBytes(new File(pathname)); // Generate a 256-bit key SecretKey key = generateSecretKey(password,salt); // Generate a 128-bit secure random IV byte[] iv = generateIV(); // Setup the cipher and perform the encryption Cipher cipher = null; byte[] ciphertext = null; try { cipher = Cipher.getInstance(TRANSFORMATION, PROVIDER); cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv)); ciphertext = cipher.doFinal(plaintext); } catch (Exception e) { e.printStackTrace(); } // Append the IV to the ciphertext byte[] temp = new byte[iv.length+ciphertext.length]; System.arraycopy(iv, 0, temp, 0, iv.length); System.arraycopy(ciphertext, 0, temp, iv.length, ciphertext.length); ciphertext = temp; // Store the encrypted file in the same directory we found it if (Environment.getExternalStorageDirectory().canWrite()) { bytesToFile(ciphertext, pathname+FILE_EXTENSION); File file = new File(pathname); file.delete(); } } 

Однако это порождает

Java.security.NoSuchAlgorithmException: Serpent / CBC / PKCS7Padding

На линии, где я звоню

Cipher = Cipher.getInstance (TRANSFORMATION, PROVIDER);

Бег

 $ adb shell # logcat 

Я получаю тонны

 not resolving ambiguous class not verifying multiple definitions 

Ошибки выводятся. Любая идея, что может быть причиной этого, и как я могу решить проблему?

Вы, вероятно, хотите Spongy Castle – переупаковку, которую я сделал из Bouncy Castle специально для Android.

Spongy Castle является полной заменой искалеченных версий криптографических библиотек Bouncy Castle, которые поставляются с Android. Есть несколько небольших изменений, чтобы заставить его работать на Android:

  • Все имена пакетов были перемещены из org.bouncycastle. * В org.spongycastle. * – поэтому конфликтующие классы не конфликтуют
  • Имя поставщика API безопасности Java теперь SC, а не BC

«Спанговый замок спас мою задницу». – обратная связь от одного счастливого пользователя 🙂

Что делает javap org.bouncycastle.jce.provider.symmetric.Serpent yield? Если он не дает класс, который будет найден, то это указывает на то, что в пакете с надуманным замком что-то отсутствует, или вы можете использовать неправильный класс.

Если вы используете 1.4 VM, тогда файл jar должен быть установлен в $ JAVA_HOME / jre / lib / ext, так как иначе он не будет работать корректно. IIRC.

Проверьте вывод zipinfo bcprov-jdk16-146.jar | Grep '/ симметричный /' для класса Serpent. Опять же, это перекрестная проверка правильной установки пакета и наличие симметричного алгоритма Serpent.

Я сделал простой тест, используя совершенно аналогичный код для вашего собственного, и он не генерировал исключение.

Хорошо, провайдер присутствует в системе, но происходит то, что внутренняя реализация bouncy castle загружается до того, с которым вы связались. Внутренняя реализация не содержит кода Serpent / CBC / PKCS7Padding, и даже если вы Добавьте поставщика bouncycastle, он не заменит те, которые уже зарегистрированы.

Внутренний провайдер только реализует несколько шифров, а именно: AES, ARC4, Blowfish и DESede

Для этого я использовал следующую активность заглушки:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); Cipher cipher = null; TextView tv = new TextView(this); setContentView(tv); for (String name : SYMMETRIC_CIPHERS) { try { cipher = Cipher.getInstance(name, "BC"); tv.append(name); tv.append("\n"); } catch (Exception e) { } } } 

Со списком поставщиков из исходного кода BouncyCastleProvider:

 private static final String[] SYMMETRIC_CIPHERS = { "AES", "ARC4", "Blowfish", "Camellia", "CAST5", "CAST6", "DESede", "Grainv1", "Grain128", "HC128", "HC256", "IDEA", "Noekeon", "RC5", "RC6", "Rijndael", "Salsa20", "SEED", "Serpent", "Skipjack", "TEA", "Twofish", "VMPC", "VMPCKSA3", "XTEA" }; 

Я знаю, что это действительно не помогает, но почему вы не используете AES?

Intereting Posts