>  기사  >  백엔드 개발  >  golang 코드를 암호화할 수 있나요?

golang 코드를 암호화할 수 있나요?

尚
원래의
2019-12-28 14:38:013773검색

golang 코드를 암호화할 수 있나요?

golang 코드 암호화 방법:

DES 암호화 및 복호화

golang의 표준 라이브러리 crypto/des에는 DES가 구현되어 있지만 golang 라이브러리에 대한 설명은 익숙하지 않은 경우 비교적 간단합니다. DES의 암호화 규칙으로는 그렇습니다. 해당 코드를 작성하는 것이 쉽지 않으며, 제3자와 다른 언어로 암호화 및 복호화를 수행할 때 혼동을 일으키고 오류가 발생하기 쉽습니다.

DES 암호화 및 복호화를 위해 다양한 플랫폼과 언어를 연결할 때 상대방이 어떤 암호화 모드와 패딩 방식을 사용하는지 알아야 합니다.

Windows 기본값은 CBC 모드, CryptSetKeyParam 함수, openssl 함수 이름은

Java를 직접 나타냅니다. Cipher.getInstance()가 채워지지 않은 경우 기본값은 DES/ECB/PKCS5Padding

C# 기본값은 CBC 모드, PKCS7Padding (PKCS5Padding)

golang은 기본적으로 CBC 모드를 제공하므로 ECB 모드의 경우 다음과 같이 작성해야 합니다. 코드를 직접

PKCS5Padding 및 PKCS5Unpadding

    func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
        padding := blockSize - len(ciphertext)%blockSize
        padtext := bytes.Repeat([]byte{byte(padding)}, padding)
        return append(ciphertext, padtext...)
    }
 
    func PKCS5Unpadding(origData []byte) []byte {
        length := len(origData)
        unpadding := int(origData[length-1])
        return origData[:(length - unpadding)]
    }

ECB 암호화 모드

 
        block, err := des.NewCipher(key)
        if err != nil {
            ...
        }
        bs := block.BlockSize()
        src = PKCS5Padding(src, bs)
        if len(src)%bs != 0 {
            ....
        }
        out := make([]byte, len(src))
        dst := out
        for len(src) > 0 {
            block.Encrypt(dst, src[:bs])
            src = src[bs:]
            dst = dst[bs:]
        }
        ...
    }

RSA 암호화 및 복호화

기본적으로 고급 패키징을 사용하는 다른 언어와 달리 golang은 다른 개념에 따라 결합하고 패키징해야 합니다.

PEM: 일반적으로 키 저장소 및 X.509 인증서 시스템에서 일반적으로 사용되는 .pem으로 끝나는 파일입니다. 다음은 X509 인증서의 PEM 형식입니다.

-----BEGIN CERTIFICATE-----
    base64
-----END CERTIFICATE-----

PKCS: 이것은 거대한 시스템입니다. 다른 키는 다른 pkcs 파일 형식을 사용합니다. 예를 들어 개인 키는 pkcs8을 사용합니다.

X.509: 이는 일반적으로 IETF의 PKIX에 해당하는 공개 키 인프라(pki)입니다.

참고:

openssl을 사용하여 생성된 pem 파일(예: openssl genrsa -out rsa_private_key.pem 1024)은 PEM 형식이며 -----BEGIN RSA PRIVATE KEY----, --- -로 시작합니다. -RSA 개인 키 끝-----끝.

pkcs8로 변환할 수도 있습니다:

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

위의 개념과 형식을 이해한 후에는 golang에 해당하는 공개 키와 개인 키 암호화 및 복호화 방법을 작성하는 것이 비교적 쉽습니다. 먼저 pem 파일을 디코딩한 다음. 해당 비밀번호를 golang이 지원하는 구조로 디코딩한 후 그에 따라 처리합니다.

개인 키의 경우 다음 작업을 수행하여 서명할 수 있습니다.

    block, _ := pem.Decode([]byte(key))
    if block == nil {       // 失败情况
        ....
    }
 
    private, err := x509.ParsePKCS8PrivateKey(block.Bytes)
    if err != nil {
        ...
    }
 
    h := crypto.Hash.New(crypto.SHA1)
    h.Write(data)
    hashed := h.Sum(nil)
 
    // 进行rsa加密签名
    signedData, err := rsa.SignPKCS1v15(rand.Reader, private.(*rsa.PrivateKey), crypto.SHA1, hashed)
    ...

더 많은 Golang 지식을 보려면

golang 튜토리얼 열을 주의하세요.

위 내용은 golang 코드를 암호화할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.