Maison  >  Article  >  développement back-end  >  Le code Golang peut-il être crypté ?

Le code Golang peut-il être crypté ?

尚
original
2019-12-28 14:38:013739parcourir

Le code Golang peut-il être crypté ?

Méthode de cryptage du code Golang :

Cryptage et décryptage DES

bibliothèque standard crypto/des en golang Là est une implémentation de DES, mais la description de la bibliothèque golang est relativement simple. Si vous n'êtes pas familier avec les règles de cryptage de DES, il n'est pas facile d'écrire le code correspondant. Il est également facile de se tromper lors du cryptage et du chiffrement. décryptage entre différentes langues avec un tiers , une erreur s'est produite.

Lors de la connexion de différentes plates-formes et langues pour le cryptage et le décryptage DES, vous devez savoir quel mode de cryptage et quelle méthode de remplissage l'autre partie utilise :

La valeur par défaut de Windows est le mode CBC, la fonction CryptSetKeyParam, openssl Le nom de la fonction indique directement

En Java, si Cipher.getInstance() n'est pas renseigné, la valeur par défaut est DES/ECB/PKCS5Padding

En C#, la valeur par défaut est le mode CBC, PKCS7Padding (PKCS5Padding)

Golang fournit le mode CBC par défaut, donc pour le mode ECB, vous devez écrire votre propre code

PKCS5Padding et 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)]
    }

Mode de cryptage 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:]
        }
        ...
    }

Chiffrement et décryptage RSA

Différent des autres langages qui ont une encapsulation plus avancée par défaut, golang doit être combiné et encapsulé selon différents concepts

PEM : se termine généralement par .pem. Les fichiers sont couramment utilisés dans les systèmes de stockage de clés et de certificats X.509. Voici le format PEM sous un certificat X509 :

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

PKCS : il s'agit d'un système énorme et différent. les clés utilisent un format de fichier pkcs différent. Par exemple, la clé privée utilise pkcs8.

X.509 : Il s'agit d'une infrastructure à clé publique (pki), qui correspond généralement au PKIX dans l'IETF.

Remarque :

Le fichier pem généré à l'aide d'openssl (tel que openssl genrsa -out rsa_private_key.pem 1024) est conforme au format PEM, avec -----BEGIN RSA PRIVATE KEY-- ---Début, -----FIN CLÉ PRIVÉE RSA-----Fin.

peut également être converti en pkcs8 :

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

Après avoir clarifié les concepts et les formats ci-dessus, il est relativement facile d'écrire les méthodes de cryptage et de déchiffrement à clé publique et à clé privée correspondant à golang Le premier. consiste à décoder le fichier pem, puis à décoder le mot de passe correspondant dans une structure prise en charge par golang, puis à effectuer le traitement correspondant.

Pour les clés privées, vous pouvez effectuer les opérations suivantes pour signer :

    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)
    ...

Pour plus de connaissances sur Golang, veuillez faire attention à la colonne

tutoriel golang.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn