전체 글: 429개의 글

make / 모듈 추가 방법

Posted by ironmask84
2013. 4. 1. 14:22 나는 프로그래머다!/Java & Android


테스트 라이브러리를 플랫폼에 추가하기
안드로이드는 config.mk 에서 각 프로젝트별 android.mk를 뒤져
빌드하는 형태로 구성되어 있다~


안드로이드 플랫폼내에 모듈이나 어플리케이션을 추가시키기 위해
별도의 mk 및 타겟 플랫폼 빌드환경을 구성하기에는 작업해야 하는 일이
많고, 안드로이드에 특화된 시뮬레이터, 서명 등의 문제가 발생할 여지가 있다.

(실제로 발생하는지는 모르겠다... -_-;)


아무튼 기 구성된 make 프로세스에 포함시켜 빌드하는게

가장 편한 방법이기에 해당내용을 정리해 본다. 


ex) helloworld 라는 공용라이브러리 추가하기


1. 테스트 라이브러리를 위한 폴더명 설정  "helloworld"

2. /frameworks/base/helloworld 폴더 추가(다른위치에 추가해도 됨)

3. /build/core/pathmap.mk 수정

pathmap.mk는 프레임워크의 각 서브항목에 대해 정의해둔 곳이다.

make 파일에서 FRAMEWORKS_BASE_SUBDIRS 를 찾아 마지막에 추가될

모듈(helloworld 추가)


#

# A list of all source roots under frameworks/base, which will be

# built into the android.jar.

#

FRAMEWORKS_BASE_SUBDIRS := \

$(addsuffix /java, \

   core \

   graphics \

   im \

   location \

   media \

   opengl \

   sax \

   telephony \

   wifi \

   vpn \

   keystore \

   helloworld \

)


4. 소스 복사 or 코딩

/frameworks/base/helloworld/libhelloworld/ 와 같은 폴더 생성 후 코딩 및 소스 추가


helloworld.h

namespace android {


class HelloWorldTest

{

public:

HelloWorldTest();

~HelloWorldTest();


void Test();

};

};


helloworld.cpp

#include "helloworld.h"

using namespace android;


void HelloWorldTest::Test()

{

return;

}



5. Android.mk 추가

LOCAL_PATH:= $(call my-dir)


include $(CLEAR_VARS)


#여기에 소스 목록을 등록

LOCAL_SRC_FILES:= \

helloworld.cpp


#여기에 사용하는 라이브러리들 등록

LOCAL_SHARED_LIBRARIES:= \

libui \

libcutils \

libutils


#출력 모듈명

LOCAL_MODULE:= libhelloworld

LOCAL_PRELINK_MODULE:= false


#링커 관련 플래그

ifeq ($(TARGET_OS)-$(TARGET_SIMULATOR),linux-true)

LOCAL_LDLIBS += -ldl

endif

 

#동적으로 참조할 라이브러리 추가

#에뮬레이터인 경우 libdl 을 동적참조

ifneq($(TARGET_SIMULATOR),true)

LOCAL_SHARED_LIBRARIES += libdl

endif


#헤더파일 위치

LOCAL_C_INCLUDES:= \

$(LOCAL_PATH)/include \

$(call include-path-for, graphics corecg)


#빌드방식

include $(BUILD_SHARED_LIBRARY)


6. 아웃풋 위치

out/target/product/generic/system/ 에 빌드방식에 따른 폴더가

정의되어 있다.


동적 라이브러리의 경우

out/target/product/generic/system/lib/

out/target/product/generic/obj/SHARED_LIBRARIES/xxxx/

out/target/procuct/generic/symbols/system/lib/

등이 출력 위치이다.



7. 주요 define 항목 설명

LOCAL_PRELINK_MODULE : 프리링크 활성화(true, false)


LOCAL_MODULE_TAGS : 타겟 시스템 설정을 위한 태그

이 값은 최상위의 /build/core/main.mk 에서 각 프로젝트를 빌드할때

사용되는 값으로 어플리케이션의 속성을 지정하게 된다.

설치 관련 정보나 보안 등급, 디버깅 여부 등의 설정이 이루어진다.

기본 값은 user 이다.


eng, user ,userdebug, optional


LOCAL_MODULE_CLASS

모듈의 등급을 지정하는 것으로 아래와 같은 값이 들어감

EXECUTABLES , JAVA_LIBRARIES , SHARED_LIBRARIES


LOCAL_PACKAGE_NAME

