aes 128 기준 간단 정리

선행 요구 지식
빅엔디안, 리틀엔디안
xor, and, or
4x4 행렬 곱 계산 방법

추가 보너스
galois field 대충 알면 굳
곱연산이 xor 연산으로 대체된다

좋은 자료들
★ 표준 자료집 및 샘플들, 테스트할 때 필요
fips 197
★ 암복호화 시뮬레이션
★ 암복호화 애니메이션 - 이해하는데 크게 도움된다
★ 수학적 내용들이 어떻게 컴퓨터 코드로 변할 수 있는지 정보(이해하기 쉬움 강추)
Galois Field in Cryptography
Christoforus Juan Benvenuto
May 31, 2012
★ 암호화, 복호화 할 때 곱연산을 미리 계산해 표로 만들어 둠


주의사항(삽질 하지 않기 위해 중요!!) - 구현 방법에 따라 필요하지 않은 내용일 수 있으니 참고만 하면 된다 
데이터 표현은 다음과 같다
A. 암호화 하고 싶은 문자열
-> "00112233445566778899aabbccddeeff"

B. 바이트 단위로 분리
-> 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff
바이트 단위 예시 
0x11
16 진수 -> 2의 4승 -> 숫자 한자리가 4bit -> 그러므로 1바이트는 2자리 숫자(0x00 ~ 0xFF) 

C. 수학적 행렬 표현
->
00 44 88 cc
11 55 99 dd
22 66 aa ee
33 77 bb ff
주의 사항☆☆ aes 알고리즘에서는 행을 묶어 연산하지 않고(00 44 88 cc 가 아니라)
열을 묶어 연산을 한다(00 11 22 33) 컴퓨터 코드로 구현시 유의하기 바란다

D. 컴퓨터 배열 표현(각자 구현 방법에 따라 다름)
(인간이 읽기 편한 표현과 다르게 위에서 아래로 세로로 한 묶음임에 주의하라
 마치 행렬이 대각선 대칭된 것 같아보이지만 실제로 위와 아래는 같은 행렬이다
 물론 이건 각 개인이 어떻게 구현하느냐에 따라 다르다)
->
uint32_t col[4]
col[0] = 0x00112233;
col[1] = 0x44556677;
col[2] = 0x8899aabb;
col[3] = 0xccddeeff;

*** 컴퓨터 내부 메모리 상태(빅엔디안, 리틀엔디안에따라 다름)
little endian - x86, arm이라고 가정
->
uint8_t *ptr = (uint8_t *) col;    //32bit 변수인 col을 8bit씩 접근
ptr[0] : 0x33
ptr[1] : 0x22
ptr[2] : 0x11
ptr[3] : 0x00
거꾸로 들어가 있음에 주목하라

참고 - 리틀엔디안, 빅엔디안

-> 괜히 헷갈릴까봐 빼버림, 별 필요도 없음


알고리즘
각 과정에 관한 상세한 설명은 fips 197 문서를 참고하기 바란다
아래는 개략적 흐름을 쉽게 이해하기 위해 간략하게 작성한다

1. key scheduling
2. init round
add round key
3. round (반복)
sub bytes
shift rows
mix columns
add round key
4. final round
sub bytes
shift rows
add round key


1. key scheduling 
key expansion, 키확장이라고 불리는 행위를 한다
상대방과 나만 아는 비밀의 키(cipher key, 이하 key라 호칭)를 
암호화 과정 때 그대로 쓸 수가 없으니 특별한 연산을 통해 바꾼다
별건 아니고 4x4 행렬의 한 열의 데이터를 회전하고 치환하고 xor 연산 하면 땡이다 
왜 scheduling이라고 부르냐면 각 round 때마다 사용할 각각의 key들을 미리 쫙~ 계산해놓기 때문인데
속도나 기타 이유로 key를 미리 계산해서 배열에 저장해두는게 싫으면 라운드 돌때 마다 계산을 해도 ok


2. init round
별거 없다 시작하기 전에 add round key를 한 번 돌려주고 시작한다
add round key
행렬(보통 현재의 상태인 state라고 부른다)과 key(보통 round key라고 부르며 1번의 스케쥴링할 때 미리 구해놓은 제품이다)를
xor하면 끝


