Go加密解密算法总结(go 加密解密) 加密解密 语言 hmac 第1张

前语

加密解密在实践开发中运用比较广泛,常用加解密分为:“对称式”、“非对称式”和”数字签名“。

对称式:对称加密(也叫私钥加密)指加密宽和密运用相同密钥的加密算法。详细算法首要有DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法。

非对称加密(公钥加密):指加密宽和密运用不同密钥的加密算法,也称为公私钥加密。详细算法首要有RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。

数字签名:数字签名对错对称密钥加密技能与数字摘要技能的运用。首要算法有md5、hmac、sha1等。

以下介绍golang言语首要的加密解密算法完成。

md5

MD5信息摘要算法是一种被广泛运用的暗码散列函数,能够产生出一个128位(16进制,32个字符)的散列值(hash value),用于保证信息传输完好共同。

  1. funcGetMd5String(sstring)string{
  2. h:=md5.New()
  3. h.Write([]byte(s))
  4. returnhex.EncodeToString(h.Sum(nil))
  5. }

hmac

HMAC是密钥相关的哈希运算音讯认证码(Hash-based Message Authentication Code)的缩写,

它经过一个规范算法,在核算哈希的过程中,把key混入核算过程中。

和咱们自定义的加salt算法不同,Hmac算法针对一切哈希算法都通用,无论是MD5仍是SHA-1。选用Hmac代替咱们自己的salt算法,能够使程序算法更规范化,也更安全。

示例

  1. //key随意设置data要加密数据
  2. funcHmac(key,datastring)string{
  3. hash:=hmac.New(md5.New,[]byte(key))//创立对应的md5哈希加密算法
  4. hash.Write([]byte(data))
  5. returnhex.EncodeToString(hash.Sum([]byte("")))
  6. }
  7. funcHmacSha256(key,datastring)string{
  8. hash:=hmac.New(sha256.New,[]byte(key))//创立对应的sha256哈希加密算法
  9. hash.Write([]byte(data))
  10. returnhex.EncodeToString(hash.Sum([]byte("")))
  11. }

sha1

SHA-1能够生成一个被称为音讯摘要的160位(20字节)散列值,散列值一般的出现方式为40个十六进制数。

  1. funcSha1(datastring)string{
  2. sha1:=sha1.New()
  3. sha1.Write([]byte(data))
  4. returnhex.EncodeToString(sha1.Sum([]byte("")))
  5. }

AES

