2009-11-02 7 views
7

Java와 PHP 모두에서 RSA 암호화를 구현하려고하는데 PHP에서 Java 공개/개인 키를 인식하지 못하는 것 같습니다. 다음은 공개 키와 개인 키를 인코딩/디코딩 할 수있는 자바 코드는 다음과 같습니다RSA 암호화 : Java to 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); 
} 

내가 먼저 PEAR Crypt_RSA 기능을 사용하여 시도하지만 X.509 또는 PKCS8를 (그냥 단순히 Base64로 직렬화 된 인코딩을 지원하지 않습니다 모듈러스, 지수 및 키 유형). 그런 다음 OpenSSL "openssl_get_publickey"기능을 시도했지만 형식을 인식하지 못합니다.

어떤 도움을 크게 o.O

답변

10

당신은 OpenSSL을 (그리고 PHP 바인딩)에 대한 PEM 자바의 바이너리 형식 (DER)를 변환 할 필요를 감상 할 수있다. 명령 행에서 -inform DER 옵션을 지정하여 OpenSSL 명령 행을 사용하여 Java 키 파일을 테스트 할 수 있습니다.

<? 
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")); 
?> 

Java에서 OpenSSL 키를 사용하는 방법에 대한 자세한 내용은 check out this link을 참조하십시오.

+0

그렇다면 어떻게하면 PHP에서 ASN.1 인코딩을 PEM 형식으로 변환 할 수 있습니까? – user201117

+0

위의 링크를 찾은 후 나의 대답이 업데이트되었습니다 ... – jheddings

+0

이것이 성공했습니다! 감사합니다.) – user201117

5

PHP 함수에는 PEM으로 인코딩 된 키가 필요합니다. DER로 인코딩 된 키를 PEM으로 변환하는 것은 간단합니다.

여기 X509의 공개 키를 들면,

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

PEM에 PKCS # 8 개인 키를 변환하는 내 코드, 마커에 공공과 민간 대체합니다.

+0

이것은 수락 된 답변과 동일하지만 이후에 발생했습니다. – user201117

1

http://code.google.com/p/simplersalibrary/는 Java의 무언가를 암호화하고 PHP에서 해독하거나 PHP에서 java로 암호화하고 해독하기를 원한다면 PHP의 pem 파일을 생성 할 수있는 간단한 도구입니다.

당신은 또한 쉽게 RSA 자바의 암호화 및 PHP 사용할 수 있습니다 CastleCrypt, 사용하려고 할 수 있습니다
1

:

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 

: 당신은 OpenSSL이 그것을 시도 할 수 있습니다 키 생성을 위해 https://github.com/wessnerj/CastleCrypt

을 이 명령은 DER 및 PEM 형식의 비공개 및 공개 키를 제공합니다. JAVA의 경우 .der 키를 사용하고 PHP의 경우 .pem 키를 사용해야합니다.