> 백엔드 개발 > Golang > 대칭 암호화: 암호화의 비밀 악수, Go Crypto 4

대칭 암호화: 암호화의 비밀 악수, Go Crypto 4

Patricia Arquette
풀어 주다: 2024-10-20 06:07:30
원래의
728명이 탐색했습니다.

Symmetric Encryption: The Secret Handshake of Cryptography, Go Crypto 4

안녕하세요, 암호화폐 매니아 여러분! 대칭 암호화의 세계로 뛰어들 준비가 되셨나요? 이를 디지털 세계의 비밀 악수라고 생각하십시오. 두 당사자만이 이해할 수 있는 정보를 공유하는 방법입니다. 이를 분석하여 Go가 디지털 비밀 악수를 구현하는 데 어떻게 도움이 되는지 살펴보겠습니다!

블록 암호: 빌딩 블록

먼저 블록 암호가 있습니다. 이는 디지털 시대의 암호 바퀴와 같습니다. 즉, 고정된 크기의 데이터 덩어리에서 작동합니다. 이번 쇼의 주인공은 AES(Advanced Encryption Standard)입니다.

AES: 헤비급 챔피언

AES는 암호화의 스위스 군용 칼과 같습니다. 다목적이고 강력하며 널리 사용됩니다. Go에서 설정하는 방법은 다음과 같습니다.

import (
    "crypto/aes"
    "crypto/rand"
    "fmt"
)

func main() {
    // Let's create a 256-bit key (32 bytes)
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("Oops, the universe's randomness machine broke!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES threw a tantrum!")
    }

    fmt.Printf("Our AES block size: %d bytes\n", block.BlockSize())
}
로그인 후 복사

이렇게 하면 AES가 설정되지만, 블록 암호 자체는 바퀴 없는 자동차와 같습니다. 기능적이지만 아직 그다지 유용하지는 않습니다. 이것이 바로 작동 모드가 필요한 부분이지만 이에 대해서는 잠시 후에 살펴보겠습니다.

스트림 암호: 흐르는 암호화의 강

다음으로 스트림 암호가 있습니다. 이는 암호화하기 위해 데이터와 XOR을 수행하는 무작위로 보이는 비트의 끝이 없는 스트림과 같습니다. Go는 현대적이고 빠른 스트림 암호인 ChaCha20을 제공합니다.

ChaCha20: 더 뉴 키드 온 더 블록

ChaCha20을 사용하는 방법은 다음과 같습니다.

import (
    "fmt"
    "golang.org/x/crypto/chacha20"
)

func main() {
    key := make([]byte, chacha20.KeySize)
    nonce := make([]byte, chacha20.NonceSize)

    cipher, err := chacha20.NewUnauthenticatedCipher(key, nonce)
    if err != nil {
        panic("ChaCha20 isn't feeling chatty today!")
    }

    secretMessage := []byte("ChaCha20 is my new dance move!")
    encrypted := make([]byte, len(secretMessage))
    cipher.XORKeyStream(encrypted, secretMessage)

    fmt.Printf("Our secret dance move, encrypted: %x\n", encrypted)
}
로그인 후 복사

ChaCha20은 속도가 필요할 때, 특히 AES 하드웨어 가속이 없는 플랫폼에서 훌륭합니다.

작동 모드: 모든 것을 하나로 합치기

이제 작동 모드에 대해 이야기해 보겠습니다. 이는 게임의 규칙과 같습니다. 이는 암호를 사용하여 데이터를 안전하게 암호화하는 방법을 정의합니다.

GCM(갈루아/카운터 모드): 스위스 군용 칼

GCM은 암호화 모드의 스위스 군용 칼과 같습니다. 이는 비밀성과 무결성을 모두 제공하므로 대부분의 사용 사례에 적극 권장됩니다. 사용 방법은 다음과 같습니다.

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "fmt"
)

func main() {
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("The random number generator went on strike!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES is having an existential crisis!")
    }

    nonce := make([]byte, 12)
    if _, err := rand.Read(nonce); err != nil {
        panic("Nonce generator is feeling noncommittal!")
    }

    aesgcm, err := cipher.NewGCM(block)
    if err != nil {
        panic("GCM mode is feeling moody!")
    }

    secretMessage := []byte("AES-GCM: Making encryption great again!")
    encrypted := aesgcm.Seal(nil, nonce, secretMessage, nil)

    fmt.Printf("Our encrypted message: %x\n", encrypted)

    // Let's decrypt it to make sure it worked
    decrypted, err := aesgcm.Open(nil, nonce, encrypted, nil)
    if err != nil {
        panic("Decryption failed! Did someone tamper with our message?")
    }

    fmt.Printf("Decrypted message: %s\n", decrypted)
}
로그인 후 복사

