일회용 패드 암호 소개



게시물Intro to the One-Time Pad CipherQvault에 처음 등장했습니다.

암호학에서 일회성 패드(OTP)는 정보를 해독할 수 없도록 안전하게 암호화하는 방법입니다. 즉, OTP는 메시지를 암호화하기 전에 양 당사자가 동일한 키에 액세스해야 한다는 큰 단점이 있습니다.

일회성 패드 암호의 작동 방식



원타임 패드 사용 시 시작을 위해 메시지와 비밀키가 필요합니다. 원본 messageg의 각 비트는 바이너리 데이터를 사용할 수 있다고 가정하고 그것에 대한 XOR 작업과 비밀 키의 해당 비트를 사용하여 암호화됩니다.

XOR 리프레셔



XOR 또는 "배타적 or"는 이진 데이터와 함께 작동하는 이진 연산자입니다. 두 입력이 모두 반대(하나는 거짓이고 하나는 참)이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

true XOR false = true
false XOR true = true
true XOR true = false
false XOR false = false
<small id="shcb-language-1"><span>Code language:</span> <span>PHP</span> <span>(</span><span>php</span><span>)</span></small>


더 많은 정보를 원하시면 제 다른 기사why exclusive or is important in cryptography를 확인하십시오.

일회용 패드 단계별



예를 들어 "hello word"라는 메시지와 "I not know"라는 키로 시작하면 먼저 텍스트를 이진 데이터로 변환합니다.

hello world = 01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01100100
I not know = 01001001 00100000 01101110 01101111 01110100 00100000 01101011 01101110 01101111 01110111


다음으로 모든 데이터에 대해 XOR 작업을 수행합니다.

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01100100

XOR

01001001 00100000 01101110 01101111 01110100 00100000 01101011 01101110 01101111 01110111

=

00100001 01000101 00000010 00000011 00011011 00000000 00011100 00000001 00011101 00010011
<small id="shcb-language-2"><span>Code language:</span> <span>PHP</span> <span>(</span><span>php</span><span>)</span></small>


결과 이진 데이터는 이제 "암호 텍스트"입니다. 이를 다시 변환하기 위해 우리가 해야 할 일은 키가 있는 암호문XOR뿐이며 원본 메시지를 다시 받을 수 있습니다.

00100001 01000101 00000010 00000011 00011011 00000000 00011100 00000001 00011101 00010011

XOR

01001001 00100000 01101110 01101111 01110100 00100000 01101011 01101110 01101111 01110111

=

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01100100
<small id="shcb-language-3"><span>Code language:</span> <span>PHP</span> <span>(</span><span>php</span><span>)</span></small>


결과를 다시 텍스트로 변환하면 원본 메시지가 해독됩니다.

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01100100

=

hello world


일회용 패드의 완벽한 비밀



암호문에만 액세스할 수 있는 공격자가 평문에 대해 아무 것도 유추할 수 없는 경우 암호가 perfect security 있다고 합니다. 일회용 패드는 완벽한 보안을 제공합니다. 즉, 다음 조건을 충족할 수 있는 경우에만 완벽한 보안을 제공합니다.
  • 키는 적어도 일반 텍스트만큼 길어야 합니다
  • .
  • 키를 재사용하면 안 됩니다.
  • 키는 외부 세계에 완전히 비밀로 유지되어야 하지만 양 당사자가 공유해야 합니다
  • .
  • 키는 일반 텍스트와 독립적인 균일한 분포를 가져야 합니다
  • .

    Caesar cipher은 완벽하게 안전하지 않거나 실질적으로 안전하지 않은 암호의 좋은 예입니다. 앞에서 설명한 것처럼 카이사르 암호의 암호문에 대한 액세스 권한이 부여되면 공격자는 평문에서 문자의 위치와 패턴을 볼 수 있습니다.

    프로덕션에서 일회용 패드를 사용하는 문제



    대부분의 생산 암호는 완벽하게 안전하지는 않지만 "충분히 가깝습니다". 요컨대, 암호 자체의 완벽한 이론적 보안을 희생하면서 시스템의 실질적인 보안을 추가하는 절충안이 만들어집니다.

    위에서 설명한 요구 사항에 따라 실제 시스템에서 안전한 일회용 패드를 구현하는 것은 정말 어렵습니다. 키가 적어도 암호화하는 일반 텍스트만큼 길어야 한다는 첫 번째 요구 사항을 살펴보겠습니다. 즉, 내 컴퓨터 하드 드라이브의 콘텐츠를 암호화하려면 수백 기가바이트 길이의 키가 필요합니다. 그 열쇠를 기억할 방법은 없고, 적어둘 수도 없습니다.

    키를 재사용할 수 없다는 두 번째 요구 사항은 엄청난 고통입니다! 이것은 항상 새 키가 필요하기 때문에 키를 암기하는 것이 불가능하다는 것을 의미합니다. 그뿐만 아니라 의도한 수신자에게 공유 키를 전달해야 하므로 도입되는 보안 취약점은 새 메시지가 전송될 때마다 반복됩니다.

    마지막으로, 비밀로 유지되어야 하지만 어떻게든 의도된 수신자에게 전달되어야 한다는 마지막 요구 사항은 어려운 명령입니다. 사실, 모든 대칭 암호화 알고리즘은 이 문제를 겪고 있습니다. 따라서 다른 엔터티와 통신해야 하는 경우 별도의 체계asymmetric encryption를 사용해야 할 수 있습니다.

    Golang의 일회성 패드 코드 예




    func encrypt(plaintext, key []byte) []byte {
        final := []byte{}
        for i := range plaintext {
            final = append(final, plaintext[i]^key[i])
        }
        return final
    }
    
    func decrypt(ciphertext, key []byte) []byte {
        final := []byte{}
        for i := range ciphertext {
            final = append(final, ciphertext[i]^key[i])
        }
        return final
    }
    <small id="shcb-language-4"><span>Code language:</span> <span>Go</span> <span>(</span><span>go</span><span>)</span></small>
    


    코딩할 준비가 되셨나요?

    Try our coding courses free

    Join our Discord community

    질문이나 의견이 있으십니까?



    질문이나 의견이 있으면 트위터에서 나를 팔로우하고 연락하십시오. 기사에서 실수를 한 경우 반드시 let me know 수정하여 수정할 수 있도록 해주세요!

    좋은 웹페이지 즐겨찾기