/packages/app/ 에 등록된 패키지들과 마찬가지로

패키지명으로 기본 os 에 포함될 패키지를 의미한다.


이름은 패키지의 디렉토리명과 동일해야 한다.

실제 패키지가 이미지에 포함되기 위해서는

build/target/product/generic.mk 에도 등록해야 

system.img에 패키지가 포함된다.



LOCAL_CERTIFICATE : 키 서명

설정되지 않으면 testkey가 사용되며, 해당 키에 대한 값은

/build/target/product/security/ 폴더에 pk8, x509.pem 파일이 존재한다.

이 파일의 이름이 키가 되고, 빌드시 해당 키를 사용한다고

이곳에 지정하게 된다.


테스트용 키를 생성하기 위한 mkkey.sh 스크립트도 포함하고 있다.


LOCAL_CFLAGS : C , C++ 관련 컴파일러 플래그

LOCAL_CPPFLAGS : C++ 관련 컴파일러 플래그

LOCAL_CXXFLAGS

일반적으로 gcc 관련 옵션사항을 기술한다.


기본 최적화 옵션

-O : 기본 최적화를 켠다.

-O2 : 모든 최적화를 켠다. 대부분 -O 보다 나은 선택이며, 일반적으로 사용됨.

-O3 : -O2 에 더해 추가 최적화를 켠다. 바이너리 사이즈가 증가하며 디버깅이 거의 불가능.

-Os : -O2 에 더해 사이즈 관련 최적화를 한다. 큰 어플리케이션에 유용하다.

-O2, -O3 보다 실행 속도가 빠른데, 로드 시간의 감소, 메모리 사용 및 캐쉬, 디스크 사용등

의 최적화가 이루어지기 때문이다.

-fomit-frame-pointer : x86 시스템에서 함수 호출과 관련한 스택포인터와 

이를 지시하는 프레임 포인터에 해당하는 작업을 하지 않는다. 

(각 인수들,  리턴 주소 등의 ebp 관련 레지스터 )

-march=<your_arch> 

-mtune=<your_arch>

-mcpu=<your_arch>

머신 컴파일 옵션으로 대상에 대해 최적화를 수행한다. 대상의 cpu 정보를 넣어주면 되며,

세개 모두 동일한 내용이며, -march 는 -mtune을 의미한다.

-mtune/-mcpu는 gcc 구버전에서 이용되었다. 

-pipe : 컴파일시 별도의 임시파일을 생성하지 않음.



TARGET_SIMULATOR : 대상 시뮬레이터여부 , true/false

TARGET_OS : 대상 os

TARGET_ARCH : 대상 아키텍처



LOCAL_LDLIBS : 링커 옵션

LOCAL_STATIC_LIBRARIES

LOCAL_SHAREDLIBRARIES


LOCAL_C_INCLUDES : include 폴더

LOCAL_CPP_EXTENSION : cpp 소스의 확장자. 기본값은 .cpp



빌드 규칙

include $(BUILD_PACKAGE)

include $(BUILD_EXECUTABLE)

include $(BUILD_SHARED_LIBRARY)

include $(BUILD_HOST_EXCUTABLE)

 

출처 : http://blog.daum.net/hopefullife/117

 

 

Time Stamp와 MD5

Posted by ironmask84
2013. 2. 4. 09:07 컴퓨터공학/Security


3번 문제를 풀기 위해 http://webgame.wowhacker.com/weblevel3/list.php로 접속합니다.


또 아까와 같은 게시판이 보이시죠? 이번에도 게시글을 하나씩 클릭해가며 살펴보도록 합시다.


1번 게시글을 클릭하자 오픈기념사진이란 파일이, 2번 게시글은 몸매짱, 3번 게시글은 Hint, 4번 게시글은 내사진, 5번 게시글은 비밀글 처리되어 내용을 볼 수 없습니다. 1~4번에 업로드된 파일들을 모두 다운로드 받아봅시다. 그러면 아래의 링크로 접속되어 다운로드 되는것을 확인하실 수 있습니다.



다시 게시글을 들어가봅시다. 게시글을 올린 날짜 옆에 숫자가 보이시죠? 게시글마다 각각 숫자가 서로 다릅니다.


1: 2006.10.18 09:05:25 0.25616200

2: 2006.10.19 10:01:05 0.57833500

3: 2006.10.20 12:05.19 0.78252100

4: 2006.10.20 18.24.43 0.65272100

5: 2006.10.22 15:49.52 0.85428900


