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