3. round
aes 128 기준 9번 반복
반복을 많이 하면 암호화 레벨이 올라간다(오! 간단하다)
sub bytes
행렬의 데이터를 SBOX라고 불리는 배열에서 가져와 치환한다
이 데이터들은 복잡한 다항식을 행렬식으로 바꿔서 풀고 뭐하고 한 의미가 있는 값들이다
shift rows
말 그대로 행렬의 행을 shift 시킨다
mix columns
행렬곱 연산을 수행한다
단. aes에서의 행렬연산은 독특한데 단순히 곱셈이 아니라 여러 조건에 따른 계산식이 존재한다
but 모두 미리 계산되어 간편하게 계산된 배열에서 읽어와서 치환을 하면 된다
(물론 직접 계산하도록 작성해도 좋다)


4. final round
mix columns을 안 하는 것을 제외하고 3번과 동일하다



복호화

이 과정 역시 fips 197을 자세히 참조하기 바란다

1. key scheduling

2. init round

add round key

3. round (반복)

inverted shift rows

inverted sub bytes

add round key

inverted mix columns

4. final round

inverted shift rows

inverted sub bytes

add round key



1. 키 스케쥴링

비슷한데 좀 다르다

암호화 할 때랑 동일하게 계산하는데 사용하는 순서는 반대다

암호화 할 때 마지막에 사용한 key == 복호화 할 때 처음 사용하는 key

복호화 할 때 마지막에 사용한 key == 암호화 할 때 처음 사용하는 key

혹시나 해서 적는데 동일한 SBOX를 사용한다


2. init round

동일하게 add round key를 하는데 key scheduling해서 얻은 마지막 키부터 거꾸로 사용한다


3. inverted shift rows

반대로 쉬프트 한다

inverted sub bytes

inverted sbox 에서 가져와 치환한다(inverted sbox라는 배열이 별도로 있다)

add round key

이건 변한거 없다

inverted mix columns

역행렬을 구하는, 즉 행렬곱 연산을 하는건데 연산꺼리가 훨씬 늘어났다

이거도 그냥 미리 계산된 배열에서 찾아서 쓰면 된다


4. final round

마지막에 사용하는 round key 값은 순수한 암호키다

이하 생략



기타 cbc, ecb 등등에 관해
aes 128 암호화를 돌릴 때 데이터를 4x4 즉 128bit로 넣어줘야하는데
세상 살이가 그리 쉽지 않다 데이터 크기가 128bit보다 적을 수도 있고 클 수도 있다
그럴 때 그 데이터를 어떻게 채우거나(padding) 자를 것인가(parsing)에 관한 기법들이다
wikipedia에 알기 쉽게 정리 되어있다

그냥 그림만 보자 똑같은 크기로 나누거나 적당히 채우거나 그런 내용들이다
aes 암호화 해서 나온 결과를 이전 내용과 xor하거나 등등 그런 소리다
aes 알고리즘을 구현한 다음 천천히 구현거나 필요에 의해 구현하지 않아도 ok


최적화

cpu가 aes가속을 지원하면 어셈블리로 짜서 써도 좋고 그게 아니라면

L, E table에서 곱연산 찾아오는 것도 있고 아니면 0xb, 0xd, 0x9, 0xe, 0x2, 0x3 행렬곱 연산을 미리 계산한거 가져다가 쓸 수도 있다

그 외 register 크기인 32bit 씩 가져다가 한 번에 처리하는 방법도 있고

값 swap 할 때 xor로 swap하는 거나 rotate 최적화 등등

자세한건 openssl 소스 중에 crypto/aes/aes_core.c (맞나?)을 참조해서 분석해보면 좋을 것이다

난 머리가 나빠서 이해를 못하겠따 ㅋㅋ



Posted by 쵸코케키



linux device driver 4판이 연기에 연기를 반복하다 드디어 출간하는 듯 하다

Pre-order 가격 56.99 달러

http://www.amazon.com/gp/product/1449371612/ref=pe_11480_166765280_emwa_email_title_1


무려 10년이 넘은 후에 4판이 나오는구나

그런데 문제가 Nov 25, 2016..................

어라? 작년에도 연말에 나온다카지 않았냐? 혹시 또 뻥치는거 아님?

듀크뉴켐포에버 스멜이 풀풀난다

포에버는 출시 했으니 아닌가


이하는 아마존 원문

Having already helped two generations of programmers explore Linux and write devices, the fourth edition of this classic book delves into tty, USB, and HCI devices such as keyboards, in addition to basic character devices. Linux Device Drivers includes numerous full-featured examples that you can compile and run without special hardware.

Written by well-known leaders in Linux development and programming, this book covers significant changes to Version 3.2 of the Linux kernel, the basis of the Precise Pangolin release of Ubuntu. All you need to get started is an understanding of the C programming language and some background in Unix system calls.

  • Learn how to support computer peripherals under the Linux operating system
  • Develop and write software for new hardware that Linux supports
  • Understand the basics of Linux operation, even if you don't expect to write a driver
  • Dive into new chapters on video, audio, wireless, and Bluetooth devices

