2013-08-08 3 views
2

Я пытаюсь расшифровать строку RSA с моей серверной части. При запуске кода с локального сервера он отлично работает, , но при развертывании приложения в GAE метод возвращает пустую строку (но не null).RSA в Google App Engine

(входная строка представляет собой BASE64 представление двоичных данных дешифровать)

Это мой код:

private static String decrypt(String pwd) { 
    byte[] input = Base64.decode(pwd); 


    try { 
     rsaCipher = Cipher.getInstance("RSA/ECB/NoPadding"); 
    } catch (NoSuchAlgorithmException e) { 
     return null; 
    } catch (NoSuchPaddingException e) { 
     return null; 
    } 

    KeyFactory keyFactory; 
    try { 
     keyFactory = KeyFactory.getInstance("RSA"); 
    } catch (NoSuchAlgorithmException e) { 
     return null; 
    } 

    String modString = "*********"; 
    String privateExponentString = "*********"; 

    RSAPrivateKeySpec prvKeySpec = new RSAPrivateKeySpec(new BigInteger(modString), new BigInteger(privateExponentString)); 
    RSAPrivateKey prvKey; 


    try { 
     prvKey = (RSAPrivateKey) keyFactory.generatePrivate(prvKeySpec); 
    } catch (InvalidKeySpecException e) { 
     return null; 
    } 

    try { 
     rsaCipher.init(Cipher.DECRYPT_MODE, prvKey); 
    } catch (InvalidKeyException e) { 
     return null; 
    } 
    byte[] cipherText; 
    try { 
     cipherText = rsaCipher.doFinal(input); 
    } catch (IllegalBlockSizeException e) { 
     return null; 
    } catch (BadPaddingException e) { 
     return null; 
    } 
    return new String(cipherText); 
} 

Я сделал немного отладки на стороне сервера во время работы в удаленном режиме. я узнал, что функции:

rsaCipher.doFinal(input); 

возвращает массив байт, а каждый элемент содержит «0».

Пожалуйста Advice,

Спасибо и наилучшими пожеланиями, Ноам Коэн

+0

Прежде всего, вы не должны быть игнорирование исключений (ловить их и возвращать null). Вы должны хотя бы зарегистрировать ошибку, чтобы узнать, что на самом деле произошло. –

+0

Спасибо. В версии кода, которую я загрузил, я удалил код обработки ошибок, чтобы сделать код более понятным и добавил «return null» только для компилятора, чтобы принять код. – thecohenoam

ответ

0

Я нашел ошибку, выходная строка всегда имеет длину 128 бит, и нужный незашифрованном строка в конце, а все остальные байты (нуль, код ASCII 0). В журнале Google не отображается вся строка, и она выглядит пустой. Я просто перекручивание каждый символ в строке вывода и скопировать в моей строке каждый символ с ASCII-кодом, отличный от 0.

Я надеюсь, это поможет кому-то, Ноам

0

new String(byteArray) использует кодировку JVM по умолчанию для декодирования массива байтов в строку. На AppEngine это любопытно US-ASCII.

Если исходное содержание в UTF-8, попробуйте использовать new String(cipherText), "UTF-8"

+0

Спасибо. Но я все еще получаю пустую строку? Есть ли у вас другая идея? Ценю вашу помощь. – thecohenoam