2011-09-07 2 views
1

내 문제를 해결하기 위해 도움이 필요합니다.RSA Android Encrypt/RSA PHP 암호 해독

문제 : Android 플랫폼에서 공개 RSA 키를 사용하여 숫자 (A)를 암호화 한 다음 개인 키로 PHP 서버에서 암호를 해독하고 싶습니다. 각 플랫폼에서 데이터를 암호화하고 해독 할 수 있지만 (잘 작동 함) PHP 스크립트가 ANDROID에서 암호화 된 데이터를 해독하려고하면 작동하지 않습니다 !! 내가 직접 안드로이드에서 생성 암호화를 해독 (Base64로 코딩) 시도가 전혀 작동하지 때문에

문제는 ..., HTTP 전송에서하지

Findhere 복호화 데이터에 대한 내 PHP 코드 후 :

class MyEncryption 
{ 

public $privkey = ''; 
public $pubkey = ''; 
public function __construct(){ 

} 

public function initialize() { 
    $fp=fopen("./encryption/asasap_public.pub","r"); 
    $temp=fread($fp,8192); 
    fclose($fp); 
    $this->pubkey = openssl_pkey_get_public($temp); 

    $fp=fopen("./encryption/asasap.pem","r"); 
    $temp=fread($fp,8192); 
    fclose($fp); 
    $this->privkey = openssl_get_privatekey($temp,''); 

} 

public function encrypt($data) 
{ 
    if (openssl_public_encrypt($data, $encrypted, $this->pubkey)) 
     $data = base64_encode($encrypted); 
    else 
     throw new Exception('Unable to encrypt data. Perhaps it is bigger than the key size?'); 

    return $data; 
} 

public function decrypt($data) 
{ 
    if (openssl_private_decrypt(base64_decode($data), $decrypted, $this->privkey)) 
     $data = $decrypted; 
    else 
     $data = ''; 

    return $data; 
} 

public function hex2bin($hexdata) { 
    $bindata = ''; 

    for ($i = 0; $i < strlen($hexdata); $i += 2) { 
     $bindata .= chr(hexdec(substr($hexdata, $i, 2))); 
    } 

    return $bindata; 
} 
} 

그리고 난 여기처럼이 클래스를 사용 : 여기에 데이터 1

$enc = new MyEncryption(); 
$enc->initialize(); 
$data_1 = 'K27booXr0zZK4BQlI45MIPJJjPPkpCCPELGvoK/wKYUwShIWE6szlZtrmV83C5eBIrT/3lxWTH3+IOA+5mefurVUvXmQIV7fXEHNHLphyM6L9gQsMAGZMCroPjWKvJM59OMS/d5dwwhiRgzVarxXSKpxBYhEYWJTu7nRJ+bZKjumeoqnCSpmntIiV+tRYgkYflOU6j2QlesjO5tzj/TL6n7vHSO/O1qafJkzHcv8Kn2hTy+IH7QXm7z5vtjXOucHkvBm1xWORXdifh+ChyVvP16dSEmCaCAH6KqtA4viX/HwRFEi4mIWaYSIQk74NdcnQOpFcTgEu2nDwtHaBMqahw=='; 
$data_2 = $enc->decrypt($data_1); 

는 RSA 공개 키와 안드로이드의 암호화 데이터 (A = 5) (주에서 초기화 : 해독 잘 안드로이드에서 작동),하지만 PHP에서 해독 후, 난 빈 문자열을 얻을 ...

------------------------- ----------------- UPDATE -------

안드로이드 부분에 대한 코드 뒤에 여기 찾아주세요 : 데이터를 암호화 한 후

public byte[] encryptRSA(final InputStream publicKeyFile, String in) throws IOException, NoSuchAlgorithmException, 
    InvalidKeySpecException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, 
    BadPaddingException { 
    byte[] encodedKey = new byte[5000]; 
    publicKeyFile.read(encodedKey); 
    X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    PublicKey pkPublic = kf.generatePublic(publicKeySpec); 
    // Encrypt 
    Cipher pkCipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING"); 
    pkCipher.init(Cipher.ENCRYPT_MODE, pkPublic); 
    return pkCipher.doFinal(in.getBytes()); 
} 

, byte []를 Base64 (Base64.encodeToString (input, Base64.DEFAULT))로 변환합니다.

인증서의 경우 RSA 2048 비트를 Android 용 DER 형식으로 변환합니다.

------------------------------------------ 해결책 --- ----

오류는 다음과 같은 라인에 있습니다

byte[] encodedKey = new byte[5000]; 
publicKeyFile.read(encodedKey); 

우리는 exactely 읽어야 공개 키 :

가 많은 장소가있다
byte[] encodedKey = new byte[/*lenght of file*/]; 
publicKeyFile.read(encodedKey); 
+0

Android 코드는 무엇입니까? –

답변

1

이 잘못 될 수 있습니다

  1. X509EncodedKeySpec에 5000 바이트를 전달합니다. 대부분 0입니다. 적절한 공개 키를 가져 왔습니까?
  2. in 문자열의 길이는 얼마나됩니까?
  3. String.getBytes()은 플랫폼 기본 인코딩을 사용하며 의도하지 않은 결과가 발생할 수 있습니다. getBytes("ASCII") 또는 getBytes("UTF-8")을 사용하십시오.

일반적으로 SSL을 사용해야하며 비대칭 암호화를 직접 구현하지 마십시오.

+0

좋아, 네가 맞다. 내가 읽기 버퍼를 KEY의 길이로 바꾼다. 그리고 해독은 PHP 페이지에서 작동한다 !! 감사 – user932356