[Golang]实现AES/ECB/PKCS5Padding加密base64-url-safe编码

来源:vimiix   |   更新时间: 10月前   |   分类: 


ECB算法没有包含在标准库中

package main

import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "fmt"
    "strconv"
    "strings"
)

func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

func Encrypt(plantText, key string) ([]byte, error) {
    block, err := aes.NewCipher([]byte(key)) //选择加密算法
    if err != nil {
        return nil, err
    }
    content := []byte(plantText)
    content = PKCS5Padding(content, block.BlockSize())
    ecb := NewECBEncrypter(block)
    ciphertext := make([]byte, len(content))
    ecb.CryptBlocks(ciphertext, content)
    return ciphertext, nil
}

func Base64UrlSafeEncode(source []byte) string {
    // Base64 Url Safe is the same as Base64 but does not contain '/' and '+' (replaced by '_' and '-') and trailing '=' are removed.
    bytearr := base64.StdEncoding.EncodeToString(source)
    safeurl := strings.Replace(string(bytearr), "/", "_", -1)
    safeurl = strings.Replace(safeurl, "+", "-", -1)
    safeurl = strings.Replace(safeurl, "=", "", -1)
    return safeurl
}

type ecb struct {
    b         cipher.Block
    blockSize int
}

func newECB(b cipher.Block) *ecb {
    return &ecb{
        b:         b,
        blockSize: b.BlockSize(),
    }
}

type ecbEncrypter ecb

func NewECBEncrypter(b cipher.Block) cipher.BlockMode {
    return (*ecbEncrypter)(newECB(b))
}

func (x *ecbEncrypter) BlockSize() int { return x.blockSize }

func (x *ecbEncrypter) CryptBlocks(dst, src []byte) {
    if len(src)%x.blockSize != 0 {
        panic("crypto/cipher: input not full blocks")
    }
    if len(dst) < len(src) {
        panic("crypto/cipher: output smaller than input")
    }
    for len(src) > 0 {
        x.b.Encrypt(dst, src[:x.blockSize])
        src = src[x.blockSize:]
        dst = dst[x.blockSize:]
    }
}

type ecbDecrypter ecb

func NewECBDecrypter(b cipher.Block) cipher.BlockMode {
    return (*ecbDecrypter)(newECB(b))
}

func (x *ecbDecrypter) BlockSize() int { return x.blockSize }

func (x *ecbDecrypter) CryptBlocks(dst, src []byte) {
    if len(src)%x.blockSize != 0 {
        panic("crypto/cipher: input not full blocks")
    }
    if len(dst) < len(src) {
        panic("crypto/cipher: output smaller than input")
    }
    for len(src) > 0 {
        x.b.Decrypt(dst, src[:x.blockSize])
        src = src[x.blockSize:]
        dst = dst[x.blockSize:]
    }
}

func main() {
    p := strconv.FormatFloat(0.56, 'f', 2, 64)
    fmt.Println(p)
    c, _ := Encrypt(p, "0123456789abcdef")
    fmt.Println(Base64UrlSafeEncode(c))
}
查看原文

我的 2019 PyCon China 小结(下)

来源:laike9m   |   更新时间: 10月前   |   分类: 


SEP 27TH, 2019

《捕蛇者说》特别篇晚宴Day 1嘉宾采访我的演讲展台其它吃饭CMGS 来访Day 2总结

2019 年 9 月 20 号下午。

出租车正驶向兴荣温德姆酒店。Adam 发微信说他到了,正准备去买杯星巴克。我说帮我带瓶水吧。Manjusaka 也要一瓶。laixintao 回了句“哪里”。

这一天终于到了。

查看原文

在 Python 中,is 并不一定包含==

来源:kingname   |   更新时间: 10月前   |   分类: Python


在我们日常使用 Python 时,大家可能有这样一种认识:

>>> a = 'abc!'
>>> b = 'abc!'
>>> a == b
True
>>> a is b
False
>>> c = a
>>> a is c
True
>>> a == c
True
查看原文

Elasticsearch批量插入时,存在就不插入

来源:kingname   |   更新时间: 10月前   |   分类: Elasticsearch


当我们使用 Elasticsearch-py 批量插入数据到 ES 的时候,我们常常使用它的helpers模块里面的bulk函数。其使用方法如下:

from elasticsearch import helpers, Elasticsearch
es = Elasticsearch(xxx)
def generator():
datas = [1, 2, 3]
for data in datas:
yield {
'_id': "xxx",
'_source': {
'age': data
}
}
helpers.bulk(es,
index='xxx',
generator(),
doc_type='doc',)
查看原文

聊聊 Python 的单元测试框架(三):最火的 pytest

来源:prodesire   |   更新时间: 10月前   |   分类: Python


本篇文章是《聊聊 Python 的单元测试框架》的第三篇,前两篇分别介绍了标准库 unittest 和第三方单元测试框架 nose。作为本系列的最后一篇,压轴出场的是 Python 世界中最火的第三方单元测试框架:pytest。

pytest 项目地址:https://github.com/pytest-dev/pytest

它有如下主要特性:

