Heim  >  Artikel  >  Backend-Entwicklung  >  Kann Golang-Code verschlüsselt werden?

Kann Golang-Code verschlüsselt werden?

尚
Original
2019-12-28 14:38:013737Durchsuche

Kann Golang-Code verschlüsselt werden?

Golang-Code-Verschlüsselungsmethode:

DES-Verschlüsselung und -Entschlüsselung

Standardbibliothek crypto/des in Golang Dort ist eine Implementierung von DES, aber die Beschreibung der Golang-Bibliothek ist relativ einfach. Wenn Sie mit den Verschlüsselungsregeln von DES nicht vertraut sind, ist es nicht einfach, den entsprechenden Code zu schreiben Bei der Entschlüsselung zwischen verschiedenen Sprachen mit einem Drittanbieter ist ein Fehler aufgetreten.

Wenn Sie verschiedene Plattformen und Sprachen für die DES-Verschlüsselung und -Entschlüsselung verbinden, müssen Sie wissen, welchen Verschlüsselungsmodus und welche Auffüllmethode die andere Partei verwendet:

Windows-Standard ist der CBC-Modus, die Funktion CryptSetKeyParam, openssl Der Funktionsname gibt direkt an

Wenn in Java Cipher.getInstance() nicht ausgefüllt ist, ist der Standardwert DES/ECB/PKCS5Padding

In C# ist der Standardwert der CBC-Modus, PKCS7Padding (PKCS5Padding)

Golang bietet standardmäßig den CBC-Modus, daher müssen Sie für den ECB-Modus Ihren eigenen Code schreiben

PKCS5Padding und 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-Verschlüsselungsmodus

 
        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-Verschlüsselung und -Entschlüsselung

Im Gegensatz zu anderen Sprachen, die standardmäßig über eine Kapselung auf höherer Ebene verfügen, muss Golang nach unterschiedlichen Konzepten kombiniert und gekapselt werden

PEM: endet normalerweise mit .pem. Dateien werden häufig in Schlüsselspeicher- und X.509-Zertifikatsystemen verwendet. Das Folgende ist das PEM-Format unter einem X509-Zertifikat:

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

PKCS: Dies ist ein riesiges System, und Verschiedene Schlüssel verwenden unterschiedliche PKCS-Dateiformate. Der private Schlüssel verwendet beispielsweise pkcs8.

X.509: Hierbei handelt es sich um eine Public-Key-Infrastruktur (PKI), die normalerweise PKIX in der IETF entspricht.

Hinweis:

Die mit openssl generierte PEM-Datei (z. B. openssl genrsa -out rsa_private_key.pem 1024) entspricht dem PEM-Format mit -----BEGIN RSA PRIVATE KEY-- ---Anfang, -----ENDE RSA PRIVATE KEY-----Ende.

kann auch in pkcs8 konvertiert werden:

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

Nachdem die oben genannten Konzepte und Formate geklärt wurden, ist es relativ einfach, die Verschlüsselungs- und Entschlüsselungsmethoden für öffentliche Schlüssel und private Schlüssel zu schreiben, die Golang entsprechen besteht darin, die PEM-Datei zu dekodieren, dann das entsprechende Passwort in eine von Golang unterstützte Struktur zu dekodieren und dann die entsprechende Verarbeitung durchzuführen.

Für den privaten Schlüssel können Sie die folgenden Vorgänge zum Signieren ausführen:

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

Für weitere Golang-Kenntnisse beachten Sie bitte die Spalte

Golang-Tutorial.

Das obige ist der detaillierte Inhalt vonKann Golang-Code verschlüsselt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn