2023年7月31日发(作者:)

Go密码学AES加密算法Go 密码学 AES加密算法AES是对称加密算法,加密和解密使⽤同⼀个密钥,这种加密⽅式也称单密钥加密。常见的对称加密算法还有DES,这个算法后来由于可以暴⼒破解,被AES所替代。AES特点1. 加密速度快,可以加密⼤⽂件2. 密⽂可逆,⼀旦密钥泄露,就会导致数据暴露AES规格密钥长度有128bit,192bit,256bit三种在go提供的接⼝中密钥长度只能是16字节。如果明⽂长度不够,会按照缺少的个数添加⼏个,⽐如,最后⼀块缺少7个字节,那么就会补充7个7到后⾯。解密的时候删除即可。// GetRandomBytes

随机⽣成⼀串字符func GetRandomBytes(len int) ([]byte, error) { if len < 0 { return nil, ("Len must be larger than 0") } buffer := make([]byte, len) n, err := (buffer) if err != nil { return nil, err } if n != len { return nil, ("Buffer not filled. Requested [%d], got [%d]", len, n) } return buffer, nil}func pkcs7Padding(src []byte) []byte { //

后⾯补充缺少长度的数字 padding := ize - len(src)%ize padtext := ([]byte{byte(padding)}, padding) //

返回padding个[]byte{byte(padding)串联形成的新的切⽚。 return append(src, )}func pkcs7UnPadding(src []byte) ([]byte, error) { //

删除末尾添加的填充位置的数据 length := len(src) unpadding := int(src[length-1]) if unpadding > ize || unpadding == 0 { return nil, ("Invalid pkcs7 padding (unpadding > ize || unpadding == 0)") } pad := src[len(src)-unpadding:] for i := 0; i < unpadding; i++ { if pad[i] != byte(unpadding) { return nil, ("Invalid pkcs7 padding (pad[i] != unpadding)") } } return src[:(length - unpadding)], nil}func aesCBCEncrypt(key, s []byte) ([]byte, error) { //

使⽤aes cbc模式:加密⽐aes密钥字节长的明⽂模式 if len(s)%ize != 0 { if len(s)%ize != 0 { return nil, ("Invalid plaintext. It must be a multiple of the block size") } block, err := her(key) //

返回⼀个底层加密块 if err != nil { return nil, err } ciphertext := make([]byte, ize+len(s)) //

密⽂ iv := ciphertext[:ize] //

初始向量 if _, err := ll(, iv); err != nil { return nil, err } mode := Encrypter(block, iv) //

返回⼀个⽤上⾯底层加密块的CBC模式的加密器 locks(ciphertext[ize:], s) return ciphertext, nil}func aesCBCDecrypt(key, src []byte) ([]byte, error) { //

解密 block, err := her(key) //

返回⼀个加密块 if err != nil { return nil, err } if len(src) < ize { return nil, ("Invalid ciphertext. It must be a multiple of the block size") } iv := src[:ize] src = src[ize:] if len(src)%ize != 0 { return nil, ("Invalid ciphertext. It must be a multiple of the block size") } mode := Decrypter(block, iv) locks(src, src) return src, nil}// AESCBCPKCS7Encrypt combines CBC encryption and PKCS7 paddingfunc AESCBCPKCS7Encrypt(key, src []byte) ([]byte, error) { //

按照AES CBC

模式加密 // First pad tmp := pkcs7Padding(src) // Then encrypt return aesCBCEncrypt(key, tmp)}// AESCBCPKCS7Decrypt combines CBC decryption and PKCS7 unpaddingfunc AESCBCPKCS7Decrypt(key, src []byte) ([]byte, error) { //

按照 AES CBC

模式解密 // First decrypt pt, err := aesCBCDecrypt(key, src) if err == nil { return pkcs7UnPadding(pt) } return nil, err}type aescbcpkcs7Encryptor struct{} //

创建空结构体,不占⽤内存,⽆需传递数据,这⾥只是包含⼀些需要的⽅法func (*aescbcpkcs7Encryptor) Encrypt(k , plaintext []byte, opts terOpts) (ciphertext []byte, err error) { // aes,cbc模式加密选项func (*aescbcpkcs7Encryptor) Encrypt(k , plaintext []byte, opts terOpts) (ciphertext []byte, err error) { // aes,cbc模式加密选项 switch opts.(type) { case *PKCS7ModeOpts, PKCS7ModeOpts: // AES in CBC mode with PKCS7 padding return AESCBCPKCS7Encrypt(k.(*aesPrivateKey).privKey, plaintext) //

? (k.(*aesPrivateKey).privKey default: return nil, ("Mode not recognized [%s]", opts) }}type aescbcpkcs7Decryptor struct{}func (*aescbcpkcs7Decryptor) Decrypt(k , ciphertext []byte, opts terOpts) (plaintext []byte, err error) { // aes,cbc模式加密选项 // check for mode switch opts.(type) { case *PKCS7ModeOpts, PKCS7ModeOpts: // AES in CBC mode with PKCS7 padding return AESCBCPKCS7Decrypt(k.(*aesPrivateKey).privKey, ciphertext) default: return nil, ("Mode not recognized [%s]", opts) }}上⾯就是区块链中对于AES算法的使⽤,其中CBC加密模式的描述如下:其中带有+的圆圈表⽰进⾏异或运算,GetRandomBytes()⽅法⽤于⽣成初始向量,箭头代表结果顺着箭头输⼊到下⼀步运算中。

2023年7月31日发(作者:)

Go密码学AES加密算法Go 密码学 AES加密算法AES是对称加密算法,加密和解密使⽤同⼀个密钥,这种加密⽅式也称单密钥加密。常见的对称加密算法还有DES,这个算法后来由于可以暴⼒破解,被AES所替代。AES特点1. 加密速度快,可以加密⼤⽂件2. 密⽂可逆,⼀旦密钥泄露,就会导致数据暴露AES规格密钥长度有128bit,192bit,256bit三种在go提供的接⼝中密钥长度只能是16字节。如果明⽂长度不够,会按照缺少的个数添加⼏个,⽐如,最后⼀块缺少7个字节,那么就会补充7个7到后⾯。解密的时候删除即可。// GetRandomBytes

随机⽣成⼀串字符func GetRandomBytes(len int) ([]byte, error) { if len < 0 { return nil, ("Len must be larger than 0") } buffer := make([]byte, len) n, err := (buffer) if err != nil { return nil, err } if n != len { return nil, ("Buffer not filled. Requested [%d], got [%d]", len, n) } return buffer, nil}func pkcs7Padding(src []byte) []byte { //

后⾯补充缺少长度的数字 padding := ize - len(src)%ize padtext := ([]byte{byte(padding)}, padding) //

返回padding个[]byte{byte(padding)串联形成的新的切⽚。 return append(src, )}func pkcs7UnPadding(src []byte) ([]byte, error) { //

删除末尾添加的填充位置的数据 length := len(src) unpadding := int(src[length-1]) if unpadding > ize || unpadding == 0 { return nil, ("Invalid pkcs7 padding (unpadding > ize || unpadding == 0)") } pad := src[len(src)-unpadding:] for i := 0; i < unpadding; i++ { if pad[i] != byte(unpadding) { return nil, ("Invalid pkcs7 padding (pad[i] != unpadding)") } } return src[:(length - unpadding)], nil}func aesCBCEncrypt(key, s []byte) ([]byte, error) { //

使⽤aes cbc模式:加密⽐aes密钥字节长的明⽂模式 if len(s)%ize != 0 { if len(s)%ize != 0 { return nil, ("Invalid plaintext. It must be a multiple of the block size") } block, err := her(key) //

返回⼀个底层加密块 if err != nil { return nil, err } ciphertext := make([]byte, ize+len(s)) //

密⽂ iv := ciphertext[:ize] //

初始向量 if _, err := ll(, iv); err != nil { return nil, err } mode := Encrypter(block, iv) //

返回⼀个⽤上⾯底层加密块的CBC模式的加密器 locks(ciphertext[ize:], s) return ciphertext, nil}func aesCBCDecrypt(key, src []byte) ([]byte, error) { //

解密 block, err := her(key) //

返回⼀个加密块 if err != nil { return nil, err } if len(src) < ize { return nil, ("Invalid ciphertext. It must be a multiple of the block size") } iv := src[:ize] src = src[ize:] if len(src)%ize != 0 { return nil, ("Invalid ciphertext. It must be a multiple of the block size") } mode := Decrypter(block, iv) locks(src, src) return src, nil}// AESCBCPKCS7Encrypt combines CBC encryption and PKCS7 paddingfunc AESCBCPKCS7Encrypt(key, src []byte) ([]byte, error) { //

按照AES CBC

模式加密 // First pad tmp := pkcs7Padding(src) // Then encrypt return aesCBCEncrypt(key, tmp)}// AESCBCPKCS7Decrypt combines CBC decryption and PKCS7 unpaddingfunc AESCBCPKCS7Decrypt(key, src []byte) ([]byte, error) { //

按照 AES CBC

模式解密 // First decrypt pt, err := aesCBCDecrypt(key, src) if err == nil { return pkcs7UnPadding(pt) } return nil, err}type aescbcpkcs7Encryptor struct{} //

创建空结构体,不占⽤内存,⽆需传递数据,这⾥只是包含⼀些需要的⽅法func (*aescbcpkcs7Encryptor) Encrypt(k , plaintext []byte, opts terOpts) (ciphertext []byte, err error) { // aes,cbc模式加密选项func (*aescbcpkcs7Encryptor) Encrypt(k , plaintext []byte, opts terOpts) (ciphertext []byte, err error) { // aes,cbc模式加密选项 switch opts.(type) { case *PKCS7ModeOpts, PKCS7ModeOpts: // AES in CBC mode with PKCS7 padding return AESCBCPKCS7Encrypt(k.(*aesPrivateKey).privKey, plaintext) //

? (k.(*aesPrivateKey).privKey default: return nil, ("Mode not recognized [%s]", opts) }}type aescbcpkcs7Decryptor struct{}func (*aescbcpkcs7Decryptor) Decrypt(k , ciphertext []byte, opts terOpts) (plaintext []byte, err error) { // aes,cbc模式加密选项 // check for mode switch opts.(type) { case *PKCS7ModeOpts, PKCS7ModeOpts: // AES in CBC mode with PKCS7 padding return AESCBCPKCS7Decrypt(k.(*aesPrivateKey).privKey, ciphertext) default: return nil, ("Mode not recognized [%s]", opts) }}上⾯就是区块链中对于AES算法的使⽤,其中CBC加密模式的描述如下:其中带有+的圆圈表⽰进⾏异或运算,GetRandomBytes()⽅法⽤于⽣成初始向量,箭头代表结果顺着箭头输⼊到下⼀步运算中。