2012-11-28 2 views
0

로그인 페이지의 base64 문자열을 해독하려고 시도하고 "Input String is null"오류가 발생합니다. 로그캣은 라인 55와 139를 가리키고 있지만 코드를 다시 코딩하는 방법을 모르겠습니다. 나는 자바와 암호화의 초보자이지만 솔루션이 간단하다는 것을 알고있다. 아래의 logcat 및 decrypt 클래스를 참조하십시오.Android String Decrypt Base64

로그 캣 :

11-12 04:51:49.273: W/System.err(22312): java.lang.NullPointerException: Input string was null. 
11-12 04:51:49.273: W/System.err(22312): at com.SharedPreferences.Login.Base64.decode(Base64.java:1243) 
11-12 04:51:49.283: W/System.err(22312): at com.SharedPreferences.Login.Base64.decode(Base64.java:1224) 
11-12 04:51:49.283: W/System.err(22312): at com.SharedPreferences.Login.AccessApp.decrypt(AccessApp.java:139) 
11-12 04:51:49.293: W/System.err(22312): at com.SharedPreferences.Login.AccessApp.onClick(AccessApp.java:55) 
11-12 04:51:49.293: W/System.err(22312): at android.view.View.performClick(View.java:3511) 
11-12 04:51:49.293: W/System.err(22312): at android.view.View$PerformClick.run(View.java:14105) 
11-12 04:51:49.303: W/System.err(22312): at android.os.Handler.handleCallback(Handler.java:605) 
11-12 04:51:49.303: W/System.err(22312): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-12 04:51:49.303: W/System.err(22312): at android.os.Looper.loop(Looper.java:137) 
11-12 04:51:49.303: W/System.err(22312): at android.app.ActivityThread.main(ActivityThread.java:4424) 
11-12 04:51:49.303: W/System.err(22312): at java.lang.reflect.Method.invokeNative(Native Method) 
11-12 04:51:49.313: W/System.err(22312): at java.lang.reflect.Method.invoke(Method.java:511) 
11-12 04:51:49.313: W/System.err(22312): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
11-12 04:51:49.313: W/System.err(22312): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
11-12 04:51:49.313: W/System.err(22312): at dalvik.system.NativeStart.main(Native Method) 

암호 해독 클래스 (AccessApp) : 암호화 된 사용자 이름과 암호가 SharedPreferences에 저장 한 경우 당신이 시도 전에 인코딩 된 버전 을 얻을 필요가

44. public void onClick(View arg0) { 
45. 
46. sp=this.getSharedPreferences("AccessApp", MODE_WORLD_READABLE); 
47. 
48.  
49.  
50.  
51. byte[] key = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 }; 
52.  
53.  
54. try { 
55.  String decryptedUser = decrypt(user, key); 
56.   user = sp.getString("USERNAME_KEY", decryptedUser); 
57.   
58. } 
59. catch (Exception e) { 
60. // TODO Auto-generated catch block 
61. e.printStackTrace(); 
62. } 
63. try { 
64.  String decryptedPass = decrypt(pass, key); 
65.  pass = sp.getString("PASSWORD_KEY", decryptedPass); 
66.   
67. 
68. } catch (Exception e) { 
69.  // TODO Auto-generated catch block 
70. e.printStackTrace(); 
71. } 
72. 
73. if(lBttn.equals(arg0)){ 
74.  
75.  if((uname.getText().toString().equals(user))&& 
76.  (pword.getText().toString().equals(pass))) 
77.  
78.   { 
79.   Toast.makeText(this, "You are Logged In", 20000).show(); 
80.     
81.    Intent intent; 
82.    intent=new Intent(this,details.class); 
83.    startActivity(intent); 
84.    flag=1; 
85.   } 




135.   public static String decrypt(String encryptedText, byte[ ] key) throws Exception { 
136. SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
137. Cipher cipher = Cipher.getInstance("AES"); 
138. cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
139. byte[] toDecrypt = Base64.decode(encryptedText); 
140. byte[] encrypted = cipher.doFinal(toDecrypt); 
141. return new String(encrypted); 
142. } 
143. } 
+4

설명을 위해 Base64는 ENCRYPTION 알고리즘이 아니며 인코딩 알고리즘입니다. – fatfredyy

+0

?????????????? – user1165694

+0

Base64 암호화 알고리즘이 아닙니다. 이진 데이터를 텍스트 표현으로 인코딩합니다. 조작을 되돌리려면 어떤 키도 필요하지 않습니다. 따라서 보안 조치가 아닙니다. – fatfredyy

답변

0

그것을 해독 할 수 있습니다.

56.  user = sp.getString("USERNAME_KEY", null); 
55.  String decryptedUser = decrypt(user, key); 
.... 
65.  pass = sp.getString("PASSWORD_KEY", null); 
64.  String decryptedPass = decrypt(pass, key); 
+0

변경을 할 때 decryptedUser 및 decryptedPass에 대해 "로컬 변수의 값이 사용되지 않습니다"라는 메시지가 나타납니다. Logcat이 동일한 오류 메시지를 표시합니다. – user1165694

+0

@ user1165694 Logcat은 경고를 줄 수 없습니다. '..value not used'는 여러분이 어디에서나'decrpytedUser' (그리고 pass)를 사용하지 않는다는 사실입니다. 'uname.getText(). toString(). equals (user)'를'decryptedUser'와 비교하고 나중에 암호를 변경해야합니다. – zapl