본문 바로가기

보안 연구/Side_Channel_Attack

[ChipWhisperer tutorial] Intro Tutorial(3). Measuring SNR of Target

이번 tutorial은 Target의 SNR을 측정하는 방법에 대해 설명한다. tutorial을 통한 분석 전에 SNR에 대해 알아보자.

 

0.1 Signal to Noise Ratio(SNR)

In general, the "Signal to Noise Ratio" is defined as:

 

𝑆𝑁𝑅=𝑉𝑎𝑟(𝑆𝑖𝑔𝑛𝑎𝑙)𝑉𝑎𝑟(𝑁𝑜𝑖𝑠𝑒)SNR=Var(Signal)Var(Noise) - 식(1)

 

This is to say the variance in the signal measured compared to the variance in the noise measured. You will often see SNR expressed in dB, which is a logarithmic scale. In which case the conversion is simply done as:

 

𝑆𝑁𝑅𝑑𝐵=20𝑙𝑜𝑔(𝑆𝑁𝑅)SNRdB=20log(SNR) - 식(2)

 

Note this assumes our measurements were voltages -- the 20 infront of the log is done to represent the fact that SNR is typically referencing the power difference between signal and noise. The power across a resistor would be equal to the square of the voltage, so we should actually have:

 

𝑆𝑁𝑅𝑑𝐵=10𝑙𝑜𝑔((𝑉𝑎𝑟(𝑆𝑖𝑔𝑛𝑎𝑙)𝑉𝑎𝑟(𝑁𝑜𝑖𝑠𝑒))^2)=20𝑙𝑜𝑔(𝑉𝑎𝑟(𝑆𝑖𝑔𝑛𝑎𝑙)𝑉𝑎𝑟(𝑁𝑜𝑖𝑠𝑒)) - 식(3)

 

(tutorial에서 인용한)위의 내용에서 살펴 볼 수 있듯이, SNR은 식(1)처럼 측정 된 Noise의 분산과 측정된 Signal의 분산의 비교를 통해 나타낸다. 또한 식(2)는 SNR의 db단위 변환에 대한 식을 설명하는 것으로 단위를 어떻게 사용할지에 따라 사용여부가 결정되는데, 이러한 식(2)의 유도과정을 식(3)을 통해 설명하였다.

 

여기서 식(3)이 변환되는 과정에 대한 설명을 이해하기 위해서는 전력과 전압의 차이에 대해 이해 해야한다. 그래서 다음과 같이 정리해보았다.

 

0.2 전압과 전류의 차이를 이용한 db 단위 변환 정리

전압을 E[V], 전류를 I[A], 저항을 R[Ω], 전력을 P[W]라 하자. 이때, 옴의 법칙에 의해 전압/전류/저항은 다음과 같은 관계를 가진다.

 

E = I * R -식(4)

 

이때, 전력 P는 전압과 전류의 곱으로 정의 되므로,

 

P[W]=E*I=E*(E/R)=(E*E)/R=(E^2)/R -식(5)

 

이다. db의 값은 절대 값이 아니라 상대 값이므로, 어떤 기준이 되는 값에 비해 얼마나 크냐 또는 작으냐를 나타낸다. 이때, Pr을 기준이 되는 전력, Pa을 표현하고자 하는 전력이라고 하자.

 

[dB]=10*log(Pa/Pr) -식(6)

 

여기서 식(6)은 과정에 대해 유도된 식이 아니라 db 자체에 대한 정의이다. 이때, 만약 Pa>Pr 이면 (+) 값, Pa<Pr 이면 (-)값이고, Pa=Pr 인 경우 0dB가 된다. (∵ log(1)=0)

 

이제 식 (6)에 식(5)를 적용해보자. 그러면,

[dB]=10*log(Pa/Pr)

=10*log{(Ea^2/R)/(Er^2/R)}     (이때, Pa=Ea/R, Pr=Er/R, 동일 저항 R)

=10*log{(Ea/Er)^2}

=20*log(Ea/Er) -식(7) (∵ log(x^2)=2*log(x))

 

결론적으로, 우리가 측정하는 값은 위의 tutorial 인용문에 따라 전압 측정치 가정하므로, 전압 측정지를 계산하기 위해서는 식(3)을 통해 SNR을 계산해준다.

 

0.3 What's the Signal?