和前面介绍unittest和nose一样,我们将从如下几个方面介绍pytest的特性。

查看原文

通过某瓣真实案例看Elasticsearch优化

来源:dongwm   |   更新时间: 10月前   |   分类: python3


我瓣用户产品中有多个核心场景都在使用 Elasticsearch (以下简称 ES),主要用在全文搜索、聚合计算等方面。ES 相关的功能开发者主要是我,我最早是 2016 年在选影视的功能上开始使用 ES 做结构化搜索,这个工具给运营同学和资深用户提供了按各种复杂条件找电影的,可以说是最好的途径。

这个项目为多个核心产品功能提供原始数据,这几年它历经多次迭代和功能完善,不过最近它出了一点问题,我觉得解决问题的过程很值得写篇文章分享一下,所以就有了此文。

查看原文

我的 2019 PyCon China 小结(上)

来源:laike9m   |   更新时间: 10月前   |   分类: 


SEP 24TH, 2019

坐在从上海开往北京的高铁上,我开始敲这篇文章。

Kenneth Reitz 曾经说,他的一年是按 PyCon 计算的。尽管围绕他有很多争议,这句话依然让我有了奇妙的共鸣。对他来说,"PyCon"自然是指 PyCon US,而对我来说,则是 PyCon China。

2013 年是我第一次参加 PyCon。当时还在 UCAS 念书,而会场正好在教学楼(虽然我其实并不在那里上课)。虽然 Google Drive 里还存着当年的 slide,然而关于大会,我仅存的记忆就是有讲师给了一个中国版的Python Epiphaniestalk,并且有一个很厉害的提问者和讲师讨论了一些我似懂非懂的概念。

查看原文

GNE 预处理技术——如何移除特定标签但是保留文字到父标签

来源:kingname   |   更新时间: 10月前   |   分类: GNE


在开发新闻网页正文通用抽取器GNE的过程中,需要对目标网页的源代码进行一些预处理,从而提高正文抓取的准确性。其中之一就是把

标签内部的标签中的文本,合并到

标签中,再删除标签。

例如:

<html>
<head>
<title>演示合并节点</title>
</head>
<body>
<div>
<p>你好,<span>世界;</span>你好,<span>产品经理</span></p>
</div>
</body>
</html>
查看原文

Python项目容器化实践(一) - Docker Compose

来源:dongwm   |   更新时间: 10月前   |   分类: docker


作为开发者应该对新技术保持敏锐度,愿意尝试和接受新事物。我从2013 年开始关注 LXC 和 Docker,当时我还在做很多运维方面的工作,那会 Docker 刚发布不久,问题很多还不能在生产环境使用;在 2016 年我的书中也提供了 Docker 镜像,读者可以方便的使用这个包含全部代码和相关依赖的环境;而现在 Docker 容器已经被各大互联网公司广泛应用,而且由于 Docker 和 Etcd 等项目还算捧红了 Golang~

查看原文

PyCon China 2019演讲Slide: Django Migration Under the Hood

来源:卡瓦邦噶   |   更新时间: 10月前   |   分类: Python


这是在 PyCON 2019 的分享,内容是 Django Migration 的用法、原理(没有非常深入),常见问题等。

在线播放 Slide 的地址:https://gitpitch.com/laixintao/django-migrations-under-the-hood

Slide 的源代码在 Github 上:https://github.com/laixintao/django-migrations-under-the-hood

查看原文

聊聊 Python 的单元测试框架(二):nose 和它的继任者 nose2

来源:prodesire   |   更新时间: 10月前   |   分类: Python


本文首发于HelloGitHub公众号。

nose是一个第三方单元测试框架,它完全兼容unittest,并且号称是一个更好用的测试框架。

那么nose除了具备unittest的所有功能外,还具有哪些优势呢?

用例的编写方式除了编写继承于unittest.TestCase的测试类外,还可以编写成没有继承的测试类。比如,写成如下形式也会被nose视作一个测试类:

查看原文

使用concurrent.futures的一些经验

来源:dongwm   |   更新时间: 10月前   |   分类: concurrent.futures


concurrent.futures是 Python3.2 加入标准库的一个模块,它提供异步执行回调高层接口,是对线程池和进程池的进一步封装,让开发者可以使用统一的接口非常容易的使用线程池和进程池。

之前我写过一篇叫做使用 Python 进行并发编程 - PoolExecutor 篇的文章介绍它,经过这几年的使用又积累了一些经验和思考借着这个周末记录下来

这一小节先整体回顾一下concurrent.futures模块的重要内容。

查看原文

聊聊 Python 的单元测试框架(一):unittest

来源:prodesire   |   更新时间: 10月前   |   分类: Python


本文首发于HelloGitHub公众号。

说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是unittest。的确,作为 Python 的标准库,它很优秀,并被广泛用于各个项目。但你知道吗?其实在 Python 众多项目中,主流的单元测试框架远不止这一个。

本系列文章将为大家介绍目前流行的 Python 的单元测试框架,讲讲它们的功能和特点并比较其异同,以让大家在面对不同场景、不同需求的时候,能够权衡利弊,选择最佳的单元测试框架。

