제가 메모장에 암호 기능을 추가하는 어플을 개발하고 있습니다.

그리고 암호 기능은 KISA에서 제공하는 스마트폰 암호 라이브러리를 이용해서 개발하려고 합니다.

라이브러리를 분석 하니까 ndk 라이브러리입니다.그리고 .so 파일도 있습니다.

라이브러리 로딩은 KISA에서 스마트폰 암호 라이브러리 신청시 얻은 문서를 통해서 수행했습니다.

아,문서는 용량이 큰 관계로 못올리겠고 설명을 하겠습니다.

KISACryptoLib.jar는 이클립스의 프로젝트에서 import 시키고 빌드 패스(Configure build path)를 설정했습니다.

그리고 lib라는 폴더, armeabi만들어서 libKISACrpyto.so 파일을 임포트 시켰습니다.

질문 사진은 그렇게 처리되어진 상태입니다.(사진에 나온 lib 내 폴더 잘못되었네요.여러분들은 armeabi로 하세요.-ㅁ-;;;)

 

이미 이렇게 만들어진 라이브러리와 .so 파일을 가진 상태에서 

라이브러리에 있는 네이티브 메소드를 불러오는 함수를 만들고 싶은데 어떻게 해야 할 지 모르겠습니다.

이 부분은 edit.java 로 메모파일을 암호화 하고 저장을 하려고 하는데 그 때 라이브러리에 있는 네이티브 메소드를 부르려고 합니다.

어떻게 해야할 지 모르겠는데 알려주시면 감사하겠습니다.(저는 라이브러리에 있는 알고리즘 중 HIGHT 소스에 있는 네이티브 메소드를 부르려고 합니다.)

 

혹시나 해서 제가 라이브러리, .so 파일을 올리니 참고하세요.

사용할 암호 알고리즘은 KISACryptoLib.jar파일을 역분석해서 얻은 파일 중 HIGHT라는 알고리즘입니다.

그 참고 소스도 올립니다.

 

package org.memo.pkg;

import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import org.kisa.*;


public class Edit extends Activity implements Variable{
 
 //JNI Library
 static
 {
  System.loadLibrary("KISACrypto");
 }
  
 Button btn = null;
 boolean isOpenEdit = false; 
 
 

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.edit);

   
        final Intent intent = getIntent();
        isOpenEdit = intent.getBooleanExtra("isOpenEdit", false);

        if( isOpenEdit ){
         
         EditText etFileName = (EditText)findViewById(R.id.et_filename);
         EditText etMemo = (EditText)findViewById(R.id.et_edit);
         etFileName.setText(intent.getStringExtra("FILENAME"));
         etMemo.setText(intent.getStringExtra("FILECONTENT"));
         
        }
       
        ButtonProc(R.id.btn_save);
        ButtonProc(R.id.btn_menu);
       

    }
   
    public void ButtonProc(final int id){
     btn = (Button)findViewById(id);
     btn.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
       switch(id){
       case R.id.btn_save:  
        SaveProc();
        break;
       case R.id.btn_menu:
//           finish();    
        Intent intent = new Intent(Edit.this, Memo.class);
        startActivity(intent);
        break;
       }
   }
     });

    }
   
    //파일 저장 처리 및 사용자에게 보이기
    public void SaveProc(){
     EditText et = (EditText)findViewById(R.id.et_filename);
     String getFileName = et.getText().toString();
     
     //파일의 이름이 중복되는 경우
  if( getFileName.equals(""))
  {  
   Intent intent = new Intent(Edit.this, Message.class);
   intent.putExtra("MESSAGE", NO_NAME);
   startActivity(intent);
  }
  
  //파일이름이 중복되지 않는 경우
  else
  {
   int iFileLeng = fileList().length;   

   
   if( iFileLeng != 0 )
   {   
    boolean isAlreadyFile = false;
    String[] sFileList = fileList();   
    for( int i = 0 ; i < iFileLeng ; i++)
    {
     if( sFileList[i].equals(getFileName) )
     {  
      isAlreadyFile = true;
      break;
     }
    }
    
    //이미 존재하는 파일인 경우
    if(isAlreadyFile){     
     Intent intent = new Intent(Edit.this, Message.class);
     intent.putExtra("MESSAGE", ALREADY_FILE);
     startActivity(intent);
    }
    //이미 존재하는 파일이 아닌 경우
    else
    {        
     FileSave(getFileName);
    }
   }
   
   //파일중복이 없고 이미 존재하지 않는 파일이 아닌 경우
   else
   {
    FileSave(getFileName);
   }
  }
    }
   
    //우리가 처리해야할 부분 -> 메모장 저장 함수
    //KISACrypto lib(암호화 라이브러리)를 불러올 함수 만들기
    //사용할 암호 라이브러리의 알고리즘  : HIGHT 암호 알고리즘
   
    //적당한 부분에서 암호화 함수 만들기 -> 라이브러리의 HIGIT 암호화 불러오기
    //키를 사용자가 입력하도록 처리하기.
    //입력 다이얼 로그 만들기
    //키를 저장하는 부분 필요.
    //불러오기 기능에서 복호화 기능 넣기
 
    public void FileSave(String sName)
    {
     //키 입력 다이얼로그 만들기
     //라이브러리에 있는 네이티브 함수 호출
     /*
      * public callFunction()
      * {
      *   입력한 키
      *   그리고 메모 내용 저장시 사용되는 평문(메모파일)을 가지고 라이브러리에 있는 함수 호출

      * }

      *
      */
     // 본래 파일 저장 및 처리하는 부분.
     try {
      EditText et = (EditText)findViewById(R.id.et_edit);
      byte[] buffer = stringToByte(et.getText().toString());    
   FileOutputStream fos = openFileOutput(sName, Context.MODE_PRIVATE);
   fos.write(buffer);
   fos.flush();
   fos.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  Intent intent = new Intent(Edit.this, Message.class);
  intent.putExtra("MESSAGE", SAVE_COMPLETE);
  startActivityForResult(intent, 0);
    }

   
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
  if( data.getAction().equals("ACTION_A")){
   finish();
  }
    }
 
    public byte[] stringToByte(String sBuffer)
    {
  byte[] bBuffer = new byte[sBuffer.length()];
  for(int i = 0 ; i < sBuffer.length() ; i ++)
   bBuffer[i]=(byte)sBuffer.charAt(i);
  return bBuffer;
 }
}