The above was very easy to write out. But what is the signal, and what is the noise? The signal is going to be the leakage we measured based on some leakage function, and the noise will be the noise inherent in the measurement not caused by the leakage.

The easiest way to do this will be to find the average trace for each leakage "group". If using the Hamming weight leakage model, this means we have 9 traces (one for each HW). If we used classic DPA we would have two groups (one for each bit).

Within each group, we can measure the noise. We don't actually measure across all groups since then we would have the leakage contributing to our "noise". We want to get a measure of only the noise, not variance being caused by the signal.

 

여기서는 signal과 noise에 대한 설명을 언급한다. 위의 내용을 참고해서 정리하면, signal은 leakage가 발생하는 function에 의한 leakage이고, noise는 leakage가 아닌 측정에 inherent한 noise를 말한다. 즉, target의 전력을 분석하는 과정에서 signal과 noise가 섞여있는데, 이를 제대로 구별 해야한다. 이러한 방법으로 여기서는 Hamming weight leakage modelDPA를 언급하고 있다.

 

여기서 Hamming weigth와 Hamming distance에 대한 간단한 이해를 해보자.

 

Hamming distance는 같은 비트 수를 갖는 2진 부호 사이에 대응되는 비트값이 일치하지 않는 개수를 말한다. 이때, 일반적으로 해밍거리 d d≥2a+1이면 a개의 오류를 정정할 수 있다. 예를 들면 A와 B의 비트열이 A:101011, B:110010 이라고 할때, A와 B의 해밍 거리는 3이다. 왜냐하면 A와 B의 2번째, 3번째, 6번째의 부호가 일치하지 않기 때문이다.

 

Hamming weight는 기호열에 포함되는 0이 아닌 기호의 개수이다. 어떤 기호열의 해밍 웨이트는 이 기호열과 0만으로 되어 있는 같은 길이의 기호열 및 해밍 거리와 같다. 예를 들면 아까와 같이 A와 B의 비트열이 A:101011, B:110010 이라고 할때, A의 해밍 무게는 4, B는 3이 된다.

 

이러한 Hamming distance와 weight는 오류를 검출 하고 오류를 정정하는 방법에 대해 연관이 있다.  자세한 사항은 필자가 참고한 다음 링크들을 통해 자세히 알 수 있다.

 

http://www.ktword.co.kr/abbr_view.php?nav=2&m_temp1=4780&id=115

 

오류 검출 능력 [정보통신기술용어해설]

1. 해밍최소거리, 해밍구, 복호화 가능 구 ㅇ 해밍 최소거리(Hamming Minimum Distance) dmin - 서로 다른 두 부호어 간의 해밍거리 중에서 가장 작은 거리 . 오류를 검출하거나 정정할 수 있는 능력과 직접 관련됨 ㅇ 해밍구 (Hamming Sphere) - 수신 부호어로부터 발생가능 오류개수 t 보다 작은 해밍거리를 갖는 구 ㅇ 복호화 가능 구/복호 영역 (Decoding Sphere) - 해밍구들이 서로 겹치지 않게 전체 부호어

www.ktword.co.kr

또한, DPA(diffential power analysis)는 전력 분석중 하나이며, 암호학에서는 암호 하드웨어의 전력 소비량을 분석하여 암호키와 기타 기밀정보를 장치로부터 추출하는 방법으로 사용하고있다. DPA는 단순 전력 분석 SPA(simple power analysis)의 진보된 형태의 전력 분석으로, 공격자가 여러 암호화 작업으로부터 수집된 데이터 통계 분석을 통해 암호화 연산내의 중간값을 계산할 수 있도록 하는 것이다. 좀 더 자세한 사항이 궁금하다면 필자가 참고한 다음 링크를 참고하길 바란다.

 

https://ko.wikipedia.org/wiki/%EC%A0%84%EB%A0%A5_%EB%B6%84%EC%84%9D

 

전력 분석 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 차분 전력 분석 공격 다이어그램. 전력 분석을 사용한 RSA 키 비트 관찰. 암호학에서 전력 분석(power analysis)은 부채널 공격의 일종으로, 공격자가 암호 하드웨어 장치(예: 스마트카드, 템퍼 저항 블랙박스, 집적 회로)의 전력 소비량을 연구한다. 이 공격은 비침습적으로 암호키와 기타 기밀 정보를 장치로부터 추출한다. 단순 전력 분석(simple power analysis, SPA)은 시각적으로 해석하는 전력

