IBM Q Experience를 시작해 봅시다.

신소영(Sophy)
15 min readJul 20, 2020

무작정 양자암호통신 시작하기 — BB84

IBM의 Q Experience가 런칭한지 벌써 4년. 계정을 만들고, 튜토리얼을 돌리는 좋은 글들은 이미 IBM에서 제작해 두었습니다. 절대 그것부터 쓰기 싫어서가 아니구요.. ㅋ

from https://fimg2.pann.com/new/download.jsp?FileID=28595807

우선 IBM Korea의 맹윤호님께서 작성하신

IBM Korea의 이승연님께서 작성하신

를 참고하시면 기본적인 계정 생성과 간단한 회로 작성에 대해 살펴보실수 있습니다.

그래서 저는 바로! 챌린지의 문제들로 들어가도록 하겠습니다 :)

올해 챌린지는 총 네개의 문제가 출제되었습니다. 1번과 4번은 양자역학에 대한 약간의 지식을 요구했고 2번과 3번은 파이썬 코딩이 다소 요구되었습니다.

현재는 챌린지 사이트는 닫혔고 문제와 정답이 아래의 깃헙에 저장되어 있습니다.

그중 하이라이트는 단연 3번과 4번이었는데 이중 3번 문제인 양자 암호문제를 바로 풀어보도록 하겠습니다. 4번은.. 뭐랄까. 모두를 혼돈에 빠뜨린 문제였는데.. 우선 이후의 양자 역학 기본 강의가 끝난후 천천히 다뤄보도록 하겠습니다.

연습 3: 양자 암호

3번째 문제는 1984년에 유명한 IBM의 연구자인 Charles Bennett과 Gilles Brassard에 의해 개발된 BB84 양자 암호 프로토콜에 대한 것입니다. 이 아이디어는 5년 후 Bennet 과 역시 IBM 연구원인 John Smolin에 의해 실제로 실현되었지요.

이 전설적인 Charles와 John은 지금도 IBM Quantum 팀에 속해있습니다.

BB84 프로토콜은 “앨리스"와 “밥" 사이의 비밀 메시지를 각자 암호화 하고 해독하는데 사용됩니다. 이 연습에서는 암호화된 메시지를 해독하는 단계들을 실습해 볼 것입니다. 우선 그전에 BB84 프로토콜이 어떤 것인지 잠시 원리를 살펴보도록 하죠. 최대한 쉽게 설명해보겠습니다.

BB84 protocol

BB84 양자 암호 통신의 단계를 따라가 보겠습니다.

암호 키를 만들기 위한 준비

  1. 앨리스는 0과 1로 구성된 n비트의 문자열 k1과 0과 1로 랜덤(양자 난수 발생 알고리즘을 사용)하게 구성된 n 비트의 문자열 b1을 생성합니다. k는 암호키를 생성하는 과정에서 사용할 문자열이고 b는 베이스 문자열입니다. 앨리스와 밥은 각각 k, b, 𝑘̃, 𝑏̃를 사용해서 암호화 통신에 사용할 “키"를 만드는 작업을 진행합니다.

키를 만드는 작업 — 앨리스 파트

  1. 앨리스는 b의 i번째 값에 따라 k의 i번째 값을 양자적으로 암호화 합니다. 아직 정신줄 놓으시면 안됩니다! BB84에서 암호화는 편광의 원리로 진행됩니다. BB84통신은 양자 통신, 즉 광자로 통신하기 위한 프로토콜이고 광자는 빛의 파동성때문에 파동의 성질을 갖습니다. 즉 우리가 어디선가 들어본 편광렌즈의 편광. 여기저기 사방으로 빛이 퍼지는 방향을 한가지 방향으로 고정하는 것으로 이해하시면 조금 쉽습니다.
  2. 그럼 양자적으로 어떻게 신호를 “편광” 시킬까요? 그것은 바로 “게이트"를 적용하는 것으로 구현합니다. 위에 링크해둔 기본 회로 작성 예제들을 보시면 “회로" 라던가 “게이트"라는 이름이 거론되는데, 여기서 회로는 양자로 구성된 시스템을 뜻하고 게이트는 그 시스템에서 양자에 적용하는 어떤 행동을 뜻합니다.
  3. 앨리스의 1차 암호화 하는 원리는 아래의그림과 같습니다.

