2013-03-14 3 views
5
에서 해독

내가 공공 - 민간 키 쌍을 생성하는 다음 Java 코드가 가정? 게시물 https://stackoverflow.com/a/1662887/414414DER 파일을 PEM (Java에서도 공개 키를 저장한다고 가정)으로 변환하는 기능을 제공합니다.RSA 암호화, PHP

내가 좋아하는 뭔가를 시도했다 : 그것은 성공적으로 메시지를 해독

$key = openssl_pkey_get_public ("file://pub_key.pem"); 
$data = null; 
openssl_public_decrypt (file_get_contents ("sig"), $data, $key); 
echo $data, "\n"; 

을하지만, 많은 이상한 문자입니다.

이 시나리오는 PHP 서버로 메시지를 보내고 있지만 개인 키로 데이터를 암호화하는 Java 클라이언트입니다. PHP는 메시지의 암호를 해독하고 유효성을 검사하는 데 사용해야하는 공개 키를 알고 있습니다.

나는이 문제에 관해서 여기에서 많은 게시물을 읽었지만, 이것은 약간의 특정 문제, 특히 사용중인 다른 알고리즘 등이 있다는 것을 깨닫게되었습니다. 중복.

의견을 보내 주시면 대단히 감사하겠습니다. 당신이 잘못된 해독하는 것입니다 공개 키를 참조하는 것처럼 보이는 스 니펫

$key = openssl_pkey_get_public ("file://pub_key.pem"); 

에서

+2

"메시지를 성공적으로 암호 해독했지만 이상한 문자가 많습니다." - 그것에 대해 더 구체적으로 말씀해 주시겠습니까? 단순히 인코딩 문제 일 수 있습니까? –

+1

디코드 된 메시지가 원본 텍스트처럼 보이거나 완전히 왜곡되어 있습니까? –

+0

Java와 PHP간에 전송 된 메시지를 확인하거나 암호화하려고합니까? 아니면 둘다? –

답변

3

"RSA 서명"은 PKCS # 1과 같은 공개 키 프로토콜이 패딩 스키마를 지정하고 모든 서명 스키마가 메시지의 요약을 암호화하므로 "개인 키로 암호화, 공개 키로 암호화"이상의 것입니다. , 전체 메시지 대신. 자바의 서명 구성이 PKCS # 1에 지정된 서명 채우기 구성표를 사용하는 경우 어떤 설명서도 찾을 수 없지만 의심됩니다.

그렇다면 PHP에서 openssl_verify 메서드를 사용하고 싶다면 here으로 문서화하십시오. 서명이 유효하지 않거나 유효한 경우 0 또는 1을 각각 반환합니다.

Java에서 패딩 구성표를 사용하지 않는 경우 서명에서 암호화 된 데이터가 메시지 자체 대신 메시지의 해시라는 점이 문제입니다 (Java 코드에서 SHA-1 해시 알고리즘). 따라서 PHP 측에서는 이 true로 설정된 sha1 method을 사용하여 메시지의 sha1 해시를 가져와 해당 문자열을 비교하여 메시지가 유효한지 확인해야합니다.

+0

정말 고마워요! 서명은 다양한 HTTP 헤더와 그 값을 기반으로 할 것이기 때문에 이것을 서버 측에 모아서 서명이 유효한지 확인할 수 있습니다 :'openssl_verify ("Hello, World", file_get_contents ('sig'), $ pubkey)'. 그리고 그 작품 ;-) – DavidS

+0

나는 같은 질문 .... 생각하지만 openssl_verify() 나를 위해 작동하지 않습니다 .... [질문 링크] (http://stackoverflow.com/questions/16370046/use -php-openssl-verify-function-to-verify-signature-and-data-by-androi) 미리 감사드립니다. – shanwu

-1

. 이중 점검 ?

+0

서명 확인이므로 공개 키를 사용하는 것이 나에게 맞는 것 같습니다. – Henrik

+0

서명 확인은 가능합니다. 따라서 서버는 개인 키를 결코 알 수 없습니다. – DavidS