As the operating system for Android and many embedded systems, Linux constantly needs new device drivers. This book helps you get it done.




Posted by 쵸코케키

Device Drivers -> USB support -> USB Gadget Support -> USB Gadget Drivers -> Ethernet Gadget











Posted by 쵸코케키

비글본 블랙 환경구성하느라 별의 별 미친짓을 다 해봤는데 가장 깔끔한 구성은 

debian + linux-3.14.41-ti-r63 kernel 이 조합이었다


https://github.com/beagleboard/linux/tree/3.14

지금은 리비전이 꽤 올라갔을꺼다


debian은 8.1 jessie 괜찮았다 apt도 계속 업데이트 되고 안정성도 아주 만족스러웠다

http://elinux.org/Beagleboard:BeagleBoneBlack_Debian

위의 url 가면 지속적으로 업뎃해서 릴리즈 한다 ㅎㄷㄷ

지금은 8.2가 나와있다 그런데 다운 받을 때 eMMC 용인지 아니면 마이크로SD용인지 잘 확인해서 받을것

https://rcn-ee.com/rootfs/bb.org/testing

혹은 아래 항목

BeagleBoard-X15 weekly

Bug tracker: http://bugs.elinux.org/projects/beagleboard-x15

Flasher: (lxqt-4gb) (BeagleBoard-X15)

wget https://rcn-ee.com/rootfs/bb.org/testing/2016-01-10/lxqt-4gb/bbx15-eMMC-flasher-debian-8.2-lxqt-4gb-armhf-2016-01-10-4gb.img.xz
sha256sum: 6a8a4ae57c5c7c7b2248c4bc4fb4c4cd4d2a3d4be27ab8b961cf60b1f23c4b9d

microSD/Standalone: (lxqt-4gb) (BeagleBoard-X15)

wget https://rcn-ee.com/rootfs/bb.org/testing/2016-01-10/lxqt-4gb/bbx15-debian-8.2-lxqt-4gb-armhf-2016-01-10-4gb.img.xz
sha256sum: decfdebc9a8ea9d6e5bc39c491fb7cac2ff5076190ebbd43e8247ac94eedb864

주소가 왜 다 깨진다냐




Posted by 쵸코케키

1. android build 환경 구성

ubuntu 14.04 LTS 기준

sudo apt-get install bison g++-multilib git gperf libxml2-utils make python-networkx zlib1g-dev:i386 zip


https://source.android.com/source/initializing.html

자세한 사항은 상단 링크 참조

 

http://thdev.net/498

기타 한국어 참고 페이지

 

https://github.com/beagleboard/linux

http://icculus.org/~hendersa/android/

그대로 따라 진행하면 된다(android 4.4 kikat + 3.8 linux kernel)


왜 3.8을 쓰냐면 3.8 kernel 부터 devicetree가 적용 되어있다

만약에 다른 버전을 쓰고 싶다면 수동으로 devicetree를 적용하고 패치해야하는데 음...ㅋㅋㅋ


old version 참고(linux 3.2 kernel)

https://github.com/csimmonds/bbb-android-device-files/tree/kk4.4-sdcard


안드로이드 말고 일반 linux kernel 경우 링크 참고

https://www.eewiki.net/display/linuxonarm/BeagleBone+Black#BeagleBoneBlack-LinuxKernel


android adb linux kernel config 참고

http://nelenkov.blogspot.kr/2013/07/building-wireless-android-device.html

1. Configure FunctionFS support in the kernel (CONFIG_USB_FUNCTIONFS=y):

Device Drivers -> USB Support -> USB Gadget Support -> USB Gadget Driver -> Function Filesystem


2. Modify the boot parameters in uEnv.txt to set the vendor and product IDs, as well as the device serial number

g_ffs.idVendor=0x18d1g_ffs.idProduct=0x4e26 g_ffs.iSerialNumber=<serial>


3. Setup the FunctionFS directory and mount it in your init.am335xevm.usb.rc file:

on fs

mkdir /dev/usb-ffs 0770 shell shell

mkdir /dev/usb-ffs/adb 0770 shell shell

mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000