신호의 암호화에는 총 네가지 편광 |0⟩,|1⟩,|+⟩,|-⟩이 사용됩니다. 이 중 |0⟩,|1⟩은 수직, 수평 편광의 종류인데 광자를 이렇게 수직, 수평으로 편광시키는 방식을 “ㄱ-방식"이라 부릅니다. |+⟩,|-⟩은 광자를 45도 -45도로 편광시키는 것을 “ㅅ-방식" 이라 부릅니다.

양자세상의 편광에 대한 좋은 칼럼이 있어서 함께 첨부합니다. 글을 쓰신 분은 고등과학원의 김재완 교수님이시고 지금 우리나라의 양자컴퓨터 발전을 위해 많은 노력을 기울이고 계신 석학이십니다. (9월쯔음 한국의 양자컴퓨터 연구자 몇 분을 인터뷰해서 블로그에 두세개 인터뷰글을 실어볼까 계획중입니다 ^^ 기대해주세요. 인터뷰할때 물어보고 싶으신것이 있다면 댓글 달아주세요)

4. 다시 앨리스의 1차 암호화로 돌아오겠습니다.

앨리스의 i번째 b의 값이 0이면 앨리스는 i번째 k값에 따라 광자를 ㄱ-방식으로 편광시키는데 k의 값이 0이면 0의 상태(수평), 1이면 1의 상태(수직)으로 편광시킵니다.

앨리스의 i번째 b의 값이 1이면 앨리스는 i번째 k값에 따라 광자를 ㅅ-방식으로 편광시키는데 k의 값이 0이면 +의 상태 (-45도), 1이면 -의 상태(-45도)로 편광시킵니다.

5. 앨리스는 1부터 n번까지의 b신호와 k신호를 사용해서 n개의 큐빗을 만들어 양자 전송합니다(q). 이제 밥은 총 n개의 편광된 큐빗을 전달 받게 되겠네요.

키를 만드는 작업 — 밥의 파트

1.밥은 큐빗을 받기 전 앨리스의 큐빗을 측정하기 위한 베이스 문자열 𝑏̃를 만들어 냅니다. 방식은 앨리스와 같습니다. 0과 1로 구성된 n비트의 양자 난수 발생함수를 사용해 만듭니다.

2. 만약 밥의 i번째 𝑏̃가 0이면 밥은 전송받은 큐빗에 “ㄱ-방식" 편광 측정을 진행합니다. 반대로 𝑏̃가 1이면 “ㅅ-방식"의 편광 측정을 실행합니다.

이때 전송받은 큐빗의 편광 방식과 밥이 적용한 편광 방식이 같다면 전달받은 큐빗의 편광상태 그대로를 측정값으로 기록합니다. 만약 받은 포톤의 편광방식과 밥이 적용한 편광 측정의 방식이 다르면 측정 결과는 “ㄱ-방식"의 경우 0이 되고 “ㅅ-방식"의 경우 +가 됩니다. 이 측정을 통해 밥은 베이스 문자열과 같은 방식의 측정된 편광의 값을 임시로 저장하게 됩니다(q ̃)

3. 이제 밥은 측정된 편광의 값(q ̃)과 밥의 베이스 문자열의 편광의 값을 비교합니다.

만약 밥의 베이스 문자열의 값이 0이고 q ̃의 값이 0이면 0을, 1이면 1을 기록합니다. 만약 밥의 베이스 문자열의 값이 1이고 q ̃의 값이 +이면 0을 -이면 1을 i번째 𝑘 ̃문자열에 차곡차곡 저장합니다.

키를 만드는 작업 — 공통 파트

이제 밥과 앨리스는 Public 채널을 통해서 각자의 베이스 문자열을 주고 받아 암호 해독을 위한 키를 생성합니다.

작업은 각각 진행되지만 결과적으로 생성되는 키는 양쪽 모두 동일합니다.

만약 i번째 b와 𝑏̃가 같다면 그때의 k값만을 남겨서 순서대로 저장합니다. 밥과 앨리스의 베이스 문자열은 50%의 확률로 0 아니면 1의 값을 갖게 되므로 확률 적으로 암호 해독을 위한 키는 총 베이스 문자열 길이의 절반이 되겠네요.

다소 복잡하다면 아래의 예를 살펴봅시다.

BB84 통신 키 생성 예제

