文档章节

【Python】 AES 加密

ok嘣
 ok嘣
发布于 2017/06/03 18:43
字数 672
阅读 51
收藏 0
点赞 0
评论 0

工具:

  • crypto python 提供的加密库

  • python 2.7.10

本文采用 AES 对文件进行加密,采用CBC模式

因为 AES 是块加密,每 16 字节进行一次加密

采用 lambda 实现对文件分块,不足 16 字节 的用 空格补齐。

代码如下:

#! -*- coding:utf-8 -*-
from Crypto.Cipher import AES
import random
import string
from Crypto import Random
import binascii
import sys
import re
from binascii import b2a_hex, a2b_hex  


PADDING = '\0'   
pad_it = lambda s: s+(16 - len(s)%16)*PADDING

# iv 是AES加密的初始密钥向量 key 是密钥 
# 加密函数
def string_normal(s,key,iv):
        s = pad_it(s)
        cryptor = AES.new(key,AES.MODE_CBC,iv)
        sum = ''
# 加密的内容必须是16的倍数,如果不是就用pad_it() 函数补全
        for ii in range(len(s)/16):
            sum = sum + b2a_hex(cryptor.encrypt(s[ii*16:ii*16+16]))
#因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
#所以这里统一把加密后的字符串转化为16进制字符串
        return sum

# 解密
def decrypt(text,key,iv):  
    cryptor = AES.new(key,AES.MODE_CBC, iv)  
#将 16进制字符串转化为二进制字符串再进行解密
    plain_text  = cryptor.decrypt(a2b_hex(text))  
    return plain_text

由于采用的是 生成的密钥是 16 位,所以采用随机生成 16 位的密钥信息, 代码如下:

    """
    生成长度16的随机数密码
    """
    def gen_random_key(length):
        # 随机出数字的个数
        numOfNum = random.randint(1,length-1)
        numOfLetter = length - numOfNum

        # 选中numOfNum个数字
        selectNum = [random.choice(string.digits) for i in range(numOfNum)]

        # 选中numOfLetter个字母
        selectLetter = [random.choice(string.ascii_letters) for i in range(numOfLetter)]

        # 打乱这个组合
        slcChar = selectNum + selectLetter
        random.shuffle(slcChar)
        # 生成密码
        genKey = ''.join([i for i in slcChar])
        return genKey

使用 python 加密 ,java 解密代码如下:

package com.ben.restjpademo;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.util.ArrayList;

import javax.annotation.Resource;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;

import sun.misc.BASE64Decoder;

import com.ben.restjpademo.dao.JobRepository;
import com.ben.restjpademo.dao.JobspiderReposity;
import com.ben.restjpademo.dao.KeymngRepository;
import com.ben.restjpademo.domain.Job;
import com.ben.restjpademo.domain.Keymng;

import javax.xml.bind.DatatypeConverter;