ko.wikipedia.org

따라서, 우리는 noise값을 측정하기 위해서 Hamming weigth leakage model을 기반하여 9개의 trace를 group화 하여 group화 시킨 신호에 대해 평균 추적을 한다. SNR을 계산하는 알고리즘과 code는 해당 tutorial에서 제공을 한다.

 

1. Capturing Power Traces

Capturing을 하는 부분은 전 tutorial과 동일하기 때문에, parameter, bash block과 Helper_script을 사용하는 set up 부분은 간단하게 언급하고, Capturing Trace하는 부분부터 시작한다. 

 

1.1 Setup

[Figure.1] Parameter block

 

[Figure.2] Setup

1.2 Capturing Traces

Below you can see the capture loop. The main body of the loop loads some new plaintext, arms the scope, sends the key and plaintext, then finally records and appends our new trace to the traces[] list. At the end, we convert the trace data to numpy arrays, since that's what we'll be using for analysis.

 

아래의 코드를 분석해보자. 원문에서 보듯이, loop의 mian body에서는 새로운 plaintext를 load하고, scope를 arms하고 key와 plaintext를 send하는 일을 수행한다. 그리고나서 마지막으로, traces[] list에 새로운 trace를 기록하고 추가한다.

이때, 몇가지 코드를 추가적으로 살펴보자. N=1000으로 초기화하는 코드를 사용함으로써 기본적으로 trace의 수는 1000개의 수를 갖도록 하고, platform의 prameter값인 경우는 1500개를 갖도록 처리하였다. 그리고 loop에서 for문안에 있는 if문을 통해 trace가 none일 경우 예외처리를 해주고, N만큼 trace를 traces의 numpy array에 추가되도록 loop를 수행하도록 구현되었다.

 

그러면 numpy array는 무엇일까? numpy는 과학 계산을 위한 라이브러리이다. 이 때 다차원 배열을 처리하는데 필요한 여러 유용한 기능을 제공하고 있고, 이러한 라이브러리를 사용하기 위해서 import numpy를 통해 import 해준다. numpy 라이브러리를 통해 numpy array를 사용할 수 있다. numpy array은 동일한 타입의 values를 가지며, 배열의 차원을 rank 라 하고, 각 차원의 크기를 튜플로 표시하는 것을 shape 라 한다. 예를 들어, 행이 2이고 열이 3인 2차원 배열에서 rank는 2 이고, shape는 (2, 3) 이 된다. numpy의 구현방법과 자세한 설명은 필자가 참고한 아래 링크를 통해 확인하기 바란다.

https://eunguru.tistory.com/208 

 

[Numpy] numpy 배열, 배열 생성 함수

1_numpy.md Numpy 배열, 배열 생성 함수 1. Numpy 과학계산을 위한 라이브러리로 다차원 배열을 처리하는데 필요한 여러 기능을 제공 Numpy를 사용하기 위해 import 함 import numpy as np 2. Numpy 배열 Numpy에..

eunguru.tistory.com

여기서는 이러한 traces를 numpy array로 변환하여 분석에 사용한다.

 

[Figure.3] Caputre traces

이렇게 변환된 값들을 전과 같이 그래프로 나타내준다. (그래프 나타내는 방법은 전 게시물을 참고)

 

{Figure.4] Using 'bokeh'
[Figure.5] Graph1

그리고 target과 scope의 대한 연결을 clean up하는 code이다. tutorial에 설명이 없지만, clean up 이라는 의미를 보았을 때, target과 scope에 대한 연결을 정리해주는, 그런 역할을 하는 함수 인듯 하다. script를 통해 추후에 분석을 해보겠다.

 

[Figure.6] Clean up the connection to the target and scope

 

2. SNR Calculation

The first thing we'll do is spread the traces into the "groups". Remembering the examples of plotting Hamming Weight, we went over how the leakage model is used. All we need to do here is perform the same sort of operation, except we'll take the mean of each group as well. The following will end up making an array, hwmean[] that contains a mean for HW=0, HW=1, etc.:

 

아래의 코드는 SNR을 분석하는 code이다. 해당 code에서는 위 원문에서 언급하였듯이, 첫번째로 traces를 group으로 spread한다. 가장 처음 code는 sbox를 만드는데,

 

