文档章节

【Python】 AES 加密

ok嘣
 ok嘣
发布于 2017/06/03 18:43
字数 672
阅读 85
收藏 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嘣
粉丝 4
博文 125
码字总数 57888
作品 0
海淀
私信 提问
勒索软件加密方式

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

Alyoyojie
2017/03/02
0
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
84
0
AES加解密算法

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

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

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

摩卡王伟
2013/06/24
3.7K
1
AES和ECC的混合加密

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

wesk痕
2016/10/17
117
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
今天
5
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
3
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
4
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部