2013-03-23 2 views
1

저는 Android 앱을 개발 중입니다. 불행히도 나는 호환성 문제가있다. 내 소스 코드는 펌웨어 4.1에서 작동하지만 펌웨어 2.2가있는 장치와 충돌합니다. 이 오류는 ObjectInputStream으로 인해 발생하는 "ClassNotFoundException"인 것 같습니다. 암호화 및 암호 해독을위한안드로이드 2.2에서 RSA 암호화/암호 해독이 충돌합니다.

내 소스 코드 :

private Key getPublicKey() { 
    try { 
     InputStream fis = activity.getResources().openRawResource(R.raw.publick); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     Key RSApublicKey = (Key) ois.readObject(); 
     return RSApublicKey; 
    } 
    catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
    catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

private Key getPrivateKey() { 
    try { 
     InputStream fis = activity.getResources().openRawResource(R.raw.privatek); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     Key RSAprivateKey = (Key) ois.readObject(); 
     return RSAprivateKey; 
    } 
    catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
    catch (ClassNotFoundException e) { 
     Log.e("error", "Error: " + e); 
     e.printStackTrace(); 
    } 
    return null; 
} 

public byte[] encrypt(String data) { 
    byte[] encrypted = null; 
    try { 
     Cipher cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.ENCRYPT_MODE, getPublicKey()); 
     encrypted = cipher.doFinal(data.getBytes()); 
    } 
    catch (IllegalBlockSizeException e) { 
      e.printStackTrace(); 
    } 
    catch (BadPaddingException e) { 
     e.printStackTrace(); 
    } 
    catch (InvalidKeyException e) { 
     e.printStackTrace(); 
    } 
    catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
    catch (NoSuchPaddingException e) { 
     e.printStackTrace(); 
    } 
    catch (NoSuchProviderException e) { 
     e.printStackTrace(); 
    } 
    return encrypted; 
} 

public String decrypt(byte[] encrypted) { 
    byte[] decrypted = null; 
    try { 
     Cipher cipher; 
     cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.DECRYPT_MODE, getPrivateKey()); 
     decrypted = cipher.doFinal(encrypted); 
    } 
    catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
    catch (NoSuchPaddingException e) { 
     e.printStackTrace(); 
    } 
    catch (InvalidKeyException e) { 
     e.printStackTrace(); 
    } 
    catch (IllegalBlockSizeException e) { 
     e.printStackTrace(); 
    } 
    catch (BadPaddingException e) { 
     e.printStackTrace(); 
    } 
    catch (NoSuchProviderException e) { 
     e.printStackTrace(); 
    } 
    return new String(decrypted); 
} 

로그 캣의 오류 :

03-23 10:13:19.706: E/Error(427): Error: java.lang.ClassNotFoundException: com.android.org.bouncycastle.jce.provider.JCERSAPrivateCrtKey 

당신이 어떤 생각을 가지고 있습니까, 내가 어떻게이 안드로이드 2.2에서 작동 얻을 수 있을까?

+0

[이미 질문하셨습니다] (http://stackoverflow.com/questions/15501592/problems-outsourcing-rsa-encryption-and-decryption). 새 질문을 게시하는 대신 원래 질문을 편집해야합니다. –

+0

@DuncanJones 흠, 그 질문은 많은 정보를 남겨 둡니다. 답변이 없으므로 역으로하는 것이 좋습니다. 나는 이들 중 하나가 아마 다른 이슈가 아니라면 가야한다는 것에 동의한다 (그러나 나는 그런 생각을하지 않는다). –

답변

0

키를 serialize하려면 Key.getEncoded() 메서드를 사용하는 것이 좋습니다. Key.getFormat()은 RSA 비공개 키가 PKCS # 8 인코딩으로 기본 설정되어야한다는 것을 이미 암시합니다.

그런 다음 PKCS8EncodedKeySpec 클래스와 "RSA"KeyFactory의 인스턴스를 사용하여 결과 바이트 배열을 deserialize 할 수 있습니다.

서로 다른 구현 인 PrivateKey에서 직렬화 된 키가 올바르게 작동하지 않을 수 있으며 PKCS # 8은 잘 정의되고 자주 사용되는 표준입니다.

+0

내 휴대폰에서 오늘 저녁 답을 수정합니다. –

+0

작동 방식을 알려주시겠습니까? 나는 나의 방법을 안다. 아니면 RSA 암호화를위한 자체 클래스를 작성하는 것이 더 쉽습니까? 흥미로운 것 같습니다. – JavaForAndroid

+0

'PKCS8EncodedKeySpec'에 대한 간단한 검색으로 충분합니다. http://stackoverflow.com/questions/7216969/getting-rsa-private-key-from-pem-base64-encoded-private-key-file이 방법을 사용하여 개인 키를 작성합니다. 다시 인코딩 된 바이트 배열에서. 따라서 클래스 자체 대신 바이트 배열을 serialize/deserialize합니다. –

0

글쎄, 만약 4.1에서 작동하지만 2.2에서는 작동하지 않는다면 2.2 이후에 포함 된 안드로이드의 클래스 일 것입니다. 당신은이 클래스를 사용하는 프로젝트를 android 2.2로 컴파일하려고 시도 할 수 있는지 테스트해볼 수 있습니다. 이 경우 해당 프로젝트를 찾아 프로젝트에 포함하십시오.

+0

나는 이미 project.properties 파일에서 target = android-15 라인을 target = android-8 라인으로 변경했다. 하지만 Sherlock Action Bar를 사용하기 때문에 빌드 타겟을 4.0으로 설정해야합니다. 빌드 대상을 변경하면 "R을 확인할 수 없음"오류 만 표시됩니다. 이는 XML 레이아웃 파일에 오류를 발생시키는 ActionBar 때문입니다. – JavaForAndroid

+0

좋아, 목표 8로 새로운 안드로이드 프로젝트를 만들고 해당 클래스에 액세스 해보십시오. – crios

+0

절대로이 클래스에 액세스 할 수 없습니다. 또한 빌드 대상 15 아니야. – JavaForAndroid

관련 문제