. 뒤에 있는 숫자와 파일 뒤에 붙는 숫자가 일치하죠? 그리고 5번은 85428900이고 말이에요. 그럼 아래와 같이 유추할 수 있습니다.


http://webgame.wowhacker.com/weblevel3/down/############.85428900


그렇다면 앞에 있는 암호화된 값은 무엇을 의미할까요? 모두다 소문자와 숫자로 조합된 32자리의 값으로 MD5로 인코딩 됬다는걸 쉽게 알 수 있습니다. 한번 MD5로 디코딩을 해봅시다. 아래의 링크로 접속합시다.


링크: http://md5.web-max.ca/

[위 사이트에서 MD5 Encrypt시 입력한 값이 MD5 해쉬사전(데이터베이스, DB)로 넘어갑니다. Decrypt는 이 해쉬사전을 탐색하여 원본값을 가져오는 것입니다. 주민등록번호, 비밀번호 등 역시 이 데이터베이스 내에 남습니다.]


그런뒤에 하나하나 디코딩을 해봅시다.


1: b72776c5eb0c5a05a7188959a49e1f1b -> 1161129925

2: 28d805e190f11ba1da5283d494ee8492 -> 1161219665

3: b08e7acd151d17cbc5f205edf151d7e7 -> 1161313519

4: 779bbf24b15bb7cb0f6b51507f0615f4 -> 1161336283


이 값들은 바로 타임스탬프(Timestamp)값임을 알 수 있습니다. 타임스탬프란 1970.1.1 00:00:00 이후의 시간을 초로 환산하여 문자열로 나타낸 값으로, 아래의 링크로 접속하면 쉽게 시각->타임스탬프, 타임스탬프->시각 변환이 가능합니다.


링크: http://www.4webhelp.net/us/timestamp.php


Timezone는 GMT +9 Hours를 선택하고(우리나라의 표준시는 그리니치 표준시(GMT)보다 9시간 앞서므로 그렇습니다.), Timestamp에 아까 디코딩 된 값 4개를 넣어서 Convert to date를 누릅시다.


1: 1161129925 translates to Wednesday, October 18th 2006, 09:05:25 (GMT +9)

2: 1161219665 translates to Thursday, October 19th 2006, 10:01:05 (GMT +9)

3: 1161313519 translates to Friday, October 20th 2006, 12:05:19 (GMT +9)

4: 1161336283 translates to Friday, October 20th 2006, 18:24:43 (GMT +9)


게시글을 올린 시각이랑 일치하죠? 그렇다면, 여기서 한번더 유추할 수 있습니다. 게시글을 올린 시각을 타임스탬프값으로 변환하여 이를 MD5로 인코딩하면 .앞의 암호화 된 값이 나오므로, 비밀글을 올린 시각인 2006.10.22 15:49.52를 타임스탬프 값으로 변환해봅시다. Day엔 22, Month엔 10, Year엔 2006, Hour에는 15, Minute에는 49, Second에는 52, Timezone은 GMT +9 Hours를 택하고 Convert to a timestamp를 누릅니다. 그러면 아래와 같이 결과물이 출력됩니다.


Sunday, October 22nd 2006, 15:49:52 (GMT +9) translates to 1161499792


1161499792을 가지고, 아래의 사이트로 들어가서 MD5로 암호화 해줍시다.

링크: http://tools.web-max.ca/encode_decode.php


그럼 아래와 같은 값을 얻을 수 있습니다.

fb6e412cf733d6b9cdf777cbcafa35c3


이제 한번 조합해봅시다.

http://webgame.wowhacker.com/weblevel3/down/fb6e412cf733d6b9cdf777cbcafa35c3.85428900


위의 사이트로 들어가면 답이 나와있습니다.


Level3 key: iwantknowmoreMrjones!


즉 답은 'iwantknowmoreMrjones!' 입니다. 수고하셨습니다.

출처 : http://exynoa.tistory.com/108

 

자바 AES 128비트 암호화

Posted by ironmask84
2013. 2. 4. 09:05 컴퓨터공학/Security


String sKeyString = "";
String message = "this is just an example";

 

// 1. 128 비트 비밀키 생성    
KeyGenerator kgen = KeyGenerator.getInstance("AES");    
kgen.init(128);    
SecretKey skey = kgen.generateKey();

 

// 2. 비밀 키를 이렇게 저장하여 사용하면 암호화/복호화가 편해진다.    
sKeyString = Hex.encodeHexString(skey.getEncoded());

 