여기서 S-Box란, 대칭키 알고리즘 중 하나인 AES 알고리즘에서 주로 사용한다. 이때 Box는 16x16의 matrix이며, 행과 열의 범위는 0~15(0x0~0xf)이다. 이떄, S-Box의 각 바이트는 GF (28)의 곱셈 역으로 매핑되며 00은 그 자체로 매핑된다. 

 

그리고, HW = [bin(n).count("1") for n in range(0, 256)] 코드를 이용해서 (HW = Hamming weight)

 

n을 2진수로 바꾼후(bin) 그 중에 1을 count한 결과값을 0부터 255까지 (총 256개) 리스트에 초기화한다는 내용이다. 이러한 과정을 통해 각 수의 HW값을 얻을 수 있다. 그리고 intermediate 함수를 정의한다. intermediate 함수는 s-box를 통해 plain text와 key값을 XOR연산 해주는 역할을 한다.

 

이어서, SNR of byte를 0으로 초기화하고, one trace의 length를 npoints에 저장한다. hwarray는 2차원 array로 hw를 저장하는 array이다.

 

그리고 다음 for문을 통해서 multiple groups으로 split하는 작업을 수행한다. 0부터 앞에서의 traces의 길이만큼 수행한다. 이때, for문의 변수인 tnum값을 각 traces의 index로 넣어주고, 그때의 index에 해당하는 trace 객체에 접근하는데, 각 byte의 SNR인 bnum값을 index로 하여 textin 배열과 key 배열에 접근한다.

( 위의 code를 통해 trace가 오른쪽과 같다는 것을 알 수 있다. trace = cw.capture_trace(scope, target, text, key) )

 

그래서 각 trace는 text와 key값을 intermediate하여(S-box로 인한 변환) 그값을 index로 한 HW의 값을 hw_of byte 값에 allocate 한다. trace의 text는 key값을 통해 intermediate 되었기 때문에 16진수의 두자리 수를 가질 것이고, 그러한 수는 특정 HW의 byte값을 가지기 때문에 이러한 과정을 수행하는 것이다.

 

hwarray[hw_of_byte].append(traces[tnum].wave) 코드를 통해서 2차원 배열의 각 인덱스(각 hw_of byte) 마다 trace(tnum.wave)를 append하는데, 이 과정을 통해 같은 hw_of_byte를 가지는 trace들 끼리 group화되어 분리된다.

 

다음으로 hwmean 이라는 array를 [Figure.3]에서 import했던 numpy의 zeros를 사용하여 만들어준다.

np.zeros((9, npoints)) 는 9개의 행과 npoints의 갯수의 열을 가진 배열을 나타내며, 모든 값은 0으로 초기화 되어있다.

 

그리고 for문을 통해서,

hwmean[i] = np.mean(hwarray[i], axis = 0) 를 반복해서 수행해준다.

위 코드는 앞에서 구했던 2차원 array인 hwarray의 i번째 index의 열의 mean(평균) 값을 구해준다.

그리고 그 값을 hwmean의 i번째 index에 저장할 것이다. 여기서 axis = 0은 x축간의 평균을 구한다는 기준을 나타내는 값이다. 행간의 평균을 구하면 총 9개(열의 갯수)의 평균값이 나올것이고, 각각의 평균값은 hwmean의 i번째 index에 저장을 해준다.

(np.mean()의 사용법과 axis의 개념은 아래의 링크들을 참고하였다.)

http://taewan.kim/post/numpy_sum_axis/

https://doorbw.tistory.com/171

 

numpy(넘파이) 기초 정리

Numpy_clear 안녕하세요. 문범우입니다. 이번 포스팅에서는 python을 통해 데이터 분석을 할때 기초 라이브러리로 사용되는 Numpy에 대해서 알아보도록 하겠습니다. 해당 내용은 flearning의 김길호님의 강의를..

doorbw.tistory.com

 

Numpy에서 np.sum 함수의 axis 이해

Numpy의 sum은 유용한 함수입니다. 그러나 처음 sum 함수를 사용할 때 axis 파라미터가 무엇을 의미하는지 혼동되는 것이 사살입니다. axis의 의미를 정리합니다.

taewan.kim

