go言語は対称暗号化アルゴリズムを独自に設計し、hello worldを暗号化し、復号する.


本文は作者のオリジナルで、転載は出典を明記してください:https://blog.csdn.net/qq_34560344
go言語は対称暗号化アルゴリズムを独自に設計し、hello worldを暗号化し、復号する.
対称暗号化アルゴリズムは、非対称暗号化アルゴリズムに対して使用される.両者の違いは、対称暗号化は、暗号化および復号化の際に同じ鍵を使用し、対称暗号化ではなく、暗号化および復号化の際に異なる鍵、すなわち公開鍵および秘密鍵を使用することである.一般的なDES、3 DES、AESは対称暗号化アルゴリズムであり、RSA、楕円曲線暗号化アルゴリズムは非対称暗号化アルゴリズムである.
//  
func EnCrypt(orig, key []byte) string {
    //           ,  sum  orig     
    sum := 0
    for i := 0; i < len(key); i++ {
        sum += int(key[0])
    }

    //     
    var pkcs_code = PKCS5Padding(orig, 8)

    //    ,           
    for j := 0; j < len(pkcs_code); j++ {
        pkcs_code[j] += byte(sum)
    }
    return base64.StdEncoding.EncodeToString(pkcs_code)
}

//  
func PKCS5Padding(orig []byte, size int) []byte {
    //       
    length := len(orig)
    padding := size - length % size
    // byte          padding
    repeats := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(orig, repeats...)
}

//  
func DeCrypt(text string, key []byte) string {
    orig, err := base64.StdEncoding.DecodeString(text)
    if err != nil {
        return "      "
    }
    sum := 0
    for i := 0; i < len(key); i++ {
        sum += int(key[0])
    }

    //  
    for j := 0; j < len(orig); j++ {
        orig[j] -= byte(sum)
    }

    //  
    var pkcs_unCode = PKCS5UnPadding(orig)
    return string(pkcs_unCode)
}

//  
func PKCS5UnPadding(orig []byte) []byte {
    //           
    var tail = int(orig[len(orig) - 1])
    return orig[:(len(orig) - tail)]
}

func main() {
    key := []byte("123456")
    var enCryptCode = EnCrypt([]byte("hello world"), key)
    fmt.Println("   :", enCryptCode)
    var deCryptCode = DeCrypt(enCryptCode, key)
    fmt.Println("   :", deCryptCode)
}