代码aes_crypto.gopackage mainimport ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/base64" "errors" "io")// ^ 生成会话密钥func AES_Key_Generator() []byte { var key []byte = make([]byte, 32) _, err := io.ReadFull(rand.Reader, key) CheckError(err) return key}func AES_Encrypt(key []byte, message string) (encoded string, err error) { //从输入字符串创建字节切片 plainText := []byte(message) //使用密钥创建新的 AES 密码 block, err := aes.NewCipher(key) //如果 NewCipher 失败,退出: CheckError(err) // ^ 使密文成为大小为 BlockSize + 消息长度的字节切片,这样传值后修改不会更改底层数组 cipherText := make([]byte, aes.BlockSize+len(plainText)) // ^ iv 是初始化向量 (16字节) iv := cipherText[:aes.BlockSize] if _, err = io.ReadFull(rand.Reader, iv); err != nil {return } // ^ 加密数据,给定加密算法用的密钥,以及初始化向量 stream := cipher.NewCTR(block, iv) stream.XORKeyStream(cipherText[aes.BlockSize:], plainText) return base64.RawStdEncoding.EncodeToString(cipherText), err}func AES_Decrypt(key []byte, secure string) (decoded string, err error) { //删除 base64 编码: cipherText, err := base64.RawStdEncoding.DecodeString(secure) //如果解码字符串失败,退出: CheckError(err) //使用密钥和加密消息创建新的 AES 密码 block, err := aes.NewCipher(key) //如果 NewCipher 失败,退出: CheckError(err) //如果密文的长度小于 16 字节 if len(cipherText) < aes.BlockSize {err = errors.New("密文分组长度太小")return } // ^ iv 是初始化向量 (16字节) iv := cipherText[:aes.BlockSize] cipherText = cipherText[aes.BlockSize:] //解密消息 stream := cipher.NewCTR(block, iv) stream.XORKeyStream(cipherText, cipherText) return string(cipherText), err}
rsa_crypto.gopackage mainimport ( "crypto/rand" "crypto/rsa" "crypto/sha256" "encoding/base64" "fmt")func CheckError(e error) { if e != nil {fmt.Println(e.Error())panic(e) }}// ^ 生成密钥与公钥func RSA_Generator() (*rsa.PrivateKey, rsa.PublicKey) { privateKey, err := rsa.GenerateKey(rand.Reader, 2048) CheckError(err) return privateKey, privateKey.PublicKey}func RSA_OAEP_Encrypt(key rsa.PublicKey, secretMessage string) string { label := []byte("标签") ciphertext, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, &key, []byte(secretMessage), label) CheckError(err) return base64.RawStdEncoding.EncodeToString(ciphertext)}func RSA_OAEP_Decrypt(privKey *rsa.PrivateKey, cipherText string) string { ct, _ := base64.RawStdEncoding.DecodeString(cipherText) label := []byte("标签") // ^ 解密过程中的 rand.Reader 不是必选的,但一般要提供用来防止 side channel attacks. plaintext, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privKey, ct, label) CheckError(err) return string(plaintext)}
main.gopackage mainimport ( "bufio" "crypto/rsa" "encoding/base64" "fmt" "os" "strings")func main() { privateKey, publicKey := RSA_Generator() fmt.Printf("\n\t共同N: %v\n\t公钥E: %v\n\t私钥D: %v\n", publicKey.N, publicKey.E, privateKey.D) reader := bufio.NewReader(os.Stdin) var message string // 如果没有给运行附加参数 if len(os.Args) != 2 {fmt.Printf("\n\t获取不到程序运行附加参数,手动输入字符串\n")fmt.Printf("\t字符串:")message, _ = reader.ReadString('\n') } else {message = os.Args[1] } encrypted := hybridEncrypt(publicKey, message) //打印密钥和密文 fmt.Printf("\n\t加密后: %s\n", encrypted) //解密文本 decrypted := hybridDecrypt(privateKey, encrypted) //打印重新解密的文本: fmt.Printf("\t解密后: %s\n\n", decrypted)}// ^ 实现混合密码系统加密func hybridEncrypt(publicKey rsa.PublicKey, message string) string { AES_key := AES_Key_Generator() encrypted, err := AES_Encrypt(AES_key, message) CheckError(err) head := RSA_OAEP_Encrypt(publicKey, string(AES_key)) return base64.RawStdEncoding.EncodeToString([]byte(head + "|组合加密的会话密钥与消息|" + encrypted))}// ^ 实现混合密码系统解密func hybridDecrypt(privateKey *rsa.PrivateKey, message string) string { mes, err := base64.RawStdEncoding.DecodeString(message) CheckError(err) splits := strings.Split(string(mes), "|组合加密的会话密钥与消息|") head, encrypted := splits[0], splits[1] AES_key := RSA_OAEP_Decrypt(privateKey, head) decrypted, err := AES_Decrypt([]byte(AES_key), encrypted) CheckError(err) return decrypted}
ConsolePS C:\Users\小能喵喵喵\Desktop\Go\Cryptography\HybridCryptoSystem> go run .共同N: 27640386706278435101453826167880213380728173376705028554783165783279386289425385951480103560680095783771843646857109485131423632909299132644495753077858557656973966723671714379227388216997874772747942697857840884958167490215992557618790374058240600396830575755231210656224988403861978602412271792545641212145711389619141451899401914724049344335805426393895927923656887621076309994751218768872654198553908831397491866304367960002592041669717397769735292092598621160683203319490180735669006214925366299990837670410127282438512376259066563653513041612145434668849944713663380228178995120226612134278958851534636750809001公钥E: 65537私钥D: 21389172708682283842260567223157071907527493061928308026852438358469476412838678128832773121746357899720601348098910654110504746067032447503938265671965405062383611126402047618025191776020373515722598134212130559541228073703466172690799911811094069748771879235035946845758125744264465032292267939621163527075589206186236252262969497020056020747918051369037068208691174340727908489331589607362106509257993751131469180199656580210783551516628845816453711183613127441188183231286809500171237776949663326262795200507964067032050374872022735029012264732773085633122224061096049966893027129668814251907555802752863797705473获取不到程序运行附加参数,手动输入字符串字符串:系统对于不同输入,反馈时间动态变化 , 利用这个特性获取机密信息的方法称之为时序攻击 。加密后: ei9MamphdU9KQkVCUS9kYlBVSzNFaXN3UUVaamo2R3loMTRGaXNlamJVd1hFd3dOM0FDMUZYYkIrQlJ6M1pTaG5xeE9admNsNVgyY3dEMG4zVEM2NXA1S1M2a29ha3ZlL2JZV2ZlNlcxSUYyRC92TDZiY3ZSVldZdnJSUEJKc2VtVnV5WE9sdWcyWWlKZ2o2dW85R25IQTYyMS9abUlpM1BrNEhCYUlxT1BYQWp3TGxsSzFqZi9KSUZxSytPZ1NHeUVsMExIMm0vTmxkU1NRV093U1RTK3BVQmtJcXBGMENmbE9RSVRUTUgvREsyUFV3OGRtbjkxWnFYVFN3SnQ2ZjVkTUE4cWd6MUNjaVhaUFRGVVhaU1JVWUFTWWFXZGFHRW9yZndZcnQ0bWg0MTBqV1ZQODl6NnZGNHQyRGlrYi9JNFdlalJvdTB2QU9HWmViSWl0Q1lBfOe7hOWQiOWKoOWvhueahOS8muivneWvhumSpeS4jua2iOaBr3xXeGl3YXRwZWRBT2JWRFRxdm9EQVFMK2pyMkVGU1JGWmRIV0pxSGdMVExRcE0vdmxOcjF1ZEFKMDAzSlVESU4wNkdIbCt4cm1IakhLZHdPL204N1I3VE5YM1Q2cE1FdjV6L3VjMVRwck1yQVN6cEFhc0JEUjJwTGJJVEVocXVEeUIvLzRWZDYzYXVqR2xVY0NDNkk3SlRTQVc1bDBTNExlMHdJbytJaU1kSEt3b2l1TTd1UGlGVEUvYzN0Zw解密后: 系统对于不同输入,反馈时间动态变化,利用这个特性获取机密信息的方法称之为时序攻击 。
推荐阅读
- 密码学奇妙之旅、03 HMAC单向散列消息认证码、Golang代码
- Mobile 我的Vue之旅、05 导航栏、登录、注册
- 原神前所未闻的奇妙比赛怎么过
- 密码学发展大概经过了几个阶段?
- 2021交通安全大篷车红色之旅直播有感
- 2021交通安全大篷车红色之旅直播 观看2021交通安全大篷车红色之旅有感
- 美丽乡村童行中国交通安全大篷车红色之旅观后感
- 我最近特喜欢俩字“破凡”求个关于这俩字的诗啊什么的一本小说飘渺之旅这里面有个破凡决我在这想到?
- 奥利奥的奇妙吃法
- 梦到被冲到海里去了的启示 关于这个梦境的奇妙体验