python的AES解密CBC模式怎么移植到golang啊。挠头

jayesslin · 2019-09-26 16:53:26 · 2464 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-09-26 16:53:26 的主题,其中的信息可能已经有所发展或是发生改变。

python 代码如下:

def decrypt_netlog(raw_data):
    base64_decoded_data = base64.b64decode(raw_data)
    if len(base64_decoded_data) < kIvSize * 2 + kHashSize:
        raise DecryptError('Invalid data length.')
    if not hmac.compare_digest(hmac.new(hmac_key, base64_decoded_data[:-kHashSize], hashlib.sha256).digest(),
                               base64_decoded_data[-kHashSize:]):
        raise DecryptError('HMAC checking failed.')
    iv = base64_decoded_data[:kIvSize]
    cipher = AES.new(encryption_key, AES.MODE_CBC, iv)
    text = cipher.decrypt(base64_decoded_data[kIvSize:-kHashSize])
    return zlib.decompress(text, 16 + zlib.MAX_WBITS)

golang 里AES 的block概念是个啥呀。。。。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2464 次点击  
加入收藏 微博
2 回复  |  直到 2019-09-26 17:56:25
tpkeeper
tpkeeper · #1 · 6年之前

aes 是分组密码,一个block相当于一个组

jayesslin
jayesslin · #2 · 6年之前

golang 对应的搞定:

func AesCBCDncrypt(encryptData, key []byte) ([]byte,error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }

    blockSize := kIvSize

    if len(encryptData) < blockSize {
        panic("ciphertext too short")
    }
    //iv := encryptData[:blockSize]
    iv := encryptData[:kIvSize]
    encryptData = encryptData[blockSize:len(encryptData)-kHashSize]

    // CBC mode always works in whole blocks.
    if len(encryptData)%blockSize != 0 {
        panic("ciphertext is not a multiple of the block size")
    }

    mode := cipher.NewCBCDecrypter(block, iv)

    // CryptBlocks can work in-place if the two arguments are the same.
    mode.CryptBlocks(encryptData, encryptData)
    //解填充
    encryptData = PKCS7UnPadding(encryptData)
    return encryptData,nil
}
func PKCS7UnPadding(origData []byte) []byte {
    length := len(origData)
    unpadding := int(origData[length-1])
    return origData[:(length - unpadding)]
}
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传