Проверить подпись SHA1withRSA, сгенерированную в Java (Android) с помощью phpseclib

Вот что я хочу сделать:

  • Сгенерировать 512-битную пару ключей RSA в Java / Android
  • Сгенерировать подпись SHA1withRSA для некоторого сообщения в Java
  • Отправить сообщение, подпись и открытый ключ в PHP (для тестирования это будет выполняться одновременно)
  • Проверить сообщение в PHP с помощью phpseclib

Что я получил на данный момент:

На Сторона Java:

String msg = "Test message";

// generate keypair
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(512);
KeyPair keyPair = keyGen.generateKeyPair();

// generate signature
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(keyPair.getPrivate(), SecureRandom.getInstance("SHA1PRNG"));
signature.update(msg.getBytes());
byte[] sigBytes = signature.sign();

// send message, signature and public key to php script
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(uploadNum + 1);
nameValuePairs.add(new BasicNameValuePair("msg", msg));
nameValuePairs.add(new BasicNameValuePair("signature", Base64.encodeToString(sigBytes,
        Base64.DEFAULT)));
nameValuePairs.add(new BasicNameValuePair("pubkey", Base64.encodeToString(keyPair
        .getPublic().getEncoded(), Base64.DEFAULT)));

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(UPLOAD_SCRIPT);
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpClient.execute(httpPost);

На стороне PHP:

РЕДАКТИРОВАТЬ: Как упоминал Нойберт, решение состоит в том, чтобы добавить $ rsa-> setSignatureMode (CRYPT_RSA_SIGNATURE_PKCS1); .Вдобавок я добавил функцию обрезки около $ _ POST ['pubkey'] , так как заметил, что ключ в кодировке base64 заканчивается разрывом строки.

include('Crypt/RSA.php');
$rsa = new Crypt_RSA();
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
$rsa->loadKey("-----BEGIN PUBLIC KEY-----\n" . trim($_POST['pubkey']) . "\n-----END PUBLIC KEY-----");
echo $rsa->verify($_POST['msg'], base64_decode($_POST['signature'])) ? 'verified' : 'unverified';

Произошло следующее:

phpseclib выдает мне уведомление php «Недопустимая подпись» и результат «непроверенный».

Я уже тестировал это с различными вариантами на стороне PHP, например. base64-декодирование открытого ключа перед передачей его в loadKey (...), а не base64-декодирование подписи, не считая "----- BEGIN PUBLIC KEY ----- \ n", но ничего не помогло, так что далеко.

Итак, что мне нужно сделать, чтобы эта работа заработала?

РЕДАКТИРОВАТЬ: Теперь это работает!

5
задан x-ray 7 January 2012 в 13:10
поделиться