暗码学中的高档加密规范(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府选用的一种区块加密规范。这个规范用来代替原先的DES(Data Encryption Standard),现已被多方剖析且广为全世界所运用。AES中常见的有三种解决方案,分别为AES-128、AES-192和AES-256。假如选用真实的128位加密技能乃至256位加密技能,蛮力进犯要取得成功需求消耗适当长的时刻。

AES 有五种加密形式:

  • 电码本形式(Electronic Codebook Book (ECB))、
  • 暗码分组链接形式(Cipher Block Chaining (CBC))、
  • 核算器形式(Counter (CTR))、
  • 暗码反应形式(Cipher FeedBack (CFB))
  • 输出反应形式(Output FeedBack (OFB))

ECB形式

出于安全考虑,golang默许并不支撑ECB形式。

  1. packagemain
  2. import(
  3. "crypto/aes"
  4. "fmt"
  5. )
  6. funcAESEncrypt(src[]byte,key[]byte)(encrypted[]byte){
  7. cipher,_:=aes.NewCipher(generateKey(key))
  8. length:=(len(src)+aes.BlockSize)/aes.BlockSize
  9. plain:=make([]byte,length*aes.BlockSize)
  10. copy(plain,src)
  11. pad:=byte(len(plain)-len(src))
  12. fori:=len(src);i<len(plain);i++{
  13. plain[i]=pad
  14. }
  15. encrypted=make([]byte,len(plain))
  16. //分组分块加密
  17. forbs,be:=0,cipher.BlockSize();bs<=len(src);bs,be=bs+cipher.BlockSize(),be+cipher.BlockSize(){
  18. cipher.Encrypt(encrypted[bs:be],plain[bs:be])
  19. }
  20. returnencrypted
  21. }
  22. funcAESDecrypt(encrypted[]byte,key[]byte)(decrypted[]byte){
  23. cipher,_:=aes.NewCipher(generateKey(key))
  24. decrypted=make([]byte,len(encrypted))
  25. //
  26. forbs,be:=0,cipher.BlockSize();bs<len(encrypted);bs,be=bs+cipher.BlockSize(),be+cipher.BlockSize(){
  27. cipher.Decrypt(decrypted[bs:be],encrypted[bs:be])
  28. }
  29. trim:=0
  30. iflen(decrypted)>0{
  31. trim=len(decrypted)-int(decrypted[len(decrypted)-1])
  32. }
  33. returndecrypted[:trim]
  34. }
  35. funcgenerateKey(key[]byte)(genKey[]byte){
  36. genKey=make([]byte,16)
  37. copy(genKey,key)
  38. fori:=16;i<len(key);{
  39. forj:=0;j<16&&i<len(key);j,i=j+1,i+1{
  40. genKey[j]^=key[i]
  41. }
  42. }
  43. returngenKey
  44. }
  45. funcmain(){
  46. source:="helloworld"
  47. fmt.Println("原字符:",source)
  48. //16byte密钥
  49. key:="1443flfsaWfdas"
  50. encryptCode:=AESEncrypt([]byte(source),[]byte(key))
  51. fmt.Println("密文:",string(encryptCode))
  52. decryptCode:=AESDecrypt(encryptCode,[]byte(key))
  53. fmt.Println("解密:",string(decryptCode))
  54. }

CBC形式

  1. packagemain
  2. import(
  3. "bytes"
  4. "crypto/aes"
  5. "fmt"
  6. "crypto/cipher"
  7. "encoding/base64"
  8. )
  9. funcmain(){
  10. orig:="helloworld"
  11. key:="0123456789012345"
  12. fmt.Println("原文:",orig)
  13. encryptCode:=AesEncrypt(orig,key)
  14. fmt.Println("密文:",encryptCode)
  15. decryptCode:=AesDecrypt(encryptCode,key)
  16. fmt.Println("解密成果:",decryptCode)
  17. }
  18. funcAesEncrypt(origstring,keystring)string{
  19. //转成字节数组
  20. origData:=[]byte(orig)
  21. k:=[]byte(key)
  22. //分组秘钥
  23. //NewCipher该函数约束了输入k的长度有必要为16,24或许32
  24. block,_:=aes.NewCipher(k)
  25. //获取秘钥块的长度
  26. blockSize:=block.BlockSize()
  27. //补全码
  28. origData=PKCS7Padding(origData,blockSize)
  29. //加密形式
  30. blockMode:=cipher.NewCBCEncrypter(block,k[:blockSize])
  31. //创立数组
  32. cryted:=make([]byte,len(origData))
  33. //加密
  34. blockMode.CryptBlocks(cryted,origData)
  35. returnbase64.StdEncoding.EncodeToString(cryted)
  36. }
  37. funcAesDecrypt(crytedstring,keystring)string{
  38. //转成字节数组
  39. crytedByte,_:=base64.StdEncoding.DecodeString(cryted)
  40. k:=[]byte(key)
  41. //分组秘钥
  42. block,_:=aes.NewCipher(k)
  43. //获取秘钥块的长度
  44. blockSize:=block.BlockSize()
  45. //加密形式
  46. blockMode:=cipher.NewCBCDecrypter(block,k[:blockSize])
  47. //创立数组
  48. orig:=make([]byte,len(crytedByte))
  49. //解密
  50. blockMode.CryptBlocks(orig,crytedByte)
  51. //去补全码
  52. orig=PKCS7UnPadding(orig)
  53. returnstring(orig)
  54. }
  55. //补码
  56. //AES加密数据块分组长度有必要为128bit(byte[16]),密钥长度能够是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的恣意一个。
  57. funcPKCS7Padding(ciphertext[]byte,blocksizeint)[]byte{
  58. padding:=blocksize-len(ciphertext)%blocksize
  59. padtext:=bytes.Repeat([]byte{byte(padding)},padding)
  60. returnappend(ciphertext,padtext...)
  61. }
  62. //去码
  63. funcPKCS7UnPadding(origData[]byte)[]byte{
  64. length:=len(origData)
  65. unpadding:=int(origData[length-1])
  66. returnorigData[:(length-unpadding)]
  67. }

CRT形式

  1. packagemain
  2. import(
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "fmt"
  7. )
  8. //加密
  9. funcaesCtrCrypt(plainText[]byte,key[]byte)([]byte,error){
  10. //1.创立cipher.Block接口
  11. block,err:=aes.NewCipher(key)
  12. iferr!=nil{
  13. returnnil,err
  14. }
  15. //2.创立分组形式,在crypto/cipher包中
  16. iv:=bytes.Repeat([]byte("1"),block.BlockSize())
  17. stream:=cipher.NewCTR(block,iv)
  18. //3.加密
  19. dst:=make([]byte,len(plainText))
  20. stream.XORKeyStream(dst,plainText)
  21. returndst,nil
  22. }
  23. funcmain(){
  24. source:="helloworld"
  25. fmt.Println("原字符:",source)
  26. key:="1443flfsaWfdasds"
  27. encryptCode,_:=aesCtrCrypt([]byte(source),[]byte(key))
  28. fmt.Println("密文:",string(encryptCode))
  29. decryptCode,_:=aesCtrCrypt(encryptCode,[]byte(key))
  30. fmt.Println("解密:",string(decryptCode))
  31. }
  32. CFB形式
  33. packagemain
  34. import(
  35. "crypto/aes"
  36. "crypto/cipher"
  37. "crypto/rand"
  38. "encoding/hex"
  39. "fmt"
  40. "io"
  41. )
  42. funcAesEncr