4. Delete all lines referencing /sys/class/android_usb/android0/*. (Those nodes are created by the native Android gadget driver and are not available when using FunctionFS.)

아 몰라 이렇게 복잡하게 안하고 그냥 USB Gadget Driver Function FileSystem을 활성화 했다

컴파일 할 때 님이 원하는게 usb gadget driver function fs 맞나요? 라고 몇 번 문의가 왔던거로 기억한다 디폴트 상태 그대로 yes

이 부분을 잘못하면 usb adb 통신이 잘 안되는 골까는 상황이 발생한다

그리고 망할놈의 virtualbox 는 될 때도 있고 안될 때도 있고 그렇다 참 지랄맞아......

슬프지만 host가 linux이길 추천한다



컴파일 시간은 굉장히 오래 걸린다



i5-3570, 4GB ram, hdd기준

repo 통해서 aosp source 가져오는데 1~2시간 가량 걸렸고

aosp kernel build 하는데 5시간 걸렸다(make -j4)

sgx driver 함께 kernel 파일을 통합해서 이미지를 만드는데 2시간 가량 걸린 같다

예전에 xeon 2690 dual을 쓰던 시절이 간절히 그리운 순간이었다 


여기까지 하는데 70GB 하드디스크 용량이 소요되었음

sd card 여러 파티션으로 나누고 dd 카피하는 부분은 용량을 어떻게 바꿀지 모르겠다




2. devicetree

참고 링크들

http://processors.wiki.ti.com/index.php/AM335x_Android_Device_Tree_Integration

http://elinux.org/BeagleBone_and_the_3.8_Kernel

http://slowbootkernelhacks.blogspot.kr/2014/03/beaglebone-linux-kernel310x-programming.html

http://www.devicetree.org/Device_Tree_Usage


컴파일 이전에 사실 devicetree를 구현하는게 맞지만 컴파일 후에 해도 괜찮다

make dtbs 해주면 dtb가 이쁘게 바로 만들어지니까


arch/arm/boot/dts/am335x-boneblack.dts

에 적당한 dtsi 파일을 만들어서 include 했다

그런데 말이다 분명 3.14 kernel 에서는 #include 가 먹혔는데 3.8에서는 / include / "spidev-bbb.dtsi" 이런식으로 써야했다


dtsi 파일 내용은 별거 없다 spidev 참고해서 만든거다


gpio는 갠적으로 필요해서 넣은거니 ocp랑 gpio는 빼도 상관없다

나중에 device driver에서 spi register 할 때 compatible 쪽에 bbbspidev를 맞춰주면 ok


dtbs 컴파일은 빠르게 끝난다

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs

아마 am335x-boneblack.dtb 파일만 부트 디렉토리와 교체해서 리붓하면 ok


dtc로 직접 컴파일 하면 일부 내역이 제외되는거 같다 make했을 때랑 다른 blob이 만들어진다(dtc 1.4.0)



dtb가 제대로 만들어졌나 궁금할 경우 

dtc -I dtb am335x-boneblack.dtb -O dts -o export.dts

옵션중 -I(대문자 i 다, 망할 font)

위 명령어 구문을 사용해서 dtb를 dts로 변환해서 정확히 잘 정의되었는지 확인하기 바란다



3. 확인

/sys/devices/ocp.3/48030000.spi/spi_master/spi1/spi1.0/modalias

cat으로 확인해본다 

spi:bbbspidev로 들어갔는지 


만약 확인이 되었다면 devicetree가 정확히 일단 등록이 되었다고 볼 수 있으므로 하드웨어 테스트를 한다

spi d0와 d1을 전선으로 직접 1:1 연결

그리고 간단한 통신을 했을 때 tx로 보낸 command가 그대로 rx로 찍혀 나오면 ok

만약 뭔가 실패하면 음...devicetree 다시 확인해봐야지 뭐


'devel > etc' 카테고리의 다른 글

usb otg kernel config(linux usb over ethernet)  (0) 2016.01.27
beaglebone black linux kernel 환경 구성 추천  (0) 2016.01.18
intel software academic program  (0) 2015.12.10
minimal linux live  (0) 2015.12.10
git  (0) 2015.09.11
Posted by 쵸코케키

http://www.intel-software-academic-program.com/pages/courses


참고바람

'devel > etc' 카테고리의 다른 글

beaglebone black linux kernel 환경 구성 추천  (0) 2016.01.18
beaglebone black spi driver 개발  (0) 2016.01.15
minimal linux live  (0) 2015.12.10
git  (0) 2015.09.11
vim toggle  (0) 2015.08.27
Posted by 쵸코케키

2015. 12. 10. 09:09 devel/etc

minimal linux live

http://minimal.linux-bg.org/


혹시 나중에 필요할지도 모르므로 ㅎㅎ

'devel > etc' 카테고리의 다른 글

beaglebone black spi driver 개발  (0) 2016.01.15
intel software academic program  (0) 2015.12.10
git  (0) 2015.09.11
vim toggle  (0) 2015.08.27
크로스컴파일 실행 no such file or directory 문제해결  (0) 2015.06.29
Posted by 쵸코케키

2015. 9. 11. 12:07 devel/etc

git

git

kernel source?
#1. source download
git clone git://어쩌고저쩌고.git
예시
git clone git://github.com/gumstix/linux.git

혹은 아예 처음부터 이렇게 branch를 명시해도 ok

git clone git://github.com/gumstix/linux.git -b omap-3.5


#2. check branch list
git branch -r

#3. checkout branch(머랄까 다운받은 마스터 소스에 원하는 브랜치로 패치하는 느낌)
git checkout origin/원하는 브랜치 이름

#4. 기타 git으로 source를 export하고 싶을 때(svn의 export)
소스 클론 받은 디렉토리 들어가서
git checkout-index -a -f --prefix=/export 하고 싶은 경로/

#5. 그 외
원격 저장소를 생성하고 싶을 경우(svnadmin create repository name 비슷)
-a. git 서비스가 제공할 repository 디렉토리를 설정
    까먹음... 어떻게 했더라
    예시 :
    mkdir /GIT_REPO

-b. repository 디렉토리 이쁜거 하나 만듬
    mkdir /GIT_REPO/repo_sample

-c. 디렉토리 들어가서 git init --bare
    cd /GIT_REPO/repo_sample
    git init --bare

-d. ~끝~


아 배고파
 


git server의 ip가 바뀌거나 ip는 그대로이나 mac이 바뀌었을 경우

git remote set-url origin 아이디@아이피주소_혹은_url:/repository_directory


참고

http://stackoverflow.com/questions/7318918/fatal-does-not-appear-to-be-a-git-repository

'devel > etc' 카테고리의 다른 글

intel software academic program  (0) 2015.12.10
minimal linux live  (0) 2015.12.10
vim toggle  (0) 2015.08.27
크로스컴파일 실행 no such file or directory 문제해결  (0) 2015.06.29
virtual box의 가장 짜증나는점  (0) 2015.05.17
Posted by 쵸코케키

2015. 8. 27. 09:25 devel/etc

vim toggle

function! ToggleBackground()
    if (w:solarized_style=="dark")
    let w:solarized_style="light"
    colorscheme solarized
else
    let w:solarized_style="dark"
    colorscheme solarized
endif
endfunction
command! Togbg call ToggleBackground()
nnoremap <F5> :call ToggleBackground()<CR>
inoremap <F5> <ESC>:call ToggleBackground()<CR>a
vnoremap <F5> <ESC>:call ToggleBackground()<CR>


출처 https://github.com/vim-scripts/Solarized


'devel > etc' 카테고리의 다른 글

minimal linux live  (0) 2015.12.10
git  (0) 2015.09.11
크로스컴파일 실행 no such file or directory 문제해결  (0) 2015.06.29
virtual box의 가장 짜증나는점  (0) 2015.05.17
centos 7 vs ubuntu server 14.04.2 LTS  (0) 2015.03.22
Posted by 쵸코케키
해결 방법을 몰라서 컴파일 할 때 -static 옵션을 넣는 바보짓을 했었는데

근본적인 해결을 하고자 이거저거 해보니 의외로 쉽게 해결 되었다



file 실행파일


하면 그 파일의 ELF정보 및 공유 라이브러리 쓰는거 정보도 나온다

위의 파일은 /lib/ld-linux.so.3 을 쓴다고 나와있네


없다

ld-linux.so.3 이 없다 그런데 비슷한 ld-linux-armhf.so.3은 있다

armhf는 arm cpu 타입을 의미한다


심볼링 링크로 연결하자

그러하다



이제 a.out이 실행이 잘 된다~ :)

만약 다른 라이브러리가 링크 되어있다면 위와 같은 방법을 사용하면 될 것이다

'devel > etc' 카테고리의 다른 글

git  (0) 2015.09.11
vim toggle  (0) 2015.08.27
virtual box의 가장 짜증나는점  (0) 2015.05.17
centos 7 vs ubuntu server 14.04.2 LTS  (0) 2015.03.22
vim + trinity 활용할 때 cscope file does not exist 오류 해결  (2) 2014.08.19
Posted by 쵸코케키
이전버튼 1 2 3 4 5 6 7 이전버튼

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.5
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

최근에 올라온 글

최근에 달린 댓글

글 보관함