CTR(카운터 모드): Streamifier

CTR 모드는 블록 암호를 스트림 암호로 바꾸는 마술 지팡이와 같습니다. 스트림 암호화의 유연성이 필요하지만 블록 암호화 알고리즘을 고수하고 싶을 때 유용합니다.

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "fmt"
)

func main() {
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("Random number generator is feeling random about its job!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES is having a block party, and we're not invited!")
    }

    iv := make([]byte, aes.BlockSize)
    if _, err := rand.Read(iv); err != nil {
        panic("IV generator is feeling too independent!")
    }

    stream := cipher.NewCTR(block, iv)

    secretMessage := []byte("CTR mode: Turning blocks into streams since 1979!")
    encrypted := make([]byte, len(secretMessage))
    stream.XORKeyStream(encrypted, secretMessage)

    fmt.Printf("Our streamed secret: %x\n", encrypted)

    // Let's decrypt it
    decrypted := make([]byte, len(encrypted))
    stream = cipher.NewCTR(block, iv) // Reset the stream
    stream.XORKeyStream(decrypted, encrypted)

    fmt.Printf("Decrypted message: %s\n", decrypted)
}
로그인 후 복사

대칭 암호화의 황금률

이제 눈부신 새 암호화 도구가 있으므로 명심해야 할 몇 가지 황금률은 다음과 같습니다.

  1. GCM은 당신의 친구입니다: 대부분의 경우 AES-GCM을 사용합니다. 이는 데이터의 경호원과 같습니다. 비밀과 무결성을 모두 보호합니다.

  2. Nonce는 삶의 향신료입니다: 각 암호화 작업에는 항상 고유한 nonce(한 번 사용되는 숫자)를 사용하세요. 이는 각 비밀 메시지의 고유 식별자와 같습니다.

  3. 무작위가 핵심입니다: crypto/rand를 사용하여 키를 생성하세요. 취약한 키를 사용하는 것은 은행 계좌에 "password123"을 사용하는 것과 같습니다.

  4. CTR에는 친구가 필요합니다: CTR 모드를 사용하는 경우 무결성이 보호되지 않는다는 점을 기억하세요. 무결성 보호가 필요한 경우 MAC과 페어링하는 것을 고려해보세요.

  5. 오류 처리는 선택 사항이 아닙니다: 특히 키 생성 및 초기화 중에 항상 오류를 처리합니다. 암호화 코드의 오류를 무시하는 것은 자동차의 "엔진 점검" 표시등을 무시하는 것과 같습니다.

  6. 비밀을 비밀로 유지하세요: 절대로 소스 코드에 키를 하드 코딩하지 마세요. 마치 집 열쇠를 웰컴 매트 밑에 숨기는 것과 같습니다. 공격자가 가장 먼저 보게 될 곳입니다!

다음은 무엇입니까?

축하합니다! 방금 암호화 툴킷에 대칭 암호화를 추가했습니다. 이러한 기술은 양측이 비밀 키를 공유할 때 데이터를 보호하는 데 유용합니다.

하지만 한 번도 만난 적이 없는 사람과 보안 연결을 설정해야 한다면 어떻게 해야 할까요? 이것이 바로 공개 키 암호화가 필요한 부분이며, 이에 대해서는 다음 섹션에서 살펴보겠습니다. 이는 비밀 악수와 공개 서명의 차이와 같습니다. 둘 다 유용하지만 시나리오에 따라 다릅니다.

암호화 세계에서는 이러한 기본 사항을 이해하는 것이 중요합니다. 그것은 성을 짓기 전에 문을 잠그는 법을 배우는 것과 같습니다. 이러한 내용을 익히면 Go에서 안전하고 강력한 애플리케이션을 만드는 데 큰 도움이 될 것입니다.

그럼 자신에게 보내는 메시지를 암호화해 보는 것은 어떨까요? 아니면 AES-GCM을 사용하여 간단한 보안 메모 작성 앱을 구현하시겠습니까? 안전한 통신의 세계가 여러분의 손끝에 있습니다! 즐거운 코딩 되세요, 암호화 챔피언!

위 내용은 대칭 암호화: 암호화의 비밀 악수, Go Crypto 4의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