2009-11-02 80 views
7

Tôi đang cố gắng triển khai Mã hóa RSA trong cả Java và PHP, nhưng dường như tôi không thể nhận PHP để nhận ra các khóa công khai/riêng tư Java của tôi. Đây là đoạn mã java để Mã hóa/Giải mã công cộng và phím cá nhân:Mã hóa RSA: Java tới PHP

public static byte[] EncodePublicKey(PublicKey _publickey) throws Exception 
{ 
    return _publickey.getEncoded(); 
} 

public static PublicKey DecodePublicKey(byte[] _encodedkey) throws Exception 
{ 
    KeyFactory fac = KeyFactory.getInstance("RSA"); 
    X509EncodedKeySpec encodedKey = new X509EncodedKeySpec(_encodedkey); 
    return fac.generatePublic(encodedKey); 
} 

public static byte[] EncodePrivateKey(PrivateKey _privatekey) throws Exception 
{ 
    return _privatekey.getEncoded(); 
} 

public static PrivateKey DecodePrivateKey(byte[] _encodedkey) throws Exception 
{ 
    KeyFactory fac = KeyFactory.getInstance("RSA"); 
    PKCS8EncodedKeySpec encodedKey = new PKCS8EncodedKeySpec(_encodedkey); 
    return fac.generatePrivate(encodedKey); 
} 

đầu tiên tôi cố gắng sử dụng các chức năng PEAR Crypt_RSA, nhưng nó không hỗ trợ X.509 hoặc PKCS8 (nó chỉ đơn giản là base64 mã hóa các serialized modulus, exponent và key type). Sau đó, tôi đã thử chức năng OpenSSL "openssl_get_publickey" nhưng nó cũng không xuất hiện để nhận ra định dạng này.

Bất kỳ trợ giúp sẽ được đánh giá rất o.o

Trả lời

10

Bạn cần phải chuyển đổi các định dạng nhị phân (DER) từ Java để PEM cho OpenSSL (và các ràng buộc PHP). Bạn có thể kiểm tra các tệp khóa Java của mình bằng cách sử dụng dòng lệnh OpenSSL bằng cách chỉ định tùy chọn -inform DER trên dòng lệnh.

<? 
function pem2der($pem_data) { 
    $begin = "KEY-----"; 
    $end = "-----END"; 
    $pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin)); 
    $pem_data = substr($pem_data, 0, strpos($pem_data, $end)); 
    $der = base64_decode($pem_data); 
    return $der; 
} 

function der2pem($der_data) { 
    $pem = chunk_split(base64_encode($der_data), 64, "\n"); 
    $pem = "-----BEGIN PUBLIC KEY-----\n".$pem."-----END PUBLIC KEY-----\n"; 
    return $pem; 
} 

// load the public key from a DER-encoded file 
$pubkey = der2pem(file_get_contents("pubkey")); 
?> 

Để biết thêm thông tin về cách sử dụng khóa OpenSSL trong Java, check out this link.

+0

Làm cách nào để chuyển đổi mã hóa ASN.1 sang định dạng PEM trong PHP? – user201117

+0

Cập nhật câu trả lời của tôi sau khi tìm thấy liên kết ở trên ... – jheddings

+0

Điều này đã hiệu quả! Thanks =) – user201117

5

Các hàm PHP yêu cầu mã hóa PEM. Nó là tầm thường để chuyển đổi các khóa mã hóa DER thành PEM.

Đây là mã của tôi để chuyển đổi PKCS # 8 khóa riêng để PEM,

function pkcs8_to_pem($der) { 

    static $BEGIN_MARKER = "-----BEGIN PRIVATE KEY-----"; 
    static $END_MARKER = "-----END PRIVATE KEY-----"; 

    $value = base64_encode($der); 

    $pem = $BEGIN_MARKER . "\n"; 
    $pem .= chunk_split($value, 64, "\n"); 
    $pem .= $END_MARKER . "\n"; 

    return $pem; 
} 

Đối với khóa công khai trong X509, thay thế PRIVATE với CÔNG trong các dấu hiệu.

+0

Điều này giống như câu trả lời được chấp nhận, nhưng đến sau. – user201117

1

http://code.google.com/p/simplersalibrary/ là một công cụ đơn giản, nếu bạn muốn mã hóa một cái gì đó trong Java và giải mã trong PHP hoặc mã hóa trong java và giải mã trong PHP, simplersa cũng có thể tạo tệp pem cho PHP.

1

Bạn cũng có thể thử sử dụng CastleCrypt, cho phép một dễ sử dụng mã hóa RSA trong Java và PHP: https://github.com/wessnerj/CastleCrypt

Đối với thế hệ quan trọng bạn có thể muốn thử nó với openssl:

openssl genrsa -out privateKey.pem 2048 
openssl pkcs8 -topk8 -nocrypt -in privateKey.pem -outform der -out privateKey.der 
openssl rsa -in privateKey.pem -pubout -outform PEM -out publicKey.pem 
openssl rsa -in privateKey.pem -pubout -outform DER -out publicKey.der 

Lệnh này cung cấp cho bạn khóa riêng và khóa công khai trong cả Định dạng DER và PEM. Đối với JAVA, bạn phải sử dụng các khóa .der và cho PHP các khóa .pem.

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