앨리스는 k=0111001을 암호화 하고 싶습니다. 그래서 베이스 문자열을 생성시켰는데 그 값은 1101000과 같습니다. 따라서 앨리스는 규칙에따라 |+⟩|-⟩|1⟩|-⟩|0⟩|0⟩|1⟩의 큐빗을 준비해서 밥에게 양자채널로 전송합니다. 밥의 베이스 문자열은 𝑏̃ = 1001101로 규칙에 따라 |+⟩|0⟩|1⟩|-⟩|+⟩|0⟩|+⟩의 큐빗을 측정했습니다. 측정된 큐빗의 편광 값과 𝑏̃의 값을 비교하여 밥은 측정 𝑘̃=0011000을 얻습니다. 밥과 앨리스는 퍼블릭 채널로 각자의 베이스 문자열을 교환하여 키를 생성합니다. 이 경우 키는 앨리스와 밥 모두 0110 입니다.

메시지 암호화 및 복호화

비밀키가 생성된 후 앨리스는 one-time pad로 불리는 방식으로 전달하고자 하는 메시지와 비밀키를 조합하여 밥에게 전달합니다.

메시지 암호화

만약 앨리스의 키가 0110이고 앨리스가 보내고자 하는 메시지가 01010101이라면 앨리스는 메시지의 길이만큼 키를 이어 붙여 늘립니다.

암호화결과는 위의 그림과 같습니다.

앨리스는 i번째 키의 값과 메시지의 값을 더해서 2진법 기준 1의 자리를 암호화된 결과로 기록합니다.

하나씩 설명하자면,

메시지의 첫번째 자리인 0에 키의 0을 더해서 00중 1의 자리인 0을,
두번째 자리의 1에 키의 1을 더해서 10중 1의 자리인 0을,
세번째 자리의 0에 키의 1을 더해서 01중 1의 자리인 1을,
네번째 자리의 1에 키의 0을 더해서 01중 1의 자리인 1을,
다섯번째 자리의 0에 다시 키의 첫번째 자리인 0을 더해서 00의 1의 자리인 0을,
여섯번째 자리에 메시지의 1에 키의 두번째 자리 1을 더해서 10의 1의 자리 1을,
일곱번째 자리의 0에 키의 세번째 자리 1을 더해서 01의 1의 자리 1을,
여덟번째 자리의 1에 키의 0을 더해서 01의 1의자리 1을 이어서 저장해서
암호화된 메시지, 00110011을 밥에게 전송합니다.

메시지 복호화

00110011을 전달받은 밥은 전달받은 메시지를 해독합니다.

밥은 i번째 키의 값과 메시지의 값을 더해서 2진법 기준 1의 자리를 암호화된 결과로 기록합니다.

해독된 메시지는 01010101로 앨리스가 보낸 것과 동일하네요 ^^

이제 여러분은 BB84 양자 암호화에 대해서 배우셨습니다 (와! 벌써요?)

이제 대망의 3번 문제를 풀어봅시다.

도전! — 나도 양자통신을 해보자

제일 먼저 IBM Q Experience 클라우드에 접속을 합니다.

로그인을 한 후 Qiskit notebook 메뉴를 클릭하고 새로운 ipython 노트북을 엽니다.

우선 앨리스와 밥의 양자 암호화 함수는 우리가 직접 작성하지 않고 제공된 것을 사용합니다. 필요한 함수는 쥬피터 노트북에서 다음의 코드를 실행시키는 것으로 설치할 수 있습니다.

첫번째 과제 입니다.

밥이 측정하는 부분을 채워야 합니다.

밥은 밥의 베이스 문자열, 여기에서 bob_bases 문자열의 값을 읽어서 받은 큐빗을 특정한 편광 방향으로 측정을 실행합니다.