查看原文

COSCUP 2019:如何在两年内从初学者成长为流行开源项目维护者和技术书作者?

来源:greyli   |   更新时间: 10月前   |   分类: 演讲和教程


这是我在COSCUP2019 第一天下午的演讲,主要介绍了这两年的经历和一些经验,內容偏娱乐向(本来想说内容很水,但又想到在台湾「很水」就是「很强」的意思……)。有时间会写一篇文章记录参加 COSCUP 的经历和感想。

相关资源

对于录像内容的一些备注:

查看原文

COSCUP 2019:如何在两年内从初学者成长为流行开源项目维护者和技术书作者?

来源:greyli   |   更新时间: 10月前   |   分类: 演讲和教程


这是我在COSCUP2019 第一天下午的演讲,主要介绍了这两年的经历和一些经验,內容偏娱乐向(本来想说内容很水,但又想到在台湾「很水」就是「很强」的意思……)。有时间会写一篇文章记录参加 COSCUP 的经历和感想。

相关资源

对于录像内容的一些备注:

查看原文

新闻类网页正文通用抽取器(一)——项目介绍

来源:kingname   |   更新时间: 11月前   |   分类: GNE


开发这个项目,源自于我在知网发现了一篇关于自动化抽取新闻类网站正文的算法论文——《基于文本及符号密度的网页正文提取方法》)

这篇论文中描述的算法看起来简洁清晰,并且符合逻辑。但由于论文中只讲了算法原理,并没有具体的语言实现,所以我使用 Python 根据论文实现了这个抽取器。并分别使用今日头条、网易新闻、游民星空、观察者网、凤凰网、腾讯新闻、ReadHub、新浪新闻做了测试,发现提取效果非常出色,几乎能够达到100%的准确率。

查看原文

PyCon China 2019 闪电演讲

来源:greyli   |   更新时间: 11月前   |   分类: 活动与游记


什么是闪电演讲?

闪电演讲(lightning talk)是指 5~10 分钟长度的快速演讲。通常会将多个闪电演讲安排在一起,有时也被称作数据突袭(data blitz)。

PyCon 闪电演讲会是什么样子?

在我的推动下,今年的PyCon China正式引入了闪电演讲环节,将会作为大会的特殊项目放到最后进行,而且在时间上是独占的。所有的闪电演讲都会控制在 5 分钟左右,并且和 Python 相关。上海场的闪电演讲会放到分会场 B(Web 专场)进行,下午四点四十分开始,一定记得来参加哦!

查看原文

PyCon China 2019 闪电演讲

来源:greyli   |   更新时间: 11月前   |   分类: 活动与游记


什么是闪电演讲?

闪电演讲(lightning talk)是指 5~10 分钟长度的快速演讲。通常会将多个闪电演讲安排在一起,有时也被称作数据突袭(data blitz)。

PyCon 闪电演讲会是什么样子?

在我的推动下,今年的PyCon China正式引入了闪电演讲环节,将会作为大会的特殊项目放到最后进行,而且在时间上是独占的。所有的闪电演讲都会控制在 5 分钟左右,并且和 Python 相关。上海场的闪电演讲会放到分会场 B(Web 专场)进行,下午四点四十分开始,一定记得来参加哦!

查看原文

要不我们还是用回 virtualenv/venv 和 pip 吧

来源:greyli   |   更新时间: 11月前   |   分类: 计算机与编程


这篇文章没什么新东西,只是介绍古老又靠谱的 Python 虚拟环境和依赖管理方式:virtualenv/venv+pip。一来方便被我在《Flask 入门教程》和《Flask Web 开发实战》带入Pipenv 坑的初学者了解基础工具的用法,二来方便其他 Python 初学者参考,自己顺便做个总结。如果你想了解更多详细内容,Python 官方教程这一章写的更好,可以替代这篇文章。

既然大部分试图简化 Python 虚拟环境和依赖管理工作流程的新工具都不够稳定,继续使用 virtualenv/venv 和 pip 这样的底层工具也是一个不错的选择,而且大多数人也是这么做的。它们虽然用起来有一点麻烦,但至少更可靠。

查看原文

要不我们还是用回 virtualenv/venv 和 pip 吧

来源:greyli   |   更新时间: 11月前   |   分类: 计算机与编程


这篇文章没什么新东西,只是介绍古老又靠谱的 Python 虚拟环境和依赖管理方式:virtualenv/venv+pip。一来方便被我在《Flask 入门教程》和《Flask Web 开发实战》带入Pipenv 坑的初学者了解基础工具的用法,二来方便其他 Python 初学者参考,自己顺便做个总结。如果你想了解更多详细内容,Python 官方教程这一章写的更好,可以替代这篇文章。

既然大部分试图简化 Python 虚拟环境和依赖管理工作流程的新工具都不够稳定,继续使用 virtualenv/venv 和 pip 这样的底层工具也是一个不错的选择,而且大多数人也是这么做的。它们虽然用起来有一点麻烦,但至少更可靠。

查看原文

本页内容使用均遵循相关开源协议,部分内容获得作者本人授权