Шифрование RSA: разница между Java и Android

Я использую RSA для шифрования имени пользователя и пароля на Android и дешифрования их на сервере (tomcat 6, java 1.6). Шифрование Android:

    PublicKey pubKey = readPublicKeyFromFile(mod, ex);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    byte[] cipherData = cipher.doFinal(data);
    return cipherData;

Расшифровка Java Tomcat:

    PrivateKey pubKey = readPrivateKeyFromFile(mod, ex);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, pubKey);
    byte[] cipherData = cipher.doFinal(data);
    return cipherData;

Если я использую часть Android ВНЕ Android (только в основном методе), она работает нормально. Но не внутри моего андроида (эмулятора). На стороне сервера я получаю следующую ошибку:

javax.crypto.BadPaddingException: Blocktype mismatch: 0
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:311)
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:255)
    at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)

Я сохраняю мод и ex как константы BigIntegers, поэтому я не записываю их в файл. Я знаю, что существует разница между шифрованием java1.6 и java 1.5, поэтому оба скомпилированы с java 1.6.

Некоторая отладочная информация:

Во время отладки в android я вижу, что pubKey содержит модуль и показатель степени в шестнадцатеричном формате. И если я отлаживаю основной метод (опять тот же код), я вижу, что pubKey содержит модуль и показатель степени в десятичном виде.

Что я делаю не так?

Спасибо

26
задан bsobat 20 May 2011 в 09:01
поделиться