public class TestHadoop {	
	/*
	 *  20170601 读取hadoop中的文件
	 */
	@Test
	public void getfile() throws IOException{
		String uri = "hdfs://192.168.17.30:9000";
		Configuration config = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri),config);
		
		// 列出 hdfs 上的 /source 目录下的所有文件和目录
		FileStatus[] statuses = fs.listStatus(new Path("/source"));
		for(FileStatus status : statuses){
			System.out.println(status);
		}
		
		// 显示在 hdfs 上/source下指定文件的内容
		OutputStream os = new ByteArrayOutputStream();
		
		String content = "";
		
		InputStream is = fs.open(new Path("/source/www.sina.com.cn/www.sina.com.cn.txt"));
		IOUtils.copyBytes(is,os,1024, true);
		
		content = os.toString();
		byte[] b = content.getBytes();
                # 将 python 加密的 16 进制字符串转化为 2 进制
		byte[] bytes = DatatypeConverter.parseHexBinary(content);
		System.out.println("加密文件:");
		System.out.println(content.length());	
		System.out.println(bytes);
		this.padding(bytes);
	}
	  
	
	public void padding(byte[] s){
		String key = "XCwX56kd6AYAhnlc";
		String iv = "KnYpyHyGJtR5nFkx";
		try{		
                       Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
                       SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
                        IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
                        cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
                        byte[] original = cipher.doFinal(s);
                        String originalString = new String(original);
            
                        System.out.println("解密文件:");
                        System.out.println(originalString);
        	        FileOutputStream out = null;
                        try{
    			    out = new FileOutputStream(new File("E:/storge.html")); 
    			    out.write(originalString.getBytes());
    			    out.close();
    		        }catch(IOException e){
    			    e.printStackTrace();
    		        }

		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

© 著作权归作者所有

共有 人打赏支持
ok嘣
粉丝 3
博文 115
码字总数 54790
作品 0
海淀
勒索软件加密方式

勒索软件的加密方式 spora勒索软件加密方式 以上加密方式的说明: 1 RSA 加密方式为非对称加密,需要公钥和私钥各不相同。AES对称加密,加密解密使用同一个密钥。 2 spora勒索软件, 产生一对...

Alyoyojie ⋅ 2017/03/02 ⋅ 0

用openssl对文件加密及解密

Openssl是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:密码算法库、应用程序、SSL协议库。Openssl实现了SSL协议所需要的大多数算法。 下面我将单介绍使用Openssl进行文件的对称...

独钓渔 ⋅ 2014/07/24 ⋅ 0

服务端与客户端加密解密思路

服务端与客户端加密解密思路 我的参考 我的理解 我的参考 源码编码 文档思路 我的理解 AES 对称加密,即加密解密使用共同的key AES是DES的升级版 RSA 非对称加密,即加密解密使用一对不同的key...

Juzhang ⋅ 2015/07/23 ⋅ 0

QT历程(一):与CryptoJs对应的AES加密

目的: 使用QT进行AES加密,能用CryptoJs进行AES解密。 说明: CryptoJs使用的AES加密文件为 aes.js 网上QT常用的AES加密方式 1. Crypto++库 2. Qca库 3. Botan库 4. 网友贡献的AES加密代码 ...

jiuyuehe ⋅ 2016/05/31 ⋅ 0

AES加解密算法

前言 在很多项目中,对于安全性的要求是很高的,这就涉及到了各种加密,解密算法,常见的算法有MD5加密、DES加解密、字符串加解密、AES加解密等,下面来一起看一下AES加解密算法。 正文 AES(...

zt15732625878 ⋅ 2017/12/24 ⋅ 0

自己写的AES加密工具类的加密结果为什么与在线AES加密网站的加密结果不一致?

我写了一个AES加密工具类,对明文进行AES加密,相关参数如下: 加密算法:AES 明文:A 算法模式:CBC 密钥长度:256 密钥:1qaz@WSX1qaz@WSX 密钥偏移量:1234567890123456 补码方式:PKCS7...

摩卡王伟 ⋅ 2013/06/24 ⋅ 1

AES和ECC的混合加密

在上面对AES加密的初步认知中,我们知道AES加密需要一个key,加减密双方都需要知道,那这个key怎么设定好?看一下下面的一种场景:在社交的APP中,一般对聊天内容都会是加密的,A和B聊天,A...

wesk痕 ⋅ 2016/10/17 ⋅ 0

app后端如何保证通讯安全--aes对称加密 

app后端如何保证通讯安全--aes对称加密 在上文《16.app后端如何保证通讯安全--url签名》提到,url签名有两个缺点,这两个缺点,如果使用对称加密方法的话,则完全可以避免这两个缺点。在本文...

法斗斗 ⋅ 2016/05/31 ⋅ 0

冬日/AesEncrypt

#AesEncrypt:Aes加密/解密示例项目   附件中的“AesEncrypt.zip”是本项目的exe文件,可直接下载下来运行和查看。   高级加密标准(英语:Advanced Encryption Standard,缩写:AES),...

冬日 ⋅ 2016/08/05 ⋅ 0

AES在线加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各种加密

一、AES在线加密解密:AES 128/192/256位CBC/CFB/ECB/OFB/PCBC在线加密解密|在线工具|在线助手|在线生成|在线制作 http://www.it399.com/aes 支持以下128,192,256数据块加密解密,CBC,CFB...

陈首映 ⋅ 05/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 38分钟前 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 7

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部