2012-01-06 56 views
5

Đây là những gì tôi muốn làm:Xác SHA1withRSA chữ ký được tạo ra trong Java (Android) với phpseclib

  • Tạo một 512 bit RSA cặp khóa trong Java/Android
  • Tạo một chữ ký SHA1withRSA đối với một số thông điệp trong Java
  • Gửi tin nhắn, chữ ký và khóa công khai để PHP (để thử nghiệm này sẽ được thực hiện cùng một lúc)
  • Xác minh thông điệp trong PHP sử dụng phpseclib

Những gì tôi có cho đến nay:

Về phía 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); 

Về phía PHP:

EDIT: Như Neubert đề cập, giải pháp là để thêm $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);. Ngoài ra, tôi đã thêm chức năng cắt xung quanh $_POST['pubkey'] khi tôi nhận thấy rằng khóa được mã hóa base64 kết thúc bằng dấu ngắt dòng.

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'; 

gì xảy ra là:

phpseclib mang lại cho tôi một thông báo php "chữ ký không hợp lệ" và kết quả là "chưa được xác minh".

Tôi đã thử nghiệm điều này với các biến thể khác nhau ở phía PHP, ví dụ: base64 giải mã khóa công khai trước khi giao cho loadKey (...), không giải mã base64, bỏ đi "----- BEGIN PUBLIC KEY ----- \ n" mọi thứ, nhưng không có gì giúp xa.

Vì vậy, tôi phải làm gì để thực hiện công việc này?

EDIT: Bây giờ nó hoạt động!

+0

Đã gần như cùng một vấn đề: đảm bảo rằng bạn base64_decode chữ ký! Đã xem nó một vài lần – xXx

Trả lời

3

Dường như $ _POST ['msg'] có thể cần phải là base64_decode() 'd? Ngoài ra, hãy thử thực hiện $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1). Theo mặc định phpseclib hiện OAEP đệm mà, mặc dù an toàn hơn, không được hỗ trợ rộng rãi cũng không phải là mặc định cho hầu hết các công cụ.

+0

Cảm ơn bạn neubert, '$ rsa-> setEncryptionMode (CRYPT_RSA_ENCRYPTION_PKCS1)' đã làm các trick. Tôi sẽ cập nhật Bài đăng gốc của mình. –

Các vấn đề liên quan