즉 이 경우 bob_bases[i]가 0이면 전달받은 큐빗을 |0⟩,|1⟩ 편광으로 측정하고 이것은 qiskit에서 qubit_circuit.measure(0 , 0)으로 구현합니다. 반대로 bob_bases[i]가 1이면 전달받은 큐빗을 |+⟩,|-⟩ 편광으로 측정하고 이것은 전달받은 큐빗에 h(0) 게이트를 적용한 후(qubit_circuit.h(0)) 측정(qubit_circuit.measure(0,0)하는 식으로 구현합니다.

밥의 측정이 적용된 정답 코드는 다음과 같습니다.

앨리스는 밥에게 1개의 큐빗으로 구성된 qubit_circuit을 n번 밥에게 전송합니다. 밥은 qubit_circuit이 수신될때마다 그때의 베이스 문자열 값을 확인해서 큐빗을 측정하여 결과를 기록합니다.

이렇게 기록된 밥의 측정된 비트 k의 값은 다음과 같습니다.

Bob's bits:  1000111010011100001110101010100111110111000111000111100100010110000000101100010101011111001100001001

다음 과제는 키를 생성해 보는 과제입니다.

문제는 다음과 같습니다.

이제 앨리스는 밥에게 공개 채널로 본인의 베이스 문자열을 보내줍니다.

b = 1000000000010001111111001101100101000111110100110111111000110000011000001001100011100111010010000110

앨리스의 베이스를 받아서 해독을 위한 키를 추출해 봅시다.

우선 key값을 저장하기 위해 빈 문자열을 하나 생성합니다.

이제 앨리스의 베이스와 밥의 베이스를 같은 순서대로 비교하면서 두개가 같을때 같은 순서의 밥의 측정된 비트 k값을 떼어 키에 하나씩 붙입니다.

쉽게 구현하자면 문자열의 길이 만큼 for 문을 만들고 인덱스를 하나씩 늘려가면서 alice_basis와 bob_basis를 비교해서 두개가 같을경우만 bob의 k값을 따서 key에 하나씩 저장하면 되겠네요.

파이썬의 zip 함수로 간단하고 아름답게 구현한 정답은 다음과 같습니다.

(zip함수에 대한설명은 여기를 참고하세요 https://wikidocs.net/32#zip)

생성된 키를 가지고 이제 실제 통신을 해보겠습니다.

앨리스가 모스부호를 양자암호화 해서 밥에게 보냈습니다. 메시지는 다음과 같습니다.

𝑚=00110110101000111010000011000100000010000110001011101101111001111111100011111000111001010110101110101110100011101010010111111100101000011010011011011011101111010111000101111111001010101001100101111011

무슨 메시지를 보냈을까요? 혹시 금요일 밤에 영화를 보러 가자는 것일까요? 밥의 마음이 급해졌겠죠? ^^

우선 메시지를 복호화 해봅시다. 문제는 다음과 같습니다.

우선 생성된키는 총 50자리의 숫자이고 앨리스는 200자리로 된 메시지를 보냈습니다. 문자를 해독하기 위해 키를 총 네번 연달아 붙여서 200자리의 키를 생성합니다.

위에 설명한 방식대로 생성된 같은 길이의 키와 앨리스의 메시지를 2진법으로 더하여 1의 자리만 기록합니다.

정답은 다음과 같습니다.

다들 아시겠지만 하나 설명하자면

위의 알고리즘은 파이썬의 zip함수를 사용해서 인덱스 변수 없이도 같은 순서에 있는 행렬들을 자동으로 연산에 사용합니다.

문자열로 저장된 키값과 메시지를 숫자형(int)로 변환하고 두개를 더한 값을 2로 나누어 나머지를 저장하는 방식으로 2진법의 1의자리를 저장하도록 구현했네요.

자 이제 해독된 메시지를 모스 부호로 되살려 봅시다. 사실 저는 여기가 제일 재미있었습니다 ㅎㅎ

문제에서 제공해준 모스부호의 규칙은 다음과 같습니다.

  • 1은 점
  • 11은 대쉬
  • 0은 모스 부호끼리의 분리
  • 00은 “ “
  • 000은 단어의 분리

모스부호 해독을 위한 단어 사전과 함께 제공된 문제는 다음과 같습니다.

앨리스의 메시지를 모스부호로 해독하는 코드는 다음과 같습니다.

자. 앨리스는 밥에게 무슨 메시지를 보낸걸까요?

정답은 reddit.com/r/may4quantum

이런 링크였습니다.

지금도 저 링크에 들어가 보시면 암호를 해독하고 들어온 사람들의 난리법석을 보실수 있습니다. 물론 저중에 저도 있습니다.

어떠신가요? BB84 프로토콜을 죽 보시면서 편광을 측정하는게 왜 저런 코드인지 궁금하신가요?

그렇다면 드디어 여러분은 제가 놓은 덫에 걸려들었습니다.

다음 포스트 부터는 qiskit을 사용해 양자역학을 좀 설명해 보도록하겠습니다.

기대되시나요? 기대해주세요 ^^

--

--

신소영(Sophy)

Sophy, full of curiosity. Two human sons, a dog and cat daughters, and an android developer husband. Love to teach and learn.