文档章节

python和javascript共用的base64加解密代码

DatoChen
 DatoChen
发布于 2015/03/09 21:42
字数 420
阅读 104
收藏 0

最近在OpenEDX中开发了个新的组件,其中需要支持上传功能。由于全都是异步操作,而一些现有的文件上传的库都失效不可用。所以想自己将文件编码成base64,扔到服务端,服务端接收解码保存,以此来实现文件上传的功能。之前在javascript中加解密部分一直喜欢用CryptoJS库。结果发现此库对数据Base64编码后,python的base64库解密不出来。后来更换了js-base64 这个库,还是不行,于是自己用coffeescript写了一个。这里存档,以备后用。

<!-- lang: python -->
class CSTBase64
    @_keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
    @encode = (s) ->
        res = []
        leftover = s.length % 3
        end = s.length - leftover
        for i in [0 .. end] by 3
            c2 = s.charCodeAt(i);
            c1 = s.charCodeAt(i+1);
            c0 = s.charCodeAt(i+2);
            res.push(@_keyStr[(c2 >> 2) & 0x3f])
            res.push(@_keyStr[((c2 & 0x3) << 4) | ((c1 >> 4) & 0x0f)])
            res.push(@_keyStr[((c1 & 0x0f) << 2) | ((c0 >> 6) & 0x03)])
            res.push(@_keyStr[c0 & 0x3f])

        i += 3
        if leftover == 1
            c2 = s.charCodeAt(i);
            res.push(@_keyStr[(c2 >> 2) & 0x3f])
            res.push(@_keyStr[(c2 & 0x3) << 4])
            res.push(@_keyStr[-1..])
            res.push(@_keyStr[-1..])

        else if leftover == 2
            c2 = s.charCodeAt(i);
            c1 = s.charCodeAt(i+1);
            res.push(@_keyStr[(c2 >> 2) & 0x3f])
            res.push(@_keyStr[((c2 & 0x3) << 4) | ((c1 >> 4) & 0x0f)])
            res.push(@_keyStr[(c1 & 0x0f) << 2])
            res.push(@_keyStr[-1..])

        return res.join("")


    @decode = (s)->
        res = []
        end = len(s)
        if s[-1] == @_keyStr[-1..]
            end -= 4

        for i in [0 .. end] by 4
            c3 = @_keyStr.indexOf(s[i])
            c2 = @_keyStr.indexOf(s[i+1])
            c1 = @_keyStr.indexOf(s[i+2])
            c0 = @_keyStr.indexOf(s[i+3])

            res.push(String.fromCharCode(((c3 << 2)) | ((c2 >> 4) & 0x03)))
            res.push(String.fromCharCode(((c2 & 0x0f) << 4) | ((c1 >> 2) & 0x0f)))
            res.push(String.fromCharCode(((c1 & 0x03) << 6) | (c0 & 0x03f)))

        if end < len(s)
            if s[-2] == @_keyStr[-1..]
                c3 = @_keyStr.indexOf(s[end])
                c2 = @_keyStr.indexOf(s[end+1])
                res.push(String.fromCharCode(((c3 << 2)) | ((c2 >> 4) & 0x03)))
            else
                c3 = @_keyStr.indexOf(s[end])
                c2 = @_keyStr.indexOf(s[end+1])
                c1 = @_keyStr.indexOf(s[end+2])

                res.push(String.fromCharCode(((c3 << 2)) | ((c2 >> 4) & 0x03)))
                res.push(String.fromCharCode(((c2 & 0x0f) << 4) | ((c1 >> 2) & 0x0f)))
        return res.join("")

© 著作权归作者所有

DatoChen
粉丝 2
博文 3
码字总数 2326
作品 0
青岛
程序员
私信 提问
基于Nodejs的微信消息加密与解密实现概要

微信团队提供了多种语言的示例代码,但不包含Nodejs实现版本。经过大量查证和尝试,我已完成并测试通过,下面说说实现要点。 准备 Nodejs为版或版,当前最新稳定版。 平台支持Windows和Linux...

一点灵犀
2015/04/08
0
2
python爬虫遇到JS加密,pyv8运行js,详细解密过程

首先说一下什么是加密,所谓js加密大多出现在表单提交过程中,下面我将以中国电信为例,详细讲解如何利用pyv8来加密登录的密码。要说明的是pyv8目前仅仅支持python2,用的下伙伴要注意自己的p...

xu一直在路上
2018/07/16
0
0
YAML、YML在线编辑器(格式化校验)解析工具-toolfk.com

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
2018/11/07
0
0
使用JS创建条形码在线生成工具-toolfk.com

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
2018/11/03
0
0
JavaScript实现在线Markdown编辑器、转换HTML工具-toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
2018/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

二进制位操作

单片机,或者一些模块的设置操作,都是由一个字节数据来完成,每位各有定义。就需进行位操作来组合需要的数字结果。 以JavaScript为例,编写位操作。 我们期望得到这样一个二进制数:0101101...

format
14分钟前
2
0
聊聊中国的通信行业:从“七国八制”到“中华”脊梁

本期文章和大家一起来聊一聊我曾经从事过的通信行业吧。最近各方面信息的泛滥,包括和华为的同学聊天,自己确实也感慨颇多。想想我自己本科主修通信工程,研究生再修信息与通信工程,从本科开...

CodeSheep
今天
5
0
MDK:ARM M451M:exceed the range of code meory, continue to erase or not?

问题: 代码空间超限 几天前就遇到:exceed the range of code meory, continue to erase or not? 如下所示: 解决过程 开始以为中MDK软件的128KB限制,如是就不能生成HEX文件,应该链接时有提...

SamXIAO
今天
1
1
OSChina 周六乱弹 —— 因违反《中华人民共和国治安管理处罚法》第四十四条之规定

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :#今日歌曲推荐# 惊艳分享谷微的单曲《安守本份》(@网易云音乐) 《安守本份》- 谷微 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
456
10
Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部