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

Le code Golang peut-il être crypté ?

Libérer: 2019-12-28 14:38:01
original
3861 Les gens l'ont consulté

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)]
    }
Copier après la connexion

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:]
        }
        ...
    }
Copier après la connexion

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-----
Copier après la connexion

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
Copier après la connexion

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)
    ...
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal