[crypto] HybridCrypto Module

View Comments

[crypto] HybridCrypto Module

하이브리드 암호화 모듈을 하나 만들었습니다.


크게 새로운 방식은아니구요.


공개키, 비밀키 암호화 기반의 기본적인 하이브리드형 모듈입니다.


Https를 기본적으로 사용하겠지만. 서비스 성질에따라 보안을 더신경써야할 것들에 더해 사용하시면 좋을 듯합니다.


송신자는 전달하고자하는 메세지를 비밀키로 암호화 합니다. 다음 공개키암호화 방식으로 비밀키와 비밀키해시를 암호화하고, 이세가지 데이터를 전송합니다.


수신자는 개인키로 해당 암호화된 비밀키를 복호화하여 비밀키를 알아내고 해당비밀키로 다시 진짜메세지를 복호화합니다.


참고로 키교환은 따로하지않으며 기존에 클라이언트와 서버에 각각 키들이 존재해야합니다. 키교환 자체를 완벽하게하려면 기존에


최초 키를 박아두고, 전송옵션을 두어 위와같은방식으로 교환하는게 보다 안정적입니다.


또한 이러한 방식은 통신구간암호화에 보다 강력합니다.


기본적인 내용이지만 구현하기 손이 많이가는내용들이라 사용하시면 편할거에요.


디테일한 코드 설명은 npm 내부에 기입되어있으니 참고하시면 됩니다.


https://www.npmjs.com/package/hybridCrypto

0 Comments (+add yours?)

Leave a Reply

Tracbacks (+view to the desc.)

#04 typedef

View Comments

#04 typedef

 *typedef 는 타입 정의한다.
=>typedef (타입) (변경할이름)
     - typedef int INT
      INT a = 10; 과같이 사용가능

*예제가 갑
typedef stuct point {
     int x; 
     int y;
     struct point *p
}Point;

Point a = {1,3};
Point b = {100,200};
a.p = &b;
printf("%d %d",a.p->x,a.p->y);
or
printf("%d %d",(*a.p)->x,(*a.p)->y);
*구조체 기반 callby value, callby reference

typedef struct point{

int x;
iint y;
}Point;

void showpoint (Point pos){
     pos.x = 100;
     pos.y = 200;
     printf("%d %d\n",pos.x,pos.y);//결과가 100,200
};
//main

point a = {1,2};
point b = {100,200};
showpoint(a);
printf("%d %d",a.x,a.y);//결과가 1,2

- callbyValue로  pos에 a 의복사가 일어난다. 복사된 데이터기때문에 실제 값이 바뀌지 않는다.

typedef struct point {

int x;
int y;

};

void showposRef (Point *pos){

     (*pos).x=100;
     pos->y = 200;
     printf("%d %d",pos->x,pos->y); //100,200나옴

};

//main

Point a= {10,20};

showposRef(&a);

printf("%d %d",a.x,a.y); // 100,200 나옴 바뀜 

- callbyRef임으로 실제 주소값이 넘어감으록 값이 바뀐다.


*구조체 복사
Point a= {1,2};
Point b; 
b=a;
b에 a 가 복사된다.

*union 과 struct

typedef struct sbox{
int x;
double z;
int y;
}Point;
typedef union ubox{
int x;
int x;
double z;

}UBOX;

//main
SBOX s;
UBOX u;
printf("%p %p %p ",&s.x,&s.y,&s.z);
//주소가 4 4 8 단위씩 뛴다.
printf("%p %p %p ",&u.x,&u.y,&u.z);
//주소가 8사이즈로 멈춰있다. 가장크게 잡혀있음.
printf("%d %d",sizeof(SBOX),sizeof(UBO);
//sbox는 4+4(패딩)+8+4+4(패딩) 24바이트
//Ubox는 가장큰 double 8바이트


*유니온의 활용

typedef struct dbs{
   
unsigned int a;
   
unsigned int b;
}DBS;

typedef struct uboxs{
   
int insertNum;
   
DBS *p ;
}UBOXs;
//main   
   
UBOXs ubox;
   
scanf("%d",&(ubox.insertNum));
    pritntf("upper %d %d",ubox.p->a,ubox.p->b);


*enum


enum{
do,re,me};

//main
do =0 re =1 me = 2

enum{
do=3,
re,
me = 5
} ;
//main 3,4,5  re는 앞의 상수에 +1

typdef enum doreme{
doo,re,mee
}DOREME;


'C Language > C basis' 카테고리의 다른 글

#03 구조체와 포인터  (0) 2016.04.27
#02파일분할과 헤더파일  (0) 2016.04.27
#01 선행처리기  (0) 2016.04.27

0 Comments (+add yours?)

Leave a Reply

Tracbacks (+view to the desc.)

#03 구조체와 포인터

View Comments

#03 구조체와 포인터

*예제가 갑이다

struct point{

int x;

int y;

};


//main


struct point a ={1,2};

struct point b = {100,200};


//포인터 p는 a 의 주소를 가진다.

struct point *p = &a;


printf("%d %d",(*p).x,(*p).y);

혹은

printf("%d %d",p->x,p->y); 

로 출력할수있다.


*구조체와  포인터
struct numbers {

int num1;

int num2;

};

struct point{

int x;

int y;

struct numbers num;

};


//main


struct nubmers a=  {1,2};

struct point b ={100,200,&a};


printf("%d %d %d %d",b.x,b.y,b.num->num1,b.num->num2);//100 200 1 2

*구조체와 자기자신포인터

struct point {

int x;

int y;

struct point p;

};


//main

struct point a = {2,4};

struct point b = {1,3};

a.p = &b;

printf("%d %d",a.p->x,a.p->y);//1 3





'C Language > C basis' 카테고리의 다른 글

#04 typedef  (0) 2016.04.27
#02파일분할과 헤더파일  (0) 2016.04.27
#01 선행처리기  (0) 2016.04.27

0 Comments (+add yours?)

Leave a Reply

Tracbacks (+view to the desc.)

#02파일분할과 헤더파일

View Comments

#02파일분할과 헤더파일


*컴파일러는 파일단위로 컴파일!! 정의되어있지 않다면 에러를 뱉을수밖에없다.


*외부선언 및 정의사실을 컴파일러에게 알려줘야한다. 그 예약 키워드는 ? ==>  extern

fun.c
     extrn int num;//==>extern때문에 컴파일러가 num이 외부에있음을 인지한다. 에러를 발생시키지않는다.

"외부에  정의되어 있을테야. 그러니 일단 넘어가자"

**static

*함수내에서만 접근 가능. 전역변수와 마찬가지로 한번 메모리에저장되면 종료시까지 소멸되지 않음.

*함수 밖에 static 변수가 선언되면 외부소스파일에서 접근이 불가능한다. 현재 파일에서만 접근가능하다
     -static int num =0;//외부에서접근 불가 extern안먹힘

*함수자체에 static선언이 가능하다. 변수와 기능이동일하다.
     -static void MinCnt(void) =>외부에서 호출 불가.


**헤더파일을 include하는 두가지 방식

*#include<헤더>
=>표준헤더파일을 포함시킬때, 파일이 저장된 디렉토리에서 헤더파일을 찾음.

*#include "헤더"
=>프로그래머가 정의한 헤더파일을 포함할때, 문장을 포함하는 소스파일이 저장된 디렉토리에서 파일을 찾게됨

*절대경로로 접근도가능하긴함.

*구조체의 정의는 파일단위로만 그선언이 유효. 
=>즉 다른고셍서 필요하면 다른소스에서 꼭 선언해줘야됨.==>구조체 헤더파일 하나만들고 그거 include해서 사용

*헤더를 중복삽입할수있어,다음과같이 체크를 해주는 매크로를 적용한다.

#ifndef __CALCUS_H__


#define __CALCUS_H__


(definition for Calcus)


#endif


'C Language > C basis' 카테고리의 다른 글

#04 typedef  (0) 2016.04.27
#03 구조체와 포인터  (0) 2016.04.27
#01 선행처리기  (0) 2016.04.27

0 Comments (+add yours?)

Leave a Reply

Tracbacks (+view to the desc.)

#01 선행처리기

View Comments



#01선행처리기 


**선행처리기 => 컴파일 이전의 처리

*소스 -> 선행처리기-> 선행처리된 소스 -> 컴파일러 -> 오브젝트파일 -> 링커 -> 실행파일

*선행처리기에서 단순히 #define 된 정보를 치환한다.

*모든 매크로에는 괄호가 들어가는게 선행처리될때 오해의 소지가 없다.

*두줄에 정의되려면 \ 를 사용하면 되고 아래와같이사용하면됨
     #define SQUARE(Z) \

     ((Z)*(Z))


**특징
*매크로함수는 일반함수에비해 속도가 빠름. 
     -함수의경우 별도의메모리공간 & 호출된함수의 이동 및 반환, 그러나 매크로는 바로치환.

*자료형에따라 별도로 함수를 정의하지 않아도도미.
     -전달되는 인자의 자료형에 구분받지 않아 의존적이지 않음.

*정의하기 까다롭다.
*디버깅하기 쉽지않다. => 선행처리후 컴파일러에의해 에러가감지됨으로, 값이 잘못됬지만 찾기위해선 논리적 혹 계산적 이슈를 체크해야함.

**뭐가 적당하냐
-작은크기의함수
-호출빈도수가 높은함수


**매크로 if문
#if num==0 //num 이 0 이면

#elif num==1

#endif


#ifdef Add //Add가정의되어있다면.

#endif


#ifndef Add //Add가 정의되어 있지 않다면

#endif



*문자열 치환
#define JOBS(a,b) #a "job is" #b

=>JOBS(pk,coder)


*##

#define setNum(a,b) a##00##b

=>setNum(10,20) ==> 100020




'C Language > C basis' 카테고리의 다른 글

#04 typedef  (0) 2016.04.27
#03 구조체와 포인터  (0) 2016.04.27
#02파일분할과 헤더파일  (0) 2016.04.27

0 Comments (+add yours?)

Leave a Reply

Tracbacks (+view to the desc.)

[설계] 소프트웨어의 설계 기본.

View Comments

객체지향 소프트웨어 설계에 많은 원칙들이 존재.

그중 5가지 원칙을 중심으로 살펴본다.


그전에 알아야할 것들


*의존관계

소프트웨어는 변한다는 것을 받아들이고 변경을위한 디자인이 항상 필요해왔다.

변화에 유동적으로 반응하기위해 새로운 의존관계를 생성 또는 변경시킨다. 

이러한 개념을 쉽게 적용 및 이해하기위해 응집도와 결합도라는 개념이 있다.


응집도란?

'하나의 클래스가 하나의 기능을 온전히 담당하는 정도'를 의미한다.

응집도가 높아질수록.

프로그램은 단순 명쾌해진다. 


결합도란?

'클래스간의 서로 다른 책임이 얽혀있는 정도'를 뜻한다. 결합도가 높을수록 코드가 연결고리가 많아짐으로 코드 보기가 복잡하고 힘들다. 


즉 높은 응집도와 낮은 결합도를 갖는 원칙은  고전적 개념이자 원리인것이다.



그럼 상세히 프로그램 5대원칙을 정리해 보자.


1. 단일 책임의 원칙(SRP;Signle Responsibility Principle)

- *객체는 하나의 책임만 맡아야한다*

- 하나의 클래스는 하나의 책임만 맡아야한다. 하나이상을 맡게되면 결합도가 커지며 변경이 어려워진다. 

- 예로 DB클래스가 있다면 이 클래스는 오직 데이터베이스와 관련하여 수행되어야된다.



2. 의존관계 역전의 원칙(DIP;Dependency Inversion Principle)

     - *클라이언트는 구체 클래스가 아닌 인터페이스나 추상클래스에 의존해야한다*

- 왜? 인터페이스에 의존하도록하면 향후 변화개셩겼을때 객체 생성부분만 수정하여  유동적으로 처리할 수 있기때문이다.



3. 인터페이스 분리의 원칙(ISP;Interface Segragation Principle)

- *클라이언트에 특화된 여러개의 인터페이스가 하나의 범용 인터페이스보다 낫다*

- 쉽게말해 인터페이스를 어느정도 세분화 할 필요가 있다는 것이다. 이말은 결합도를 낮추는 방법이 될 수 있다. 언제나 그렇듯이 적당한 세분화가 필요하다



4. 리스코프대체(치환) 원칙(LSP; Liskov Subtitution Principle)

- *기반 클래스는 파생 클래스로 대체 가능해야한다"

- 자식이 부모의 메서드 중 일부를 거부하면 안된다는 의미다. 부모클래스의 메서드를 받지않으면 그것 자체가 올바른 상속구조가 아니라는 것을 말해준다.



5. 개발폐쇄의 원칙 (OCP;Open Closed Principle)

- * 모듈은 확장에는 열려있어야하고 변경에는 닫혀있어야한다*

- 은닉화 라는 표현이 존재한는 이유중 하나일 거란 생각이든다. 변경하려는 것을 getter/setter로 보호하는것은 변경에는 닫혀있는 경우 일 것이다. 허나 수평적인 확장은 용이해야 한다는 의미다.예를 들면 인터페이스 추가로 손쉽게 새로운 기능을 추가하는 것이다.



간단하게만 설계원칙을 알아보았다. 정리하는 수준.

0 Comments (+add yours?)

Leave a Reply

Tracbacks (+view to the desc.)

[0.TempleteMethodPattern] 템플릿메소드란?

View Comments

00. Templete Method Pattern


 - 템플릿 메소드?! 틀, 규격화된 것을 의미한다. 즉 어떠한 프로그램에서 카테고리로 묶어 비슷한 부분을 한번에 처리할 수 있게 규격화 하는 것이다. 특히 순서가 보장된 알고리즘에서 많이 사용된다고 한다. 


무슨소리인지는 나도 모르니까 코딩으로 이해해보자.

그전에 우리는 요리를 하려한다. 피자를.


**논리적 흐름

1.피자 도우를 만들고 2.배달한다

+ 손님이 원하면 치즈를 넣어준다.

+ 여기서 피자는 2개만든다. 사과,바나나 피자이다. 


**

공통부분(템플릿이될부분)을 뽑아낸다.

1.피자 도우를만들고, 2.손님이원하면 재료를 듬뿍!3.배달!


자 논리적 흐름이 짜여졌으니. 클래스를 구성하고 이해하자.

1. PizzaTemplete(추상클래스의 템플릿)

2. ApplePizza

3. BananaPizza

4. PizzaSim(시뮬레이션 메인 클래스)



1.PizzaTemplete 

-공통부분임으로 후에 extends 해준다.

public abstract class PizzaTemplete {

//템플릿기본 이므로 파이널.

//1. 도우를 만들고 2. 소비자가원하면 치즈를 넣어주고

final void prepare(){

makeDouw();

//소비자가 치즈를 원하면(true)면 치즈를 넣어준다.

if(customerWantsAnything()){

insertSource();

}

  Delevely();

}


boolean customerWantsAnything(){

return true;

}

//치즈를 넣어줄거다.

abstract void insertSource();


void makeDouw(){

System.out.println("도우를 만듭니다.");

}

void Delevely(){

System.out.println("배달합니다.");

}

}


2.ApplePizza

public class ApplePizza extends PizzaTemplete{

//입력여하에따라 y or n 로 inserSource의 유무를 정한다.

boolean customerWantsAnything(){

String Answer=getUserInfo(); 

if(Answer.equals("y")){

return true;

}else{

return false;

}


}

private String getUserInfo(){

System.out.println("치즈좀 얹어줘?? y or n");

Scanner scan = new Scanner(System.in);

return scan.nextLine();

}

void insertSource() {

System.out.println("치즈 올려드렸습니다.");

}

}

3. BananaPizza (생략)


4. PizzaSim


Pizzatemplete pm = new ApplePizza();

pm.prepare();

Pizzatemplete pm2 = new BananaPizza();

pm2.prepare();



결과.


도우를 만듭니다. 

치즈좀 얹어줘?? y or n y 

치즈 올려드렸습니다.

배달합니다.



ps1. customerWantsAnything 같은 녀석을 hook(후크)라고 합니다. ApplePizza에서와 같이 override하여 탬플릿에 영향을 미칠 수도, 그러지 않을 수도 있습니다. 당연히 오버라이드하지않는다면 기본적으로 추상클래스에 정의되어 있는데로 진행됩니다.


0 Comments (+add yours?)

Leave a Reply

Tracbacks (+view to the desc.)

[process Exit] 최근실행목록 및 프로세스 강제종료 방법

View Comments



[  최근실행목록 및 프로세스 강제종료 방법   ]


상황: 

필자는 알람 receiver를 통해 뜬 뷰를 finish 혹은 홈버튼으로 눌러 바탕화면으로 이동하였을경우, 홈버튼을 쭉눌렀을때(즉 최근실행 목록) 앱이 안보이길 원한다. + (프로세스에서도 사라졌으면한다)


<해결 코드>

<최근 실행 목록 제거>

android:noHistory="true"

android:excludeFromRecents="true"

<프로세서 종료>

android.os.Process.killProcess(android.os.Process.myPid());

해결:

최근실행목록 제거 - 미니페스트에 들어가 종료되는 액티비티에서 해당 코드를 추가해준다. 즉 <activity> 요사이 </activity>   저기 부분에 넣어주기만 하면 된다는 말.

프로세서 종료 - finish되는 곳에 위에 코드를 추가시켜준다.


의견: 오늘은 없는걸로..




0 Comments (+add yours?)

Leave a Reply

Tracbacks (+view to the desc.)

[Error]WARNING: UNPROTECTED PRIVATE KEY FILE!

View Comments




에러:

    @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @


상황:

aws에서 인스턴스 생성후. ssh -i 명령어로 접근 하였을때  위와같은 에러가 뜨면서 auth관련 로그가 찍힘.


해결:

터미널 접근시  앞에 sudo 를 붙여주면 해결됨. 

그외 squelpro, mysqlWorkBench 등에서는   터미널 =>  chomod 400 (public key).pem  



의견:

chmod 는 Unix게열 에서 사용하는 명령어로 파일 권한 관련 명령어이다.  
뒤에 옴셥을 -x 등등 으로 붙일수있는데 이를 숫자를 이용하여 간편하게 사용할 수 있다.(ex 1의자리는 뭐,,2의자리는 뭐...) 자세한 사항은 검색



'서버 > Ubuntu(aws)' 카테고리의 다른 글

[tip]ubuntu에서 mysql 재시작하기  (0) 2014.09.08
[tip]UNIXTIME 변환해서 보여주는 사이트  (0) 2014.09.08

0 Comments (+add yours?)

Leave a Reply

Tracbacks (+view to the desc.)

[ Android filesystem ] 파일 존재를 체크하자.

View Comments



[ Android filesystem ]


상황: 내가 다운받은 파일들이  내 디렉토리에 존재하는지 체크해보자.


<해결 코드>

   String path = "/sdcard/data/";

File file = new File(path + "song.mp3");


if (file.exists()) {


System.out.println("file exist!!");

} else {

// startDownload();

System.out.println("Non file!@");

}



의견: 참고. 쉽다. song이 있으면 존재 없으면 논파일




0 Comments (+add yours?)

Leave a Reply

Tracbacks (+view to the desc.)

Newer Entries Older Entries