// 3. 암호화 수행 
SecretKeySpec skeySpec = new SecretKeySpec(skey.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(message.getBytes());
System.out.println("encrypted string: " + Hex.encodeHexString(encrypted));

 

// 4. 복호화 수행
cipher.init(Cipher.DECRYPT_MODE, skeySpec);   
byte[] original = cipher.doFinal(encrypted);    
String originalString = new String(original);    
System.out.println("Original string: " + originalString + " " + Hex.encodeHexString(original));

 

 

jar : commons-codec-1.6.jar

출처 : http://blog.naver.com/PostView.nhn?blogId=yunta8&logNo=100162235590&redirect=Dlog&widgetTypeCall=true

 

문자열을 SHA-512 방식으로 암호화(단방향 암호화 방식 : 예 로그인)

Posted by ironmask84
2013. 2. 4. 09:03 컴퓨터공학/Security


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

import java.security.*;
 
// 문자열을 SHA-512 방식으로 암호화
 
public String encrypt(String input) throws NoSuchAlgorithmException {
 
    String output = "";
 
   
 
    StringBuffer sb = new StringBuffer();
 
    MessageDigest md = MessageDigest.getInstance("SHA-512");
 
 
 
    md.update(input.getBytes());
 
    byte[] msgb = md.digest();
 
 
 
    for (int i = 0; i < msgb.length; i++) {
 
        byte temp = msgb[i];
 
        String str = Integer.toHexString(temp & 0xFF);
 
        while (str.length() < 2) {
 
            str = "0" + str;
 
        }
 
        str = str.substring(str.length() - 2);
 
        sb.append(str);
 
    }
 
   
 
    output = sb.toString();
 
   
 
    return output;

}
 


 

자바 데이터 암호화: DES, 3DES, AES, RSA, MD5, SHA1

Posted by ironmask84
2013. 2. 4. 09:02 컴퓨터공학/Security


* 스트림 암호화 방식

: Clear text를 encode한 것을 1문자씩 변환


* 블럭 암호화 방식

: Clear text를 정해진 블럭으로 나눈후 해당 블럭을 암호화


* 대칭키 암호화 방식(old)

: 암호화 키와 복호화 키가 동일


* 비대칭키 암호화 방식(new)

: 암호화키는 공개키, 복호화키는 비밀키, 대칭 암호화에 비해 속도가 느림

  주로 개인키를 교환하는 목적으로 많이 사용

  A와 B가 Data를 주고 받는다고 할때 :

  개인키로 암호화하면 공개키로만 풀 수 있다. 공개키로 암호화하면 개인키로만 풀 수 있다.

  A와 B 각각이 공개키/개인키 한쌍씩을 가지고 있으면서

  서로에게 공개키만 알려줌

  A -> B Data 전송시 :

  A는 B의 공개키로 Data를 암호화시켜서 B에게 전송

  Data를 받은 B는 자신의 개인키로 Data를 복호화.

  B는 A의 공개키로 return값을 암호화시켜서 A에게 전송

  return값을 받은 A는 자신의 개인키로 return값을 복호화.


* 메시지 다이제스트

: 원문에 일방향 해쉬 함수를 적용, 일정 길이의 유일한 문자열로 변환하는 방식

  복호화 불가능, 전자서명시 사용



- DES

블럭 암호화 방식, 대칭키 암호화 방식

텍스트를 64bit 단위로 나눠 56bit 키로 암호화하는 알고리즘


- 3DES

DES의 짧은 키를 보완한 방식(DES를 세번 적용)


- AES

블럭 암호화 방식, 대칭키 암호화 방식

텍스트를 128bit 단위로 블럭화

128bit, 182bit, 256bit의 키로 암호화


- RSA

블럭 암호화 방식, 비대칭키 암호화 방식

두 개의 큰 소수들의 곱과, 추가 연산을 통해 키 생성

가장 보편적으로 사용


- MD5

블럭 암호화 방식, 메시지 다이제스트

임의의 길이의 입력데이터를 128bit의 출력데이터로 변환

512비트 단위로 알고리즘 수행, 메시지 길이를 512bit 배수로 패딩 

단, 원래의 메시지 길이 입력을 위한 64bit는 남겨둬야함


- SHA1

블럭 암호화 방식, 메시지 다이제스트

임의의 길이의 입력데이터를 160bit의 출력데이터로 변환


(참조 http://minix.tistory.com/397)