Go加密解密之AES

Go加密解密之AES

一、AES简介

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,这个标准用来替代原先的DES。AES加密数据块分组长度必须为128bit,密钥长度可以是128bit、192bit、256bit中的任意一个。
AES也是对称加密算法。关于该算法的更多信息可以参考 http://baike.baidu.com/view/2310288.htm

二、Go AES加密解密

学会了DES加密后,AES加密相当简单。除了第一步,将crypto/des包换为crypto/aes外,其他几乎一样。当然,需要注意的是密钥长度和iv的长度。

DES中blocksize是8byte,AES中则是16byte(128bit)。

AES包中,使用函数func NewCipher(key []byte) (cipher.Block, error),和DES一样(包不一样)

由于详细讲解了DES之后,Goes实现AES加解密十分简单,这里只给出关键代码,不做详细解释

func AesEncrypt(origData, key []byte) ([]byte, error) {
     block, err := aes.NewCipher(key)
     if err != nil {
          return nil, err
     }
     blockSize := block.BlockSize()
     origData = PKCS5Padding(origData, blockSize)
     // origData = ZeroPadding(origData, block.BlockSize())
     blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
     crypted := make([]byte, len(origData))
     // 根据CryptBlocks方法的说明,如下方式初始化crypted也可以
     // crypted := origData
     blockMode.CryptBlocks(crypted, origData)
     return crypted, nil
}

func AesDecrypt(crypted, key []byte) ([]byte, error) {
     block, err := aes.NewCipher(key)
     if err != nil {
          return nil, err
     }
     blockSize := block.BlockSize()
     blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
     origData := make([]byte, len(crypted))
     // origData := crypted
     blockMode.CryptBlocks(origData, crypted)
     origData = PKCS5UnPadding(origData)
     // origData = ZeroUnPadding(origData)
     return origData, nil
}

对比上篇DES加密的代码,几乎一样。

三、和其他语言交互:加解密

和DES一样,实现了PHP、Java版本。具体代码在github上

1 Star2 Stars3 Stars4 Stars5 Stars (还没有人评分,赶紧评一下)
Loading...

2 thoughts on “Go加密解密之AES

  1. .\encryption.go:27: undefined: PKCS5Padding
    .\encryption.go:47: undefined: PKCS5UnPadding

    请问这2个方法是在哪里定义的?

发表评论

电子邮件地址不会被公开。