[Figure.7] SNR calculation

 

 

We could plot those figures, and see the same sort of information from the HW plot lab too. We've done this a slightly different way, so you might find it even easier to see the difference here.

 

이제 hwmean을 통해 hv.curve() 함수를 이용하여 HW별로 그룹화 해준 values들을 plot 해준다. [Figure.8]의 code를 통해 이와같은 plot하는 code를 제공해주며, 그 결과 [Figure.9]의 결과가 산출된다.

 

[Figure.8] code for plotting by groub
[Figure.9] plot for using curve by group

 

An important thing to note - the number of traces in each group will not be uniform! This is because many values have a HW of 4 (11110000, 10101010, etc) but only one option has a HW of 0 or 8

 

한가지 짚고 넘어가야할 점은 각 group별 trace의 갯수가 uniform 하지 않다는 것이다. 이를 [Figure.10]의 code를 통해 각 hwarray에 할당되어 있는 treace의 갯수를 출력하여 확인할 수 있다.

 

[Figure.10] code about the number of traces in each group

 

That last point is important, as we're going to use only one group for now to calculate the noise. Here I've selected hwarray[4] for example. We don't want to calculate across the entire trace set as it will include the signal variance (hint - you can test this by changing the variance calculation to be done over the traces variable).

We also need to REMOVE any groups with zero traces. They will ruin our variance calculation (since there is no data to calculate variance over). This can also be done by simply adding traces to the capture side too.

 

위의 설명은 noise를 계산하기 위해 HW4를 사용한다는 내용이다. (HW4가 trace의 수가 가장 많기 때문에) 이는 전체 set을 계산하면 signal variance가 포함되므로 hwarray[4]를 선택하여 계산한다. 또한 trace가 0인 group은 remove 해준다. 이러한 그룹들은 계산을 방해하기 때문이다. 아래 [Figure.11]은 설명에 대한 과정을 진행하는 code이다.

 

[Figure.11] select HW4 and remove zero trace

새로운 inc_list = [] 를 만들어주고, 첫번째 for문을 통해서 zero traces를 제거해준다. zero trace가 제거된 hwarray는

inc_list에 저장될 것이다. 그러면 앞선 [Figure.7]에서 만든 hwmean을 zero trace를 제거한 hwmean으로 만들어 준다. 그것이 바로 hwmean_valid가 될것이다. 이제 이 hwmean을 이용해서 signal variance를 구해주고, 앞에서 select한 hwarray[4]로 noise variance를 구해준다. 그리고 이 두값을 통해서 snr 값을 측정한다. (SNR은 신호 대 잡음비로 그 값이 커질수록 잡음의 영향이 적다는 의미를 갖는다.)

 

이렇게 측정된 snr값은 [Figure.11]의 두번째 block에서 처리된다. 식(2)를 통해서 20*log(snr)을 취해준다. 그 결과 아래 [Figure.12]와 같이 plotting 되는 것을 확인하였다.

 

[Figure.12] SNR plotting

 

3. Automated SNR Poltting

Luckily, you can do this SNR plotting pretty easily. The following code shows off the ChipWhisperer function for doing so, based on a leakage model (same one as used by CPA attack).

 

위의 설명처럼 ChipWhisperer는 Automated SNR Poltting을 제공한다고 한다. 아래의 [Figure.13]은 leakage model (CPA attack 동일)을 기반으로한 ChipWhisperer function이다.

 

[Figure.13] The ChipWhisperer function based on leakage model
[Figure.14] SNR plotting using Chipwhisperer function based on leakage model

 

아래의 [Figure.15], [Figure.16] project file의 사용의 예를 보여준다.

 

[Figure.15] project file example(1)
[Figure.16] project file example(2)

 

모두 동일한 결과값이 잘 출력이 되었다. 이상으로 Measuring SNR of target에 대한 실습을 마친다.

 

이 게시글은 NewAE technology사에서 제공하는 ChipWhisperer의 tutorial 오픈소스(Open Source) 기반으로 작성하였으며, 
게시물에 해당하는 내용에 관한 정보는 다음과 같은 출처를 통해서 확인할 수 있습니다.
출처1 : https://chipwhisperer.readthedocs.io/en/latest/ 
출처2 : https://wiki.newae.com/Main_Page 
출처3 : https://github.com/newaetech/chipwhisperer