根据技术特征,现代密码学可分为三类:
对称算法说明:加密密钥和解密密钥相同,对明文、密文长度没有限制
子算法:
流密码算法:每次加密或解密一位或一字节的明文或密文
分组密码算法:将明文(密文)分成固定长度的数据块(比特块或字节块),用同一密钥和算法对每一明文(密文)块加密(解密)后得到等长的密文(明文)块,然后将密文(明文)块按照顺序组合起来最终得到密文(明文)
常见算法:
流密码算法:RC4
分组密码算法:DES、IDEA、RC2、AES、SM4
非对称算法说明:加密密钥和解密密钥不相同。
公钥加密,私钥解密
私钥加签,公钥验签
常见算法:RSA、DH、DSA、ECDSA、ECC、SM2
摘要算法说明:把任意长的输入消息数据转化成固定长度的输出数据的一种密码算法,又称散列函数、哈希函数或杂凑函数、单向函数等。摘要算法没有密钥。
常见算法:MD5、SHA1、SM3
实战对称算法-RC4说明1.加密key长度为1byte~256byte
2.加密后的结果为base-16编码的字符串,需进行转换
代码packagemainimport("crypto/rc4""fmt")funcRC4(){//加密varkey[]byte=[]byte("fd6cde7c2f4913f22297c948dd530c84")//初始化用于加密的KEY,长度1byte~256byterc4obj1,_:=(key)//返回Cipherrc4str1:=[]byte("RC4")//需要加密的字符串plaintext:=make([]byte,len(rc4str1))(plaintext,rc4str1)//加密stringinf1:=("%x\n",plaintext)//转换字符串,base-16编码的字符串,每个字节使用2个字符表示("RC4加密后:"+stringinf1)//解密dest2:=make([]byte,len(rc4str1))cipher2,_:=(key)//切记:这里不能重用rc4obj1,必须重新生成新的(dest2,plaintext)("RC4解密后:%s\n\n",dest2)}funcmain(){RC4()}
结果:可以看到长度是一致的
➜
RC4加密后:4daff0
RC4解密后:RC4
对称算法-AES说明1.AES是分组密码算法,所以AES的计算包含两部分
分组大小:128位
密钥大小:128位、192位和256位,三种可选
2.AES加密过程是在一个4×4的字节(128位)矩阵上运作,加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤
AddRoundKey:—矩阵中的每一个字节都与该次回合金钥(roundkey)做XOR运算;每个子密钥由密钥生成方案产生。
SubBytes:通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
ShiftRows:将矩阵中的每个横列进行循环式移位。
MixColumns:使用线性转换来混合每内联的四个字节
工作模式AES有6种加密模式。ECB模式和CBC模式是最常用的两种模式,代码也只实现这两种。
需要块对对齐(填充)的AES加密模式:ECB、CBC、PCBC,其余模式无需块对齐。
需要初始向量的AES加密模式:除ECB模式外,都需要初始向量。
电子密码本:ElectronicCodeBookMode(ECB)ECB模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。
优点:有利于并行计算;误差不会累计(互不干扰)。
缺点:可能对明文进行主动攻击。
CBC模式对于每个待加密的密码块,在加密前会先与前一个密码块的密文异或然后再用加密器加密(图中的圆圈十字符号表示异或操作,下同)。第一个明文块与一个叫初始化向量(IV)的数据块异或。加、解密双方共同知晓密钥和初始化向量才能实现加解密。
优点:安全性比ECB模式高;是SSL的标准。
缺点:数据块之间的加密有依赖关系,因此不能并行计算。
CFB模式是用分组算法实现流算法,明文数据不需要按分组大小对齐。
优点:明文数据不需要按分组大小对齐,即无需填充。
缺点:同CBC模式,无法并行计算。
OFB模式的过程和CBC模式有点像,但明文数据不需要按分组大小对齐。
优点:明文数据不需要按分组大小对齐,即无需填充。
缺点:同CBC模式,无法并行计算。
CTR模式是在ECB模式的基础上,引入了Nonce随机数和Counter计数器,Nounce随机数和Counter计数器整体可看作计数器,每加密一段明文,计数器向上加一,并且这个计数器都会和初始IV进行连接、加加、异或等运算,然后使用加密器进行加密,最后在和明文异或得到分段密文。
优点:明文数据不需要按分组大小对齐,即无需填充。
缺点:加密方和解密方需要同时维护初始IV、Nonce、Counter。
PCBC模式是CBC模式的改进版,与CBC模式的不同点在于,CBC模式后段明文加密的所需向量是前一段的密文,而PCBC模式后段明文加密所需的向量是前一段明文和密文的异或值。
优点:同CBC模式。
缺点:同CBC模式。
////////////////////////////////AESfuncAES(){origData:=[]byte("AES待加密数据")//待加密的数据key:=[]byte("ABCDEFGHIJKLMNOP")//加密的密钥,只能128位、192位和256位("原文:",string(origData))("------------------CBC模式--------------------")encrypted:=AesEncryptCBC(origData,key)("密文(hex):",(encrypted))("密文(base64):",(encrypted))decrypted:=AesDecryptCBC(encrypted,key)("解密结果:",string(decrypted))("------------------ECB模式--------------------")encrypted=AesEncryptECB(origData,key)("密文(hex):",(encrypted))("密文(base64):",(encrypted))decrypted=AesDecryptECB(encrypted,key)("解密结果:",string(decrypted))}//===================CBC======================funcAesEncryptCBC(origData[]byte,key[]byte)(encrypted[]byte){//分组秘钥//NewCipher该函数限制了输入k的长度必须为16,24或者32block,_:=(key)blockSize:=()//获取秘钥块的长度origData=pkcs5Padding(origData,blockSize)//补全码blockMode:=(block,key[:blockSize])//加密模式,key[:blockSize]是IVencrypted=make([]byte,len(origData))//创建数组(encrypted,origData)//加密returnencrypted}funcAesDecryptCBC(encrypted[]byte,key[]byte)(decrypted[]byte){block,_:=(key)//分组秘钥blockSize:=()//获取秘钥块的长度blockMode:=(block,key[:blockSize])//加密模式decrypted=make([]byte,len(encrypted))//创建数组(decrypted,encrypted)//解密decrypted=pkcs5UnPadding(decrypted)//去除补全码returndecrypted}funcpkcs5Padding(ciphertext[]byte,blockSizeint)[]byte{padding:=blockSize-len(ciphertext)%blockSizepadtext:=([]byte{byte(padding)},padding)returnapp(ciphertext,padtext)}funcpkcs5UnPadding(origData[]byte)[]byte{length:=len(origData)unpadding:=int(origData[length-1])returnorigData[:(length-unpadding)]}//===================ECB======================funcAesEncryptECB(origData[]byte,key[]byte)(encrypted[]byte){cipher,_:=(generateKey(key))length:=(len(origData)+)/:=make([]byte,length*)copy(plain,origData)pad:=byte(len(plain)-len(origData))fori:=len(origData);ilen(plain);i++{plain[i]=pad}encrypted=make([]byte,len(plain))//分组分块加密forbs,be:=0,();bs=len(origData);bs,be=bs+(),be+(){(encrypted[bs:be],plain[bs:be])}returnencrypted}funcAesDecryptECB(encrypted[]byte,key[]byte)(decrypted[]byte){cipher,_:=(generateKey(key))decrypted=make([]byte,len(encrypted))//forbs,be:=0,();bslen(encrypted);bs,be=bs+(),be+(){(decrypted[bs:be],encrypted[bs:be])}trim:=0iflen(decrypted)0{trim=len(decrypted)-int(decrypted[len(decrypted)-1])}returndecrypted[:trim]}funcgenerateKey(key[]byte)(genKey[]byte){genKey=make([]byte,16)copy(genKey,key)fori:=16;ilen(key);{forj:=0;j16ilen(key);j,i=j+1,i+1{genKey[j]^=key[i]}}returngenKey}funcmain(){AES()}
结果:
➜
原文:AES待加密数据
------------------CBC模式--------------------
密文(hex):49c5e79d2c11673455484a2ad8e591b05b75ac0d5fcc206fdda90
密文(base64):ScXnnSwRZzRRNTIzRhNUhKKtjlkbBbdawNX8wgb92pA=
解密结果:AES待加密数据
------------------ECB模式--------------------
密文(hex):74c3a459214e98d6e91ffc4ea291d63ece558f39d07e3f4ade14adbc3486f60f
密文(base64):dMOkWSFOmNbpH/xOopHWPs5VjznQfj9K3hStvDSG9g8=
解密结果:AES待加密数据
非对称算法-RSA说明1.加密的明文长度不能超过RSA密钥的长度,根据填充方案的不同,RSA加密时,对于原文数据的要求
OAEP填充模式:原文长度=密钥模长-(2*原文的摘要值长度)-2字节,各摘要值长度:
SHA-1:20字节SHA-256:32字节SHA-384:48字节SHA-512:64字节
PKCA1-V1_5填充模式:原文长度=密钥模长-11字节,比如密钥长度1024位(即128字节),明文长度不能超过117=128-11
2.RSA加密内容的长度有限,这是它的算法决定的,所以一般用RSA加密其他算法的密钥,比如用RSA加密AES的密钥,再用AES算法加密明文数据。如果非要加密大量数据,只能将数据分段进行加密。
3.RSA一般还是用来签名比较多,如果只是签名用的话,加密明文的MD5值就可以
4.密文的长度总是密钥的长度的一半
5.RSA签名也需要选择填充方案,如PKCS_V15或PKCS_V21(PSS)
6.RSA签名先计算出消息的消息摘要,然后使用自己的私钥加密消息摘要,所以需要选择计算摘要的算法,如SHA256等
样式密钥生成有几种方案,我们用openssl生成密钥对,看看公私钥的样式
生成RSA私钥(无加密)
opensslgenrsa-outrsa_查看rsa_CgKCAQEA3vK7hHEblXqIw4OlAdyYBoSm6TYW80KH6WenPR24J8FehpxByQY6mpMTR/XM4BTAflfouvdNZ9OPAm3IarHaBbc1aXwznzn93yPp/nQdBdZq9RDAJA1f5ESrCY/YJWiBW88C33EtLF2xiOj1l+02HepdFo0FvO0BE19yrS2mcBLH8LTUYAW+7dUzjonS1hTKJo+i1r+Zwq6Djp7mxB6hFqsRSIVVypFd6gs2o4GLUJRR9CQLYoceSFECsRef25jhKFxR/HaMZJPHkMo9W8CNV7swLatDcObv8AJC7vHmjYVQDSxbQMxtK+8fUYGMwS4TLHnt/IL0tbyQWuvh1f6LaQIDAQAB-----ENDPUBLICKEY-----
查看公/私钥明细
opensslrsa-inrsa__公钥明细Public-Key:(2048bit)Modulus:00:de:f2:bb:84:71:1b:95:7a:88:c3:83:a5:01:dc:98:06:84:a6:e9:36:16:f3:42:87:e9:67:a7:3d:1d:b8:27:c1:5e:86:9c:41:c9:06:3a:9a:93:13:47:f5:cc:e0:14:c0:7e:57:e8:ba:f7:4d:67:d3:8f:02:6d:c8:6a:b1:da:05:b7:35:69:7c:33:9f:39:fd:df:23:e9:fe:74:1d:05:d6:6a:f5:10:c0:24:0d:5f:e4:44:ab:09:8f:d8:25:68:81:5b:cf:02:df:71:2d:2c:5d:b1:88:e8:f5:97:ed:36:1d:ea:5d:16:8d:05:bc:ed:01:13:5f:72:ad:2d:a6:70:12:c7:f0:b4:d4:60:05:be:ed:d5:33:8e:89:d2:d6:14:ca:26:8f:a2:d6:bf:99:c2:ae:83:8e:9e:e6:c4:1e:a1:16:ab:11:48:85:55:ca:91:5d:ea:0b:36:a3:81:8b:50:94:51:f4:24:0b:62:87:1e:48:51:02:b1:17:9f:db:98:e1:28:5c:51:fc:76:8c:64:93:c7:90:ca:3d:5b:c0:8d:57:bb:30:2d:ab:43:70:e6:ef:f0:02:42:ee:f1:e6:8d:85:50:0d:2c:5b:40:cc:6d:2b:ef:1f:51:81:8c:c1:2e:13:2c:79:ed:fc:82:f4:b5:bc:90:5a:eb:e1:d5:fe:8b:69Exponent:65537(0x10001)代码
////////////////////////////////RSAfuncRSA(){RSAEncDec()RSASignVerify()}funcRSAEncDec(){origData:=[]byte("RSA待加密数据")//待加密的数据,不能超过指定长度("原文:",string(origData))//生成私钥privateKey,err:=(,2048)iferr!=nil{panic(err)}ShowRSAKeys(privateKey)//生成公钥publicKey:=//根据公钥加密encryptedBytes,err:=((),,publicKey,origData,//需要加密的字符串nil)iferr!=nil{panic(err)}("密文(bytes):",encryptedBytes)("密文(hex):",(encryptedBytes))("密文(base64):",(encryptedBytes))//根据私钥解密decryptedBytes,err:=(nil,encryptedBytes,{Hash:})iferr!=nil{panic(err)}("decryptedmessage:",string(decryptedBytes))("\n\n")}//PKCS1格式的keyfuncShowRSAKeys(rsaPrivateKey*){privateKey:=string(({Type:"RSAPRIVATEKEY",Bytes:(rsaPrivateKey),}))derPkix,err:=()iferr!=nil{return}publicKey:=string(({Type:"PUBLICKEY",Bytes:derPkix,}))("公钥:%v\n私钥:%v\n",publicKey,privateKey)}//签名和验签funcRSASignVerify(){origData:=[]byte("RSA待签名数据")//待签名的数据,长度无影响("原文:",string(origData))//生成私钥privateKey,err:=(,2048)iferr!=nil{panic(err)}ShowRSAKeys(privateKey)//生成公钥publicKey:=//签名hash:=()(origData)sign,err:=(,privateKey,algorithmSign,(nil))iferr!=nil{panic(err)}("签名(bytes):",sign)("签名(hex):",(sign))//验签err=(publicKey,algorithmSign,(nil),sign)iferr==nil{("验签成功")}else{("验签失败")}}funcmain(){RSA()}
结果:
原文:RSA待加密数据公钥:-----BEGINPUBLICKEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuXBB99idiOOKvY3vdNnzgF0XWOrQj9hKb0lqU9phdGC5ngi7gxQpLgzewFL8/B5sXTEIBBsGsg+szwsjAykvPMjgJs7e6hpnNqCiaX7e936DakCZc7Cgkjv7Qc7Flvy2j+A2OyDntVvu/RwAgRNQMNBJ/QR9ErHmhjFJwain+mN42U0ng4WvObonAJMJ70LASxpdpifW2LnHQijn+HHEJ0ZNDLzBrObcoLw+xjMpSg4GazPhgi6bPpBlIEXOSXkNeQ/k8uGyx9XNor4Vqiql24sSzZnoar1hfpTG7SIAkSuqh8wj7dO/zXkbZ/RfA/EVfzS4XKNfFICnP46XuP6WXQIDAQAB-----ENDPUBLICKEY-----私钥:-----BEGINRSAPRIVATEKEY-----MIIEowIBAAKCAQEAuXBB99idiOOKvY3vdNnzgF0XWOrQj9hKb0lqU9phdGC5ngi7gxQpLgzewFL8/B5sXTEIBBsGsg+szwsjAykvPMjgJs7e6hpnNqCiaX7e936DakCZc7Cgkjv7Qc7Flvy2j+A2OyDntVvu/RwAgRNQMNBJ/QR9ErHmhjFJwain+mN42U0ng4WvObonAJMJ70LASxpdpifW2LnHQijn+HHEJ0ZNDLzBrObcoLw+xjMpSg4GazPhgi6bPpBlIEXOSXkNeQ/k8uGyx9XNor4Vqiql24sSzZnoar1hfpTG7SIAkSuqh8wj7dO/zXkbZ/RfA/EVfzS4XKNfFICnP46XuP6WXQIDAQABAoIBAAPZIIVUKXC9yBNG7sEuBK+VPvbJaKqTgnfsvhgfYAZaO3/cDogZ0wDxo226SyWwO+9zJQdwyCLJ0Hw7bu6R3DkWshAcGuQgyCOKEdS+nUHljjSWQpj0AWEHfZ9P+ym29NLnhDiV5jkNP1hhTGFhVTiuGdr2TOImbvI5853hMhswDDWpgpy66/z40Lma4w4Uk5kCBi5aYs0KCPZgiBQQVIYHXvB0ys6ev0PJgkXOK51H8yqqFORDsQyMQJFqMzQ3N0qKYTIAcdtzxnihLXEZOLBaREXbfCXKWj/ZRQocSPcZEHVlct0hbwxka3/2nCHg12cfn9Wbsq9pj0Dehf3HtAECgYEA4VaEBrIyCnCnH4PxwScTDhBAKolzfQkptsr737Xkpf9xOlbGbJSVmDvuH3ARXbbLVGwtBT9yD5wn01ZrAUgsnCDzKQxLAMbejSaCl7vOXf3ovVNgJiU+SLiw44mfnpcvXYa9OKB3GLY8si2gS4If0PNIvuQuj4+uXmbEbdW6iG0CgYEA0qvfqi8n1n/jRkc+hldQgn8QkGfkUmO8HG9dguCXjGTXJlHfIUCvB65yoPivFLa7FORwWxDuvsoRxW15jg5lYfRo1K0OcIRsWUGRsLPh98H4zey34CYnv4L4DOrKFguskpCC0rj5+9RTBQO4MwnqoGl4N7uOWvr8s06qwSv7b7ECgYAdcGIbRdiHyKPs2B4Tb/lrUvAvHnn6EeJjQS2a0namwTKXvpJ5yQeqNdosPUXnimQSCXfwQZOzOmFxmM6uAjHhy+Q4rqR124Vjx240SJLzcKKhaW0cTq1ObuKdN3Olbrqi15zDoB5byaEeS1dM2RzJvzfvPQaQ0LRTojI2sGQKBgQCw6YqTBLSEqbK24r8723kNjRzg143iLkTa8B5r+KTrTgdq85fX+dTCM5mpWgzU7TqfqdI8dzS2XUSdMXjBdY9nufKKnqUgkePW9HwfEoAxKeABNceX4RLB/X7GgiigaL9L+TUTNikfdEcfT+dQXQR+HvPIgaVi+6BYBzjXrVKhkQKBgBvothb8QrSe7GLpMNTr5Y6Y5yJoqezDByeqtNhnjHrmzftGnHI36LF1C7RoxAqjizN9Z/IZhRdkxA59HALjkp7vieoRmlO+VLiW09nX+tLmk7LMeUEWXx7u3Wkp+NfAZywpwWMKzM3aSMtMfvcvVuulZGYFzG33QIP9T9GuX1P7-----ENDRSAPRIVATEKEY-----密文(bytes):[698653693225669819621120035209287119970221924116522691031032636034491076120932711699161219197103996912344237724655795192520712080195477912712342267492853220665225222827311204108167235281001958624353549459424501626168252522252419166116882120231478246857236274547982537278]密文(hex):4589db9cc6b0f157fc41245de14262c4d3c823d11c47c74602dbf1a5e2951f96795b8f2a1abccb0a038fc942781a868ae0993c22b4bd4f59f96b3dd103af919770bdfea66bb1021c79f11063b758c0c6a18e901274db9e92cd0a0fd13a4b3ec5676382813387457b2ced482e374f338289a06dfb5203685624cf7850c32f4f7f73f276eaea0dd58093e24a5b56c4d1d45520ab5e77a5ce41e1de52490bcc6ca7eb029a40d02d3a64c356f33505318e7a3422f5b10f75a25ef59acdc6a010d7bfc99f06a8fc34e11813a67458bb766a228ff323cdd4826fd7e6e7bbc87e904ef65507ec024a3304a4e5ca2fb7dc541ec6994fbdb8fd489bf188279b583c0055b2密文(base64):RYnbnMaw8Vf8QSRd4UJixNPII9EcR8dGAtvxpeKVH5Z5W48qGrzLCgOPyUJ4GoaK4Jk8IrS9T1n5az3RA6+Rl3C9/qZrsQIcefEQY7dYwMahjpASdNueks0KD9E6Sz7FZ2OCgTOHRXss7UguN08zgomgbftSA2hWJM94UMMvT39z8nbq6g3VgJPiSltWxNHUVSCrXnelzkHh3lJJC8xsp+sCmkDQLTpkw1bzNQUxjno0IvWxD3WiXvWazcagENe/yZ8GqPw04RgTpnRYu3ZqIo/zI83Ugm/X5ue7yH6QTvZVB+wCSjMEpOXKL7fcVB7GmU+9uP1Im/GIJ5tYPABVsg==decryptedmessage:RSA待加密数据原文:RSA待签名数据公钥:-----BEGINPUBLICKEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnFXHUNFP7gWmRNyNdXhGcaTrNim4GFKKPBOWLLGN6jURBODRjosJL2B/+6kLPDXCO9tPLPm2suKCVdmlaxgEPoN0g+YA/pmUPBf0B+CJU8fWRZHrpA4aQ9gsCGnfj5bX8U5WCk03YFgkXHbGer1fJkUxK+IksgqOf1Lvr5HPI4oHKjVRA6aOr1qJO82oaQSYSBEmHnQ3Ico7WX2TEQvnt0lrJbt8GDFtcK94Sp+oLr5j/OZy4VFmw+4zNCy2+XpsC5fGcUGEKeLeB3Hm3zkhts6T4imAyCr679dIcNFGgHKHm8uH7c+gNTPfOOjVmOrYgIQRn8j9npR2x0oPnMpvlQIDAQAB-----ENDPUBLICKEY-----私钥:-----BEGINRSAPRIVATEKEY-----MIIEpAIBAAKCAQEAnFXHUNFP7gWmRNyNdXhGcaTrNim4GFKKPBOWLLGN6jURBODRjosJL2B/+6kLPDXCO9tPLPm2suKCVdmlaxgEPoN0g+YA/pmUPBf0B+CJU8fWRZHrpA4aQ9gsCGnfj5bX8U5WCk03YFgkXHbGer1fJkUxK+IksgqOf1Lvr5HPI4oHKjVRA6aOr1qJO82oaQSYSBEmHnQ3Ico7WX2TEQvnt0lrJbt8GDFtcK94Sp+oLr5j/OZy4VFmw+4zNCy2+XpsC5fGcUGEKeLeB3Hm3zkhts6T4imAyCr679dIcNFGgHKHm8uH7c+gNTPfOOjVmOrYgIQRn8j9npR2x0oPnMpvlQIDAQABAoIBACgrwnN51VgMC5VWNuMgbLl27xmTzsIxM2QMhGInnZe42w6t1isSfuG1oi1AWqq2BZrr14RvBgshOOxmaKMEINMPZDkgONEzFWv7m7EKeT8V8nEd9bbKCOW1/lqLGe8Di6ltv54WCUywWWeI/ac8Ud67mM715Qf6vnLpFL3AccFnp12zG5iDct24hPGzvmXBZXBGj5C/8DESU/y1HRUxAO6KTPX8lPdweyQKNdL2p/UMbdXEeMro/L8FNh+OkAltSRdAuTj5VDdrgQa022Qd/h9JxpagbZD1A6tyupQAAsUTZcBJbTeij9jvyOPS22SelQVEgY5B8QiB81GsWps37WECgYEAwLt2jNRBHsMyIfdhJAsdatRalkdjuDRydW3+5PRDuwPnf7TxxZCneNEya0qXGV2Dk5MfiTB1WuD6tzjaJOpaiK6slQhrBq/JB54j8cdDpvN9a5Sjum0zJsQPgL/4NQUgGf2U2shbtxzSG2t3MgQhjPOqoF5bOl5/cWLygLxC5gcCgYEAz6efnPhRryUFs9ng5rsQPCRb9gHhapoeqKAToawyAiRvfMQxSMV61gdjXJRV+3wnbvdNUc2In6YdHsCC26LtgEyYPoSmIUf/7T3MZ8MM6s/YTeA0l/+3qtCX5MazBXxxww64WylZCpucO+dKfaUsoTr6qUc2j2eu7YATRFVc9oMCgYEAvj3MzUIObYEbkS+QcXWPOg4WxNP++Kq8eHF08yaxXH6EGijPpcYdqUJF1GYyM9V8tUS6Ej8E+AmvMQArQ9kYOGbC7/D5RAZsFtrgfB3HB5q9KF32J2T24sMQ0nOrWxqOD1mhfzvaXCtUscAoTfSJ8Ynr2JSK1FjGz3NuD+jE2C0CgYEAhqiZzg4N0nk8qHO674URMx8U74QqrJmDFjCwamAjEdaU4aDMoPdG//JMkeWzmGDbpY8Dee/CEF2FdsK6WTnfsBp7g9c7cEujgDJaElOfVcow59dj48m1TjT0uyvLPdyEXUx3as52anWcrBAB81agiXGYyRtgG0DOZD9wvxhoL4cCgYA6WrasukE5w7wzoRRPIVSGwnSeiG4A8uDaGKa0eNWSoHbggKUTutQ2wnB1O89n4AyDN9tIXKxT0XH3a96AA0RUsW9apbQeuyxGAf2R+varlaLsm99xP2x67YfRXcLByG+RIQDRx//HR64k+BptmZ4MyLp7hyAi4XtXLEO4B9Rpmg==-----ENDRSAPRIVATEKEY-----签名(bytes):[6112125542043444381244683738210196744085712534393462542471912321982281216226229732222303857542042359249235190307772491031206523154361619238338163360432481922199836361648399852061022259532519897202980121912602281912251231623251717212420923078245861222911127512423322216016223711012602491121196678722083812422849221]签名(hex):9908a5d756707d36cc222c267cb7abc290442526d2c44a2855471922035d2efef7bfe8c6e40c7357edf62ee2e549dee6263936aadbfe57cceb09f9ebbe1e4db914376461f9677841e78ad694af869d00cd40241013ee21513f249b9a778c2bf8c0db6285f15b58ecb54c4eeeeca4b7c4aab2275b4f93c62d55ce65479f88b6e18d587e3c3b35fbaa051e99ef59b494d8eddaa3cd969773490d0a934eb4fb1d50b911c23d70bf88f08eb63ce4bfe17ba203d9e03bd05f72a61badab8bb2f852487cd1e64ef5567ad5ab9e715b0b9e80c498864015784d945ff906463318e9dea0b4da1b84a2ed6e7ebc7d6e82f9b16c9f8d7913424e48d0267ce48d7c4d4f95dd验签成功摘要算法-SHA256说明
摘要算法比对称算法和非对称算法要容易理解。
对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示。
摘要计算的速度比较快:
以一个60M的文件为测试样本,经过1000次的测试平均值,三种算法的表现为:
MD5算法运行1000次的平均时间为:226ms
SHA1算法运行1000次的平均时间为:308ms
SHA256算法运行1000次的平均时间为:473ms
代码funcSHA256(){src:="sha256待处理数据"("原文:",string(src))m:=()([]byte(src))res:=((nil))("sha256摘要数据:",res)//长度256bit,64字节("\n\n")}funcmain(){SHA256()}
结果:
原文:sha256待处理数据
sha256摘要数据:703d4c3b6d0a73831112d78b0369511483f0de671839c79b119a6587394b7237
最后对于上面的算法只进行了简单介绍,具体的实现逻辑大家可以找资料继续研究。
世界果然是数学的!
计算机追到根上,都是数学!
资料golangrc4加密算法的使用
什么是对称加密(对称加密简介)
Golang里的AES加密、解密
高级加密标准(AdvancedEncryptionStandard,AES)
密码学基础:AES加密算法
AES五种加密模式(CBC、ECB、CTR、OCF、CFB)
AES加密模式总结
RSA加密的限制
golang实现RSA加密解密算法
RSA算法多种生成公私钥的方式
RSA密钥证书的生成
(4)opensslrsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
关于RSA加密/解密中OAEP填充模式和PKCS1-v1_5填充模式时对于原文数据的要求
golang语言rsa加解密及签名验签
RSA签名和验签
RSA加密、解密、签名、验签(验证签名)RSA算法原理
SHA256简介
加密算法比较:SHA1,SHA256(SHA2),MD5
【Golang】golang实现sha256加密函数
最后我的个人博客为:
往期文章回顾:
设计模式
招聘
思考
存储
算法系列
读书笔记
小工具
架构
网络
Go语言