두 개의 키를 만들어서 암호화할 때의 키와 복호화할 때의 키를 분리하여 사용할 수 있는 암호화 방식이다.
키 | 목적 |
public key (공개키) | 공개 할 수 있으며 메시지를 보내는 발신자는 이 공개키를 이용하여 암호화 하는데 사용된다. |
private key (비공개키) | 노출하면 안되는 키이며 공개키로 암호화 된 메시지를 복호화 하는데 사용된다. |

평문을 암호화를 할 때 공개키를 이용하면 암호문을 만들어낼 수 있고 암호문은 비공개키를 이용하면 다시 평문을 만들어 낼 수 있는 방식이다. 근데 공개키를 암호화하고 비공개키로만 복호화할 수 있는 것이 아니라 비공개키로도 암호화가 가능하다 그렇게 되면 공개키로 복호화할 수 있다. 라는 것이 비대칭키 또는 공개키 방식의 암호화이다.
왜 이렇게 복잡하게 하는 걸까?
그 이유는 배달사고가 나기 때문이다. 내가 가진 정보를 나만 사용하면은 대칭키를 사용해도 충분하고 맞다고 생각된다. 그러나 내가 가진 정보를 아무나 볼 수 있는 것이 아니고 어떠한 특정 사람에만 보여주겠다고 하면 우리가 보고자 하는 수신자에게 키를 보내줘야 하는데 키는 도난을 당할 수 있는 가능성이 항상 열려있다. 키만 있으면 복호화가 가능하기 때문에 키를 가지고 있는 사람이라면 누구든지 볼 수 있는 것이다.
대칭키의 문제점

발신자는 대칭키 방식으로 암호화를 하여 암호문을 만들어내고 그러면 수신자에게 이 암호문과 암호문을 복호화할 키를 전달을 해줘야 하는데 수신자는 인터넷을 통해서 암호문과 이 암호를 풀 수 있는 키를 전달받지만 동시에 우리가 전달한 정보가 크래커에게도 노출될 가능성이 매우 높다는 것이다. 인터넷은 생각보다 안전하지 않다.
이렇게 되면 수신자도 암호문을 풀 수 있지만 크래커도 암호문을 풀 수 있다. 즉, 키가 원하지 않는 사람에게 노출됨으로 인해서 보안 뚫릴 수 있다는 것이 대칭키 방식의 오류이다.
그렇다면 비대칭키는 안전한가?

1. 발신자는 공개키와 비공개키 두 개를 만든다. 그리고 공개키를 인터넷으로 올려 공개키를 누구가 볼 수 있도록 열어둔다. 그러면 저 공개키를 수신자가 받을 수 있고 크래커 역시 받을 수 있다.
2. 수신자는 공개키를 이용하여 암호문을 만들게 되고 암호문을 다시 인터넷을 통해서 다시 발신자에게 전달하려고 하는데 발신자도 암호문을 받을 수 있고 크래커 역시 암호문을 받을 수 있다.
3. 발신자는 비공개키를 이용하여 수신받은 암호문을 복호화하여 정보를 얻지만 크래커는 비공개키를 가지고 있지 않기 때문에 복호화를 할 수 없으며 설령 공개키로 복호화를 시도해도 절대로 복호화를 할 수 없다.
이것이 어려운 메커니즘 방식이지만 너무 신기하고 세상에는 천재가 많다는 생각이 들게 된다. 아무튼 이러한 방식을 통해서 안전하게 비밀 정보를 주고받을 수 있는 것이다. 여기서 중요한 것은 공개키는 누가 봐도 상관없다. 하지만 비공개키는 절대로 노출되면 안 된다라는 것이다.
비대칭키에서 가장 유명한 알고리즘은 RSA이다.
RSA를 온라인에서 할 수 있는 서비스가 있는데 https://www.devglan.com/online-tools/rsa-encryption-decryption devglan이라는 온라인 사이트인데 여기서 RSA 비대칭키에 대해서 직접 경험해볼 수 있다.
사용법에 대해서 간단하게 설명하자면

Generate RSA Key Pair를 실행하면 아래에 Public Key(공개키), Private Key(비공개키)가 생성이 된다.

RSA Encryption 폼에서 평문과 생성된 공개키를 입력하고 Encrypt를 실행하면 암호문이 생성되고

RSA Decryption 폼에서 암호문, 생성된 비공개키 입력하고 Decrypt를 실행하면 암호 되기 전인 평문으로 복호화되는 것을 확인할 수 있다.
암호문을 공개키를 입력하여 복호화하려고 하면 키 에러가 발생되어 복호화를 할 수 없게 된다.
나중에 RSA 방식의 비대칭키 양방향 암호화 방식을 자바로 구현하는 글도 작성